【发布时间】:2010-07-25 21:29:33
【问题描述】:
我想了解一下蝾螈是如何做到的? 我将包括一些我特别感兴趣的点
-
按需链接
链接器从入口方法(您可以配置)开始,并递归地遍历调用图以仅链接所需的 MSIL 代码位。未使用的代码不会链接到最终程序集中。因此,您的代码会变得更高效,文件也会变得更小。
-
链接到框架 API
链接器非常强大,甚至 Microsoft .NET Framework 程序集(例如 System.Windows.Forms.dll)也可以链接到您自己的 .NET 程序集中。由于它是按需链接,因此只会链接所需的部分。这对于保护您的代码、简单的应用程序部署以及通过调试框架代码本身来解决问题非常有用。
-
本地编译
本机编译器将所有托管程序集(包括系统程序集)转换为 x86 本机代码。不会发布 MSIL 指令,不会在运行时进行 JIT 编译。这提供了有史以来最好的反汇编和反编译保护,并且还提高了性能和启动时间。
-
无需完全安装 Microsoft .NET Framework 即可进行简单快速的部署
微型部署工具将最小的 CLR 运行时文件和依赖程序集放在一起,可以简单地复制到目标计算机上的单个文件夹中,您的应用程序就像安装了整个框架一样运行。由于安装被隔离到一个文件夹中,因此与未来的 .NET 安装不会发生冲突。当对依赖程序集使用链接时,它将进一步减小文件大小。
-
代码保护 当前的混淆器都没有解决一个问题,那就是,无论混淆有多好,代码中都会散布系统库调用和其他外部引用(见下图红色)。由于这些调用是外部引用,因此混淆器必须保持它们不变。但是,这些参考资料对理解反编译代码有很大帮助,因为它们是有据可查的公共 API。链接器通过将框架 API 链接到您自己的代码中来删除或减少此类公共 API,从而使您的代码在混淆后更难以反编译。下面显示了使用链接器之前和之后的示例 MSIL 代码。
之前:(没有混淆器能够重命名以下代码,因为它们是外部公共 API)
IL_0000: ldarg.0
IL_0001: call instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
IL_0006: ldarg.0
IL_0007: newobj instance void [System.Windows.Forms]System.Windows.Forms.TextBox::.ctor()
IL_000c: stfld class [System.Windows.Forms]System.Windows.Forms.TextBox A.A::A
IL_0011: ldarg.0
IL_0012: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox A.A::A
IL_0017: call valuetype [System.Drawing]System.Drawing.Color [System.Drawing]System.Drawing.Color::get_Cyan()
IL_001c: callvirt instance void [System.Windows.Forms]System.Windows.Forms.TextBoxBase::set_BackColor(valuetype [System.Drawing]System.Drawing.Color)
IL_0021: ldarg.0
之后:(完全不知道使用了 Windows.Forms API,黑客理解这一点的障碍很大 垃圾)
IL_0000: ldarg.0
IL_0001: call instance void a.A::.ctor()
IL_0006: ldarg.0
IL_0007: newobj instance void D.c::.ctor()
IL_000c: stfld class D.c A.A::A
IL_0011: ldarg.0
IL_0012: ldfld class f.aA.A::A
IL_0017: call valuetype a.B()
IL_001c: callvirt instance void D.c(valuetype g.e)
IL_0021: ldarg.0
其中一些事情让我感到困惑,我想知道是否有其他人知道这一切是如何运作的?
【问题讨论】:
-
很抱歉,这里几乎没有问题。这看起来真的像是蝾螈的广告。
标签: c# linker obfuscation native-code