.NET反编译,有多容易?

时间:2008-11-05 14:34:15

标签: .net decompiling copy-protection

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

实际上,有人会如何做到这一点?所以他们有我的.dll,他们必须以某种方式反编译,然后注释掉函数调用以检查许可证,然后重新编译它?反编译器必须非常好,以便代码仍然可以编译!

9 个答案:

答案 0 :(得分:29)

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

一旦黑客在代码中找到正确的位置,他们就可以使用ildasm / ilasm的组合来删除应用程序中的检查 - 即使代码Reflector生成也不会编译。

答案 1 :(得分:14)

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

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

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

有一些对策,比如使用代码混淆器来使您的代码几乎无法读取。

关于这个主题,StackOverflow还有一些其他有趣的问题:

来自Reflector的

屏幕截图:

alt text

答案 2 :(得分:5)

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

答案 3 :(得分:2)

.NET非常容易反编译。混淆将使得理解正在发生的事情变得有点困难,但是如果他们持续存在,那么反编译代码的人仍然可以弄明白。

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

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

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

答案 4 :(得分:2)

一般来说,.NET编译非常简单:要亲自了解一下,只需抓取.NET Reflector的副本并尝试一下。

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

保护自己免受这种情况的影响会导致收益迅速下降:始终会聪明地绕过您添加到代码中的任何额外检查。例如,您可以在代码中添加数字签名,并拒绝运行签名不匹配(表示代码已被篡改,例如删除许可证检查)。

然后游戏将删除签名检查(除了许可证密钥检查)。因此,您添加另一个检查,然后可以绕过,等等,无限制。

整个行业都有code obfuscatationcopy protection工具来帮助您保护软件免受此类问题的影响。由您自行决定是否值得购买这些解决方案,以及您是否会为合法客户带来的烦恼......

答案 5 :(得分:2)

如果这是你想要防御的东西,你可能想要了解如何攻击它。

Exploiting Software作者:Greg Holland& Gary McGraw是一个很好的介绍。

答案 6 :(得分:2)

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

Eric Sink写了一篇关于这一点的好文章,请参阅"4. Don't Annoy Honest People""Tenets of Transparency"部分

答案 7 :(得分:1)

即使没有Reflector,人们已经这么做了很久。基本上你用调试器观看应用程序 - 像WinDBG那样 - 然后找出许可证检查何时发生。您可以观察返回值,然后只需修补应用程序即可直接跳转到“全部好”检查。

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

您不必重新编译应用程序来修补它 - 那里存在大量的二进制修补程序工具。如果有足够的钱,它就不会阻止你最坚定的破解者。

答案 8 :(得分:1)

“太”

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

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

如果你想避免网络连接(某些用途或用户可能会发现有问题/有问题取决于应用程序除非你描述并提供价值的东西)然后将一些程序拆分成本机dll或两个并且具有在应用程序的所有部分进行许可证检查,而在原生dll中显然不那么明显,这可能足以阻止大部分内容。