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

Where in the Virtual Memory can I find x86 code compiled by .Net JIT

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

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

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

您可以使用 debugger api to read the jitted instructions from the process. (Specifically, a combination of ICorDebugFunction::GetNativeCode, ICorDebugCode2::GetCodeChunks and ICorDebugProcess::ReadMemory).

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