我可以在虚拟内存中找到.Net JIT编译的x86代码

时间:2015-07-08 10:40:51

标签: .net clr jit ryujit

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用debugger api来阅读流程中的jitted指令。 (具体而言,ICorDebugFunction::GetNativeCodeICorDebugCode2::GetCodeChunksICorDebugProcess::ReadMemory)的组合。

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