首页 > 解决方案 > JIT 编译后如何(以及在​​何处)加载本机代码?

问题描述

我有一个应用程序,用 .net(C#,64 位)编写,我还有一个 DLL(用 C++ 编写),我想在运行时加载它并从主应用程序(从 DLL 中)调用特定函数。为此,我必须找到这个 .net 应用程序的本机代码并声明一个指向该函数的函数指针。

现在,我已经浏览了 PE 标头和元数据,找到了想要的函数的 RVA,但是它让我得到了 IL(字节码)实现而不是本机实现(在运行时调用)。经过一些调试后,我设法找到了函数的本机(ASM)代码,映射在 64 位地址空间中,我可以从 DLL 调用它,但我不知道如何动态找到这个函数(每次 IL 代码通过 JITC 运行后)。

有什么方法可以获取有关 JITC 如何/在内存中加载本机代码的信息?我在 PE 标头中找不到与此相关的任何内容。

标签: c#c++.netassemblyreverse-engineering

解决方案


经过一番研究,我发现ICorDebugFunction::GetNativeCode将返回 JIT 函数的地址(假设它已被编译)。设法让它通过管道服务器工作。

对于任何试图完成与我类似的事情的人,您可能想研究对象在内存中的处理方式(我想它可能会因编译器/.net 框架而有所不同),它们似乎都有指向表的指针包含带有 RID 的 JIT(成员)函数地址(也可以在 PE 标头中找到)。


推荐阅读