【发布时间】:2010-09-20 21:16:52
【问题描述】:
我正在研究应用程序许可证密钥的最佳加密方法,有人说有人可以轻松反编译应用程序,然后跳过许可证密钥的测试。
实际上,有人会怎么做呢?所以他们有我的.dll,他们必须以某种方式反编译它,然后注释掉函数调用以检查许可证,然后重新编译它?反编译器必须非常好,这样代码才能编译!
【问题讨论】:
标签: .net decompiling copy-protection
我正在研究应用程序许可证密钥的最佳加密方法,有人说有人可以轻松反编译应用程序,然后跳过许可证密钥的测试。
实际上,有人会怎么做呢?所以他们有我的.dll,他们必须以某种方式反编译它,然后注释掉函数调用以检查许可证,然后重新编译它?反编译器必须非常好,这样代码才能编译!
【问题讨论】:
标签: .net decompiling copy-protection
【讨论】:
如果源代码是正常编译的,那么反编译 .NET 程序集非常容易。
您可以使用 .NET Reflector,最初由 Lutz Roeder 开发,现在由 Redgate Software 提供支持。这个答案的底部有一个屏幕截图,让您对 Reflector 的作用有一个印象。
您可以浏览命名空间和类,并以您最喜欢的 .NET 语言查看源代码和方法。 Denis Bauer 的FileDisassembler 将允许您(或您的邪恶黑客)将其转换为 VS 解决方案并对程序进行修改。
有一些对策,例如使用 代码混淆器 使您的代码实际上不可读。
关于这个话题,StackOverflow 上还有一些其他有趣的问题:
Reflector 的截图:
【讨论】:
.NET 非常容易反编译。混淆会让人更难理解发生了什么,但是如果它们是持久的,反编译你的代码的人仍然可以弄清楚。
以下是我在网上找到的关于保护 .NET 代码的一些建议:
http://blogs.msdn.com/ericgu/archive/2004/02/24/79236.aspx
请注意,所讨论的技术都不是 100% 有效的,这只是一个问题,你会让饼干跳过多少圈。
【讨论】:
.NET 编译通常非常简单:要亲自体验一下,只需获取.NET Reflector 的副本并尝试一下。
在大多数情况下,无需重新编译代码即可删除简单的许可证检查:只需修补 MSIL 即可。
保护自己免受这种情况的影响会导致收益迅速递减:总会有足够聪明的人绕过您添加到代码中的任何额外检查。例如,您可以在您的代码中添加数字签名,并拒绝运行签名不匹配的代码(表明代码已被篡改,例如删除许可证检查)。
然后游戏变成删除签名检查(除了许可证密钥检查)。所以你添加了另一个检查,然后可以绕过它,等等,无止境。
整个行业都有 code obfuscatation 和 copy protection 工具来帮助您保护您的软件免受此类问题的影响。由您来决定是否值得您购买这些解决方案,您的额外努力以及您给合法客户带来的烦恼...
【讨论】:
如果这是您想要防御的东西,您可能需要了解如何攻击它。
Greg Holland 和 Gary McGraw 的Exploiting Software 是一个很好的介绍。
【讨论】:
最好不要过度使用许可证密钥技术。无论您做什么,都可能被坚定的用户攻击,并且您会冒更大的风险添加阻止合法用户使用您的应用程序的问题。我什至看到受Hasp Dongles 保护的代码被破解。加密您的许可证密钥并混淆您的代码应该足以阻止机会主义攻击,除此之外没有什么意义。
Eric Sink 写了一篇很好的文章涵盖了这一点,请参阅"Tenets of Transparency" 的"4. Don't Annoy Honest People" 部分
【讨论】:
即使没有 Reflector,人们也已经这样做了很久了。基本上,您使用调试器观看应用程序(WinDBG 之类的东西会这样做),然后找出许可证检查何时发生。您观察返回值,然后简单地修补应用程序以直接跳转到“一切正常”检查。
我会推荐人们在上面发布的所有内容。您只需要意识到这是一场猫捉老鼠的游戏,并且您的投资回报是否值得。如果您的用户不想玩弄系统,那么一些简单的事情可能会做。如果你有什么东西破解猖獗,那么你将不得不考虑不同的策略并从那里开始。
您不必重新编译应用程序来修补它 - 那里有很多二进制修补工具。如果有足够的钱可以赚,它也不会阻止你最坚定的饼干。
【讨论】:
“太”
任何类型的“标准”/常规许可证检查机制都是自动删除工具的目标。在我反思过的少数商业 .NET 应用程序中,这些“太琐碎”的检查似乎很常见。
最好的办法是通过使程序的一部分依赖于 Web 服务来进行保护。这不应该是太繁琐的界面以避免减慢执行速度,但它也不应该是非常厚实的,因为这些块可以在“破解版”中下载并在本地缓存,除非应用程序依赖于它们经常更改。
如果您想避免网络连接(某些用途或用户可能会发现有问题/有问题取决于应用程序,除非它是您描述并提供价值的东西)然后将一些程序拆分为一个或两个本机 dll 并拥有在应用程序的所有部分进行许可证检查,而在本机 dll 中则不太明显,这可能足以阻止大多数情况。
【讨论】: