如果我是一个集会,那么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?
请帮助我理解我在这里缺少的“小东西”。
答案 0 :(得分:14)
NGEN的程序集是IL plus本机代码。 IL没有被删除。 NGen程序集仅包含 原生图像,这常常令人困惑。元数据仍然需要原始信息。
微软似乎没有关于NGen程序集内部的非常具体的信息。我们知道的大多数信息来自逆向工程。
修改强>:
安装.NET Framework 1.1(yay ..)后,似乎.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代码复制为事后的想法
答案 1 :(得分:4)
如果你研究快速/简单的混淆,用C ++写一个混合模式程序集,它将是你自己程序集的引导加载程序(它将通过本机代码中的COM加载旧版.NET FW 4.0,并使用公共接口从托管部件声明,为托管程序集生成的.tlb。)作为加密资源(使用RSA)保存,并加密本机C ++代码,然后对两个程序集进行签名。这将阻止ILDASM组装仍允许您调试和构建项目(使用构建事件)