2010-07-18 43 views
2

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

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

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

在此先感谢!

回答

0

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

2

我发现限制这种软件通常会在晚些时候出现,并且会让你咬人。寻找一种以“防呆”方式实施它的方法往往被低估,并且也可能会无意中最终令恼人的合法客户瘫痪产品。更好的做法是提供良好的支持,并频繁更新。任何保护都可以规避,所以我不会在这方面花费太多时间。

+0

虽然我回答为OP问及我必须同意安德斯。我们有一个商业SAN只因许可USB密钥失败而失败。当然,我们手边没有更换钥匙。 – 2010-07-19 11:42:13

1

您显然不能只读取序列号并将其与已知的良好值进行比较 - 找到并删除这些值是微不足道的。

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

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