【问题标题】:C# (MSIL) into native X86 code?将 C# (MSIL) 转换为原生 X86 代码?
【发布时间】:2012-10-18 18:01:10
【问题描述】:

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

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

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

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

  1. 我发布的链接有帮助吗?

  2. 有什么东西可以将 MSIL 转换为 x86 程序集吗?

【问题讨论】:

  • 你问的任务很复杂,你没有给出你的推理。如果您提供有关原因的更多详细信息,则可以提供替代解决方案,可能涉及非基于代码的解决方案。
  • 回答一个问题,ilasm 不会将 IL 编译为本机代码;它将以文本形式写入的 IL 编译为 IL 字节码。

标签: c# assembly compilation x86 cil


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我建议尝试了解 CLR 的工作原理以及 JIT 的工作原理的最佳来源是查看 SSCLI - 基于 ECMA-335 规范的 CLR 实现。

    【讨论】:

    • 我确切地知道“为什么”我想要。我也知道 JIT 的工作,以及为什么使用它。正如我在我的问题中明确指出的那样“我有自己的理由想要这个”。一个简单的事实是我不希望我的程序集成为 MSIL。
    • 祝你好运!我所能推荐的是,如果它与安全相关(你不希望能够反编译),你应该只用非托管语言实现部分关键代码(或整个代码)。
    • @LandinMartens 您能向我们解释一下您的原因吗?这可能有助于我们更好地回答您的问题。
    【解决方案3】:

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

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

    Here is a link on NGEN 包含有关图像存储位置的信息:C:\windows\assembly\NativeImages_CLR_Bit 例如C:\windows\assembly\NativeImages_v2.0.50727_86。请注意,.NET 3.0 和 3.5 都是 2.0 的一部分。

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 2018-03-30
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多