如何避免.NET DLL文件被反汇编?

时间:2009-12-01 11:47:25

标签: c#

我正在编写一个.NET应用程序(Windows类库)来实现我们产品的许可。

问题是,MSIL反汇编程序或任何其他第三方工具都可以轻松地反汇编DLL,并且很容易破坏代码。

我甚至尝试过签署程序集,但仍然可以将其拆解。

那么我该如何防止这种情况呢?

有没有可用的工具?

5 个答案:

答案 0 :(得分:8)

查看this问题的答案 您无法实现完全保护,但是您可以通过使人们更难以成功的方式来阻止拆卸。还有更多方法可以做到这一点,其中一些方法在我上面链接的问题答案中有详细说明:

  • 模糊您的代码。
  • 使用公钥/私钥或非对称加密生成产品许可证密钥。
  • 使用打包程序将.NET可执行文件打包到加密的w32包装器应用程序中。

我要添加的是增量更新,包括核心功能和保护代码,因此您的用户将不断受益于新功能,同时让破解者在破解软件方面落后于您。如果您的发布速度超过了破解和分发软件的速度,那么您将获益匪浅。合法用户将始终拥有技术支持和关于新功能的说法。它们是你最好的市场,因为那些破解你软件的人无论如何都不会为它付钱。

答案 1 :(得分:4)

你不能,但你可以使用obfuscator,这样你的代码就无法理解了。

例如,请查看Dotfuscator

此程序的社区版包含在Visual Studio中。

答案 2 :(得分:3)

.NET有一个名为SuppressIldasmAttribute的属性,可防止反汇编代码。例如,请考虑以下代码:

using System;
using System.Text;
using System.Runtime.CompilerServices;

[assembly: SuppressIldasmAttribute()]

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world...");
        }
    }
}

正如您所看到的,只有两点不同:

  1. 我们添加了System.Runtime.CompilerServices命名空间decleration。
  2. 我们添加了[assembly: SuppressIldasmAttribute()]属性。
  3. 在Visual Studio中构建应用程序后,当我们尝试在ILDASM中打开生成的EXE文件时,现在我们收到错误消息。

答案 3 :(得分:2)

为.NET框架编写的任何内容都需要反汇编。你不能阻止它。

有一些混淆工具可用于更改变量名称并将其他“噪音”插入IL,例如Dotfuscator

如果绝对需要许可您的产品,您可能需要考虑使用许可库采用另一种方法,即使用除.NET之外的其他方法。

答案 4 :(得分:0)

如上所述,在选定的答案中,没有真正的完全证明方法来保护您的代码。 即使是像c ++这样的东西,如果您的应用程序代码在您的客户手中:例如 - 他们可以物理访问二进制文件,那么该应用程序可能会被反汇编。

解决方案是保留您获得许可的功能,可能想要拆解它的人无法接触,让他们使用它,但不要让他们持有它。

考虑使用:

  1. 网络服务 保持您的可销售内容服务器端,超出客户的范围。他们可以使用它,但不会检查代码。
  2. 加密二进制文件和在线二进制文件 甚至可能将加密格式的程序集流式传输到包装器应用程序。保持解密密钥服务器端以防止脱机反汇编。但是,如果有人找到了一种从应用程序的应用程序域导出程序集的方法,一旦加载它就可以避免这种情况。 (您无法加载加密的二进制文件,因此最终用户可能会等到您的应用程序完成解密工作,然后利用它来导出已完成的二进制文件)(我正在调查实现此目的的方法(导出) - 我没有&# 39; t得到它的工作,并不意味着别人不会)
  3. 唯一需要记住的是,任何代码,无论代码编码如何,如果它位于用户系统上都是易受攻击的。当你在系统上放置二进制文件时,你必须承担最坏的情况。一个非常有才华的工程师可以反汇编任何dll,无论是c ++还是c#。