3

我首先想说我的目标是将 MSIL 转换为原生 X86 代码。我对我的程序集仍然需要安装 .net 框架感到满意。NGEN 不是我想要的,因为您仍然需要原始程序集。

我遇到了ilasm,我想知道这就是我想要的,这会成为纯汇编代码吗?

我看过其他项目,比如 mono(它不支持我的应用程序使用的一些关键功能)和 .net 链接器,但它们很简单,只是用 .net 框架制作了一个 EXE,这不是我想要的。

到目前为止,任何研究都提出了......你做不到。我真的不知道为什么 JIT 在加载 MSIL 程序集时会这样做。我有自己想要这个的理由,所以我想我的问题归结为这个。

  1. 无论如何,我发布的链接有用吗?

  2. 有什么东西可以把 MSIL 变成 x86 程序集吗?

4

3 回答 3

3

有各种可用的第三方代码保护包通过加密 IL 并使用仅在运行时解包的特殊引导加载程序将其打包来隐藏 IL。如果您担心代码的反汇编,这可能是一个选择,尽管大多数这些第三方软件包也已经被破解(不幸的是,有点不可避免。)假设这是您的基本目标,简单的混淆最终可能同样有效.

与“预抖动”IL 相关的主要挑战之一是您最终会在本机代码中包含固定地址引用。当本地代码被加载以在 CLR 下执行时,这些反过来需要“重新基于”。这意味着您需要的不仅仅是编译的逻辑;您还需要在加载代码时重新定位固定引用所需的所有引用上下文信息。它不仅仅是缓存代码。

于 2012-10-19T00:19:11.147 回答
2

与大多数事情一样,第一个问题应该是为什么而不是如何。我假设您有一个特定的目标,如果您想自己生成本机代码(另外,为什么是 x86?为什么不也是 x64?)。这是 JIT 编译器的工作——仅在需要时在特定平台上编译优化的指令集,然后再执行。

我可以推荐尝试了解 CLR 如何工作以及 JIT 如何工作的最佳资源是查看SSCLI——基于 ECMA-335 规范的 CLR 实现。

于 2012-10-18T18:09:13.947 回答
0

您是否考虑过不使用 C#?鉴于 C# 编译器的输出是 MSIL,如果这不是您想要的,那么在不同的平台上进行开发是有意义的。

或者,听起来 NGEN 执行您想要的操作,它只是不处理将整个事情放入可执行文件中。您可以分析生成的 NGEN 图像以确定需要做什么来完成此操作(请注意,NGENed 图像是文档中的 PE 文件)

这是 NGEN 上的一个链接,其中包含有关图像存储位置的信息:C:\windows\assembly\NativeImages_CLR_Bit例如C:\windows\assembly\NativeImages_v2.0.50727_86. 请注意,.NET 3.0 和 3.5 都是 2.0 的一部分。

于 2012-10-18T23:59:47.247 回答