【问题标题】:How can I protect my .NET assemblies from decompilation?如何保护我的 .NET 程序集免受反编译?
【发布时间】:2011-01-29 12:16:21
【问题描述】:

如果我开始使用 C# 时学到的第一件事是最重要的。您可以使用 Reflector 或其他工具反编译任何 .NET 程序集。许多开发人员没有意识到这一事实,当我向他们展示他们的源代码时,他们中的大多数人都感到震惊。

防止反编译仍然是一项艰巨的任务。我仍在寻找一种快速、简单和安全的方法来做到这一点。我不想混淆我的代码,所以我的方法名称将是 a、b、c 左右。反射器或其他工具应该根本无法将我的应用程序识别为 .NET 程序集。我已经知道一些工具,但它们非常昂贵。还有其他方法可以保护我的应用程序吗?

编辑:

我的问题不是为了防止盗版。我只想阻止竞争对手阅读我的代码。我知道他们会而且他们已经做到了。他们甚至这样告诉我。 也许我有点偏执,但阅读我的代码的商业竞争对手并没有让我感觉良好。

【问题讨论】:

  • 如果反射器无法判断您的应用程序是否是 .NET 程序集,那么应用程序如何尝试加载它应该这样做?
  • Re“我不想混淆我的代码,所以我的方法名称将是 a、b、c 左右。”为什么不?这是显而易见的事情,可以让竞争对手更难理解你的逻辑。
  • 是的,混淆 100%“有效”。首先,您不应该将“秘密”放入代码中,“一旦在代码中发现会危及安全性”的东西。其次,您是否曾经在 GitHub 上获取代码并尝试重新利用它?我的意思是,由于使用的范式、类耦合、模糊的类职责、依赖项、回调项等,即使是非混淆代码也可能无法重新调整用途。这意味着,您的混淆代码是完全安全的,直到我们让机器人程序员能够理解编程逻辑并快速重写/重构代码,这不会很快发生。

标签: c# .net decompiling reflector


【解决方案1】:

要记住的一件事是,您希望以具有商业意义的方式执行此操作。为此,您需要定义目标。那么,你的目标到底是什么?

防止盗版?这个目标是无法实现的。甚至原生代码也可以被反编译或破解;在线提供的大量warez(甚至对于Windows和Photoshop等产品)证明了一个坚定的黑客总能获得访问权限。

如果你不能阻止盗版,那么仅仅减少它怎么样?这也是误导。只需一个人破解您的代码,所有人都可以使用它。你必须每次都很幸运。海盗只需要幸运一次。

我告诉你目标应该是最大化利润。你似乎认为阻止盗版对于这项努力是必要的。它不是。利润只是收入减去成本。 制止盗版会增加成本。这需要付出努力,这意味着在过程中的某处增加成本,从而减少等式的那一侧。 保护您的产品也无法增加您的收入。我知道您查看了所有这些盗版者,并看到如果他们支付您的许可费,您可以赚到的钱,但事实是,这将 永远不会发生。这里有些夸张,但通常认为无法破解您的安全的盗版者会找到他们可以破解或没有的类似产品。他们将永远改为购买它,因此他们确实代表销售损失。

此外,保护您的产品实际上会减少收入。有两个原因。一种是一小部分客户对您的激活或安全性有疑问,因此决定不再购买或要求退款。另一个是在购买之前实际尝试盗版软件以确保其正常工作的一小部分人。限制您的产品的盗版分发(如果您能够以某种方式在这方面取得成功)可以防止这些人尝试您的产品,因此他们永远不会购买它。此外,盗版还可以帮助您的产品传播给更广泛的受众,从而吸引更多愿意为此付费的人。

更好的策略是假设您的产品会被盗版,然后想办法利用这种情况。关于该主题的更多链接:
How do i prevent my code from being stolen?
Securing a .NET Application

【讨论】:

  • 主要目标不是防止盗版。目的是防止竞争对手阅读我的代码。我知道他们会这样做,他们已经这样做了。
  • 如果这是您的目标,那么混淆器就足够了。
  • 我不会说,如果某些软件无法破解,盗版者会never 购买任何许可证。这不是 100% 正确的。我见过有人说I'm not gonna buy it that soft/game, can't afford, blah blah,然后在发现破解版已过时、被病毒感染或不允许他们访问某些在线功能后购买。
  • 保护您的产品无助于增加收入?你在哪里支持这一说法的硬数据?这不是我认识的任何软件销售商的经验。事实上,在很长一段时间内情况正好相反。保护您的产品会降低收入?不,这与我认识的卖家的经验不符。我听说过很多这样的说法,但我认为它们一定是由没有尝试过这两种方式的人提出的。要么是这样,要么他们与我认识的人销售他们的商品所处的行业非常不同。
  • -1 恕我直言,这不是问题的答案。还有,假的,除非软件很便宜——用户多,买家少。即便是对盗版设置部分障碍也能获得利润的净赢是因为有很多潜在客户如果可以免费获得东西就不会费心购买,但对安装盗版软件也犹豫不决(病毒风险,不便的更新)。根据我的经验,下载破解软件的人通常不是潜在客户,因为他们愿意承担风险而不是花钱。潜在客户下载正版试用版
【解决方案2】:

