C ++中的USB串行验证

时间:2010-07-18 10:20:11

标签: c++ winapi usb verification serial-number

我有一个DLL,我打算发送给第三方,我想通过限制它仅在连接特定USB设备时运行来保护它。 我正在使用setupapi获取设备的序列号(通过调用SetupDiGetDeviceInstanceId())。

如果有人反汇编DLL,我想很难跟踪验证。 例如,可以跟踪对SetupDiGetDeviceInstanceId的简单调用,如果有人想在没有USB正确序列的情况下使用我的DLL,他可以轻松地在汇编代码中查找我的strcmp并将if(strcmp(...) == 0)更改为if(strcmp(...) == 1)

保护我的代码免受逆向工程有什么好处(最好是“简单”)方法?可能有一个不同的API(除了setupapi)我可以使用它来处理吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

我发现像这样的限制性软件通常会在以后咬你。找到以“万无一失”的方式实施它的方法的工作经常被低估,并且还可能无意中使产品最终瘫痪成为令人讨厌的合法客户。最好是提供良好的支持并经常更新。可以规避任何保护,所以我不会花太多时间在那上面。

答案 1 :(得分:1)

你显然不能只读取序列号并与已知良好值进行比较 - 这对于查找和删除来说是微不足道的。

为了使事情变得更加困难,请使用序列号的加密哈希(例如,SHA-256)来获取正确序列号的加密哈希值。确保哈希的代码是内联生成的,因此在读取序列号和基于哈希值的比较进行跳转之间会有相当大的“东西”。这不会阻止一个坚定的攻击者,但它会阻止大多数只是在调试器中浏览代码并且不愿花费大量时间进行逆向工程的人。

如果您想让事情变得更加困难,请以加密形式存储您的部分代码,并使用正确的序列号作为密钥。在运行时,读取序列号并使用它来解密代码。如果它是错误的,结果将是错误的代码,您可以按原样执行(知道它会快速崩溃和刻录),或者您可以执行某种校验和来验证结果,并且更加优雅地失败(即显示如果代码没有正确解密,则会显示错误消息。

答案 2 :(得分:0)

在我看来,这对你来说并不容易,对第三方来说也很难。很容易找到并禁用ID检查。我会尝试移动一些必要的,很难弄清楚你的DLL计算到外部设备。