【问题标题】:.NET decompilation, how easy is it?.NET反编译,有多容易?
【发布时间】:2010-09-20 21:16:52
【问题描述】:

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

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

【问题讨论】:

    标签: .net decompiling copy-protection


    【解决方案1】:

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

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

    【讨论】:

    • 拉斯穆斯,我不确定我是否理解。使用 ildasm/ilasm 将如何删除检查,它会改变原来的 .dll 还是创建一个新的?
    • 它允许您反编译程序集,编辑 IL 调用并重新编译它。同样,您可以在 IDA Pro 之类的工具中打开应用程序,遵循程序逻辑(在反射器的帮助下推测)并稍微翻转以禁用许可证保护。
    • 因此,我们基本上将进入验证许可证密钥 IsValid() 的代码,并简单地使其始终返回 true,而不管许可证是什么。
    • 试图击败饼干是行不通的,他们每次都会赢。您只想赢得与普通人/休闲用户的竞争。软件行业早就知道了
    【解决方案2】:

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

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

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

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

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

    Reflector 的截图:

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        .NET 非常容易反编译。混淆会让人更难理解发生了什么,但是如果它们是持久的,反编译你的代码的人仍然可以弄清楚。

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

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

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

        【讨论】:

        • 是的,我也被最后一行弄糊涂了......我被告知饼干一般不能跳
        【解决方案5】:

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

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

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

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

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

              【讨论】:

                【解决方案9】:

                “太”

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

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

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

                【讨论】:

                  猜你喜欢
                  • 2010-10-14
                  • 1970-01-01
                  • 2012-07-27
                  • 2012-09-09
                  • 1970-01-01
                  • 2019-03-06
                  • 1970-01-01
                  • 2023-03-25
                  • 2014-06-26
                  相关资源
                  最近更新 更多