13

我正在研究应用程序许可证密钥的最佳加密方法,有人说有人可以轻松反编译应用程序,然后跳过许可证密钥的测试。

实际上,有人会怎么做呢?所以他们有我的.dll,他们必须以某种方式反编译它,然后注释掉函数调用以检查许可证,然后重新编译它?反编译器必须非常好,这样代码才能编译!

4

9 回答 9

29

尝试使用Reflector打开您的应用程序。你可能会感到惊讶:-)

一旦破解者在您的代码中找到了正确的位置,他们就可以使用ildasm / ilasm的组合从您的应用程序中删除检查 - 即使反射器生成的代码不会编译。

于 2008-11-05T14:36:00.250 回答
14

如果源代码是正常编译的,那么反编译 .NET 程序集非常容易。

您可以使用最初由 Lutz Roeder 开发的.NET Reflector,现在由 Redgate Software 支持。这个答案的底部有一个屏幕截图,让您对 Reflector 的作用有一个印象。

您可以浏览命名空间和类,并以您最喜欢的 .NET 语言查看源代码和方法。Denis Bauer 的FileDisassembler将允许您(或您的情况下的邪恶黑客)将其转换为 VS 解决方案并对程序进行修改。

有一些对策,例如使用代码混淆器使您的代码实际上不可读。

StackOverflow 上还有一些关于这个主题的有趣问题:

反射器截图:

替代文字

于 2008-11-05T14:39:02.413 回答
5

Josh Smith 最近还发布了Crack.NET,它可用于附加到正在运行的 .NET 进程,然后在Reflector中打开它——所以即使磁盘上的程序集以某种方式加密(以避免人们使用 Reflector 来获取它们) ,他们仍然可以使用内存版本

于 2008-11-05T15:14:32.263 回答
2

.NET 非常容易反编译。混淆会使人们更难理解正在发生的事情,但是反编译您的代码的人仍然可以弄清楚它们是否是持久的。

以下是我在网上找到的关于保护您的 .NET 代码的一些建议:

http://blogs.msdn.com/ericgu/archive/2004/02/24/79236.aspx

请注意,所讨论的技术都不是 100% 有效的,它只是一个问题,你会让饼干跳过多少圈。

于 2008-11-05T14:38:21.777 回答
2

.NET 编译通常非常简单:要亲自体验一下,只需获取.NET Reflector的副本并尝试一下。

在大多数情况下,无需重新编译代码即可删除简单的许可证检查:只需修补MSIL即可。

保护自己免受这种情况的影响会迅速减少回报:总会有足够聪明的人绕过你添加到代码中的任何额外检查。例如,您可以在您的代码中添加数字签名,并拒绝运行签名不匹配的代码(表明代码已被篡改,例如删除许可证检查)。

然后游戏变为删除签名检查(除了许可证密钥检查)。所以你添加另一个检查,然后可以绕过,等等,无限。

有整个行业的代码混淆复制保护工具可以帮助您保护您的软件免受此类问题的影响。由您决定是否值得购买这些解决方案,您的额外努力以及您会给合法客户带来的烦恼......

于 2008-11-05T14:46:35.910 回答
2

如果这是您要防御的东西,您可能需要阅读有关如何攻击它的信息。

Greg Holland 和 Gary McGraw 的Exploiting Software是一个很好的介绍。

于 2008-11-05T14:53:57.283 回答
2

最好不要过度使用许可证密钥技术。无论您做什么,都可能被坚定的用户攻击,并且您会面临更大的风险,即添加阻止合法用户使用您的应用程序的问题。我什至看到受Hasp Dongles保护的代码被破解。加密您的许可证密钥和混淆您的代码应该足以阻止机会主义攻击,除此之外没有什么意义。

Eric Sink写了一篇很好的文章涵盖了这一点,请参阅“透明原则”的“4. 不要惹恼诚实的人”部分

于 2008-11-05T15:36:46.633 回答
1

即使没有Reflector,人们也已经这样做了很长时间。基本上,您使用调试器观察应用程序——WinDBG 之类的东西会做——然后找出许可证检查何时发生。您观察返回值,然后简单地修补应用程序以直接跳转到“一切正常”检查。

我会推荐人们在上面发布的所有内容。您只需要意识到这是一场猫捉老鼠的游戏,并且您的投资回报是否值得。如果您的用户不想玩弄系统,那么一些简单的事情可能会做。如果你有一些东西在破解猖獗,那么你将不得不考虑不同的策略并从那里开始。

您不必重新编译应用程序来修补它 - 那里存在大量二进制修补工具。如果有足够的钱可以赚到,它也不会阻止你最坚定的饼干。

于 2008-11-05T15:55:06.003 回答
1

“也”

任何一种“标准”/通常的许可证检查机制都是自动删除工具的目标。在我反思过的少数商业 .NET 应用程序中,这些“太琐碎”的检查似乎很常见。

最好的办法是通过使程序的一部分依赖于 Web 服务来保护。这不应该是太繁琐的界面以避免减慢执行速度,但也不应该是非常厚实的,因为这些块可以在“破解版”中下载并在本地缓存,除非应用程序依赖于它们经常更改。

如果您想避免网络连接(某些用途或用户可能会根据应用程序发现有问题/有问题,除非它是您描述并提供价值的东西)然后将一些程序拆分为一个或两个本机 dll 并检查许可证应用程序的所有部分,以及在本机 dll 中不太明显的部分,可能足以阻止大多数。

于 2011-12-10T10:46:46.553 回答