2

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

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

什么是保护我的代码免受逆向工程的好方法(最好是“简单”)?是否有可能我可以使用不同的 API(除了 setupapi)来解决这个问题?

提前致谢!

4

3 回答 3

2

我发现像这样的限制软件通常会在以后出现并咬你。寻找以“万无一失”的方式实现它的方法的工作往往被低估,并且最终也可能无意中削弱产品,从而惹恼合法客户。最好提供良好的支持并经常更新。任何保护都可以绕过,所以我不会花太多时间在这上面。

于 2010-07-18T10:44:17.460 回答
1

您显然不能只读取序列号并与已知的良好值进行比较——这很容易找到和删除。

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

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

于 2010-07-19T14:27:41.460 回答
0

在我看来,这对你来说不容易,对第三者来说很难。id 检查太容易被发现和禁用。我会尝试将一些重要的、难以计算的 DLL 计算移到外部设备中。

于 2010-07-18T10:38:39.453 回答