除了这里列出的第三方产品之外,还有另一个产品:NetLib Encryptionizer。然而,它的工作方式与混淆器不同。混淆器使用内置的反混淆“引擎”修改程序集本身。 Encryptionizer 在文件级别加密 DLL(托管或非托管)。因此它不会修改 DLL,除非对其进行加密。在这种情况下,“引擎”是位于应用程序和操作系统之间的内核模式驱动程序。 (免责声明:我来自NetLib Security

【讨论】:

    【解决方案3】:

    我知道这是旧的,但Themida 是我用过的最先进的反破解软件。
    不过,它不是免费的。

    【讨论】:

      【解决方案4】:

      没有任何混淆器可以保护您的应用程序,甚至这里描述的任何一个都不能。看这个链接,它是一个去混淆器,可以去混淆几乎所有的混淆器。

      https://github.com/0xd4d/de4dot

      可以帮助您的最佳方法(但请记住,他们也不是完整的教授)是使用混合代码,用非托管语言编码您的重要代码,并使用 C 或 C++ 制作一个 DLL,然后使用 Armageddon 保护它们或Themida。 Themida 并不适合所有破解者,它是市场上最好的保护器之一,它还可以保护您的 .NET 软件。

      【讨论】:

        【解决方案5】:

        你有 API 吗?

        与其尝试在您的所有客户设备上保护您的一种产品中的一个 ddl 文件,不如为您宝贵的产品功能创建一个 API 服务?让保存在设备上的实际产品使用该 API 来交付您想要的产品。

        我认为这样你就可以 100% 确定你的代码没有被反编译,并且你在你的 API 中设置了你自己的限制,这样开发人员/黑客就不会以你不想要的方式使用你的 API。

        当然还有一些工作要做,但最终,一切尽在掌握。

        【讨论】:

          【解决方案6】:

          我知道您不想混淆,但也许您应该查看dotfuscator,它会获取您编译的程序集并为您混淆它们。我认为它甚至可以加密它们。

          【讨论】:

            【解决方案7】:

            在任何云服务提供商中托管您的服务。

            【讨论】:

              【解决方案8】:

              如果有人不得不窃取您的代码,这可能意味着您的商业模式行不通。我的意思是什么?例如,我购买了您的产品,然后寻求支持。您太忙或认为我的请求无效,浪费您的时间。我解码您的产品以支持我的相关业务。你的产品对我来说变得更有价值,我会优先考虑我的时间,以解决利用你的产品的商业模式。我重新编码并重新命名您的产品,然后出去赚您决定留在桌子上的钱。保护代码是有原因的,但很可能您是从错误的角度看待问题。你当然是。你是“编码员”,我是商人。 ;-) 干杯!

              ps。我也是开发人员。即“编码器”

              【讨论】:

              • 可能是现有产品的竞争对手试图将您的功能添加到他们的产品中。
              【解决方案9】:

              How to preventing decompilation of any C# application

              几乎描述了整个情况。

              在某些时候,必须将代码转换为 VM 字节码,然后用户才能得到它。

              机器代码也没有太大的不同。像IDA Pro 这样的优秀交互式反汇编器/调试器几乎可以使任何本机应用程序变得透明。调试器足够智能,可以使用 AI 来识别常见的 API、编译器优化等。它允许用户从机器代码生成的程序集中精心重建更高级别的构造。

              而且IDA Pro也在一定程度上支持.Net。

              老实说,在从事逆向工程(为了兼容性)项目几年之后,我从我的经验中得到的主要信息是,我可能不应该太担心有人窃取我的代码。如果有人想要它,无论我实施什么方案,都不会很难得到它。

              【讨论】:

              • 只需要让阅读代码比编写代码更难。
              【解决方案10】:

              在这里我们使用来自 PreEmptive Solutions 的Dotfuscator

              虽然不可能保护 .NET 程序集,但我认为 100% Dotfuscator 让它变得足够困难。 我自带了很多混淆技术;

              跨程序集重命名
              重命名方案
              重命名前缀
              增强型过载感应
              增量混淆
              HTML 重命名报告
              控制流
              字符串加密

              事实证明,对于小公司来说,它们并不是很贵。他们对小公司有特殊的定价。

              (不,我不为 PreEmptive 工作;-))

              当然有freeware 替代方案;

              【讨论】:

              • 我也用这个。非常好的软件,尽管它有一些(对我而言)无用的功能,例如使您的程序过期的功能或通过电子邮件向您报告异常的功能。但是重命名和逻辑流程非常好,我认为任何人在通过这个程序运行良好后都无法真正阅读您的代码。
              【解决方案11】:

              我们使用{SmartAssembly} 为企业级分布式应用程序提供 .NET 保护,它对我们非常有效。

              【讨论】:

                【解决方案12】:

                如果您想完全保护您的应用免受反编译,请查看 Aladdin 的 Hasp。您可以将程序集包装在只能由您的应用程序访问的加密外壳中。当然有人想知道他们是如何做到这一点的,但它确实有效。但是我不知道它们是否可以保护您的应用程序免受运行时附件/反射的影响,而这正是 Crack.NET 能够做到的。

                -- 编辑 还要小心将编译为原生代码作为解决方案...也有原生代码的反编译器。

                【讨论】:

                  【解决方案13】:

                  我听说过一些将 IL 直接编译为本机代码的项目。 你可以从这篇文章中获得一些额外的信息: Is it possible to compile .NET IL code to machine code?

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2012-07-27
                    • 1970-01-01
                    • 2012-12-16
                    • 2012-06-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多