【问题标题】:Where in the Virtual Memory can I find x86 code compiled by .Net JIT在虚拟内存中哪里可以找到 .Net JIT 编译的 x86 代码
【发布时间】:2015-09-26 05:19:55
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么需要内存位置?为什么不查看 Visual Studio 中的 Dissasembly 窗口?
  • 删除对[Java]的引用,因为这个问题是关于.NET的
  • 这通常是不可能的,地址是高度随机的,从不重复。反恶意软件功能。只有剖析器有机会。避免问 XY 问题,“分析”没有任何意义,实际上在这种情况下是必不可少的。
  • @YuvalItzchakov 如果我能得到整个 exe 的 x86 反汇编,那就足够了,但我需要在没有人工干预的情况下完成它。这是因为我将在沙盒中运行它,其中包含几个 .net 文件并比较它们的 x86 汇编代码。是否可以使用包括 Visual Studio 在内的任何工具自动获取 x86 反汇编?
  • @HansPassan 实际上我需要查看 JIT 编译后生成的 x86 汇编指令。这是为了找到多个 .net exe 之间的相似性。直接查看 .net IL 的挑战在于它可能被打包或混淆,在这种情况下,即使它们在内部相似,它们也可能看起来不同。但是在 JIT 编译之后,它们的 x86 指令看起来很相似,即使它们之前被打包或混淆了

标签: .net clr jit ryujit


【解决方案1】:

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

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

【讨论】:

  • 我刚刚开始遵循这种方法,所以不知道我是否会成功。但看起来这真的可以为我完成这项工作。非常感谢。
猜你喜欢
  • 2011-03-18
  • 2015-03-23
  • 2011-03-13
  • 1970-01-01
  • 2020-04-25
  • 2014-07-20
  • 2015-08-28
  • 2022-10-07
  • 2011-01-10
相关资源
最近更新 更多