1

我知道第一次调用函数时,会调用 JIT 并将 .Net IL 代码编译为 x86 指令并将其保存在内存中的某个位置。我需要知道保存此 x86 代码的位置,以便我可以分析 x86 汇编指令(目的在这个问题的上下文中并不重要。)谁能告诉我如何确定存储翻译后的代码,或者可能是 JIT 代码中的哪个函数执行此操作。我有 JIT 代码(因为 .net 源代码已在 GitHub 上发布,但到目前为止我对代码的大小感到不知所措)。我将不胜感激任何形式的帮助。提前致谢...

如果有人可以建议一个反汇编程序,它可以提供正在运行的 .net exe 的 x86 汇编指令转储,这将有所帮助,就像 Visual Studio 反汇编程序一样,但我需要自动运行它。我知道这可以由 ngen 静态完成。ngen 可以转换为 x86 指令,然后任何反汇编程序都可以获得转储,但对我来说很重要的是,这必须在 exe 运行后完成。

这是因为我需要 x86 指令转储的原因是为了找到多个 .net exe 之间的相似性。直接查看静态拆卸程序集的挑战在于它可能被打包或混淆,在这种情况下,即使它们内部相似,它们也可能看起来不同。但在运行时,它们将被打包程序解包/去混淆,JIT 编译的 x86 指令看起来很相似。

4

1 回答 1

1

您可以使用调试器 api从进程中读取 jitted 指令。(具体来说,是ICorDebugFunction::GetNativeCodeICorDebugCode2::GetCodeChunksICorDebugProcess::ReadMemory的组合)。

以这种方式做事可能需要该方法已经被 jitted ......但您可能会使用ICorDebugEval来安排它(可能在方法的开头有一个断点,然后在它被命中时中止 eval)。

于 2015-07-11T11:39:01.680 回答