12

如果我NGen一个组件,ildasm仍然拆卸它是否正常?

行。我写了一个 HelloWorld 类库,随后的 dll 被命名为 NGenILDasmTest.dll。--> 针对 .Net fw 4。

从 Vs 2010 命令提示符,我做到了

gacutil -i NGenILDasmTest.dll

我可以看到安装在 GAC 中的程序集。我运行了 ildasm 以便查看 IL。到现在为止还挺好。

然后我跑

ngen NGenILDasmTest.dll

(我没有为 ngen 指定任何选项)。这个程序集成功编译。我在文件夹下找到了一个名为 NGenILDasmTest.ni.dll 的文件

C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9

现在,当我像下面那样运行 ildasm

ildasm "C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9\NGenILDasmTest.ni.dll"

我可以看到 Ngen-ed 程序集的内容。这是正常的吗?。

从技术上讲,Ngen 为 IL 生成本机 CPU 指令(显然将其放在 C:\windows\Assembly\NativeImages_V4.#####_32 下 - 在我的情况下)。如果是这种情况,我如何仍然能够使用 ILDasm 将 NGen-ed 程序集视为 IL?

请帮助我理解我在这里缺少的“小东西”。

4

2 回答 2

14

NGEN 的程序集是 IL 加本机代码。IL 没有被剥离。NGen 程序集仅包含本机映像常常令人困惑。元数据仍然需要原始信息。

Microsoft 似乎没有关于 NGen 程序集内部的非常具体的信息。我们知道的大多数信息来自逆向工程。

编辑

安装 .NET Framework 1.1(耶..)后 - .NET 1.1 NGen似乎确实剥离了 IL。看起来像是从 v2 开始 - 保留了 IL。这似乎就是为什么周围有相互矛盾的信息。做出这种改变的确切原因似乎并不为人所知。

这里有一篇关于 ngen 的内部结构的好文章(以及它对于混淆是一个多么糟糕的主意):http ://www.woodmann.com/forum/entry.php?68-Rebuilding-native-.NET-exes -into-managed-.NET-exes-by-Exploiting-lefotver-IL ...

现在,关于 Ngen 的有趣之处在于它不会消除 IL 或元数据,因为虽然执行不需要 IL 代码,但元数据是,因为程序需要的所有字符串和其他相关数据都包含在元数据。因此,Ngen 将所有元数据复制到本机 exe 的 .IL 部分,并在事后复制 IL 代码

于 2011-09-10T17:23:00.977 回答
4

如果您研究快速/简单的混淆,请用 C++ 编写一个混合模式程序集,这将是您自己程序集的引导加载程序(它将通过 COM 在本机代码中加载旧版 .NET FW 4.0,并使用从托管声明的公共接口部分,通过为您的托管程序集生成的 .tlb)作为加密资源(使用 RSA)保存,并加密本机 C++ 代码,然后对两个程序集进行签名。这将阻止 ILDASM 编译您的程序集,仍然允许您调试和构建项目(使用构建事件)

于 2011-09-10T18:09:32.557 回答