C# JIT编译后本机代码是如何(以及在何处)加载的?

C# JIT编译后本机代码是如何(以及在何处)加载的?,c#,c++,.net,assembly,reverse-engineering,C#,C++,.net,Assembly,Reverse Engineering,我有一个应用程序,用.net(C#,64位)编写,我还有一个DLL(用C++编写),我想在运行时加载它,并从主应用程序(从DLL中)调用特定函数。为此,我必须找到这个.net应用程序的本机代码,并声明一个指向该函数的函数指针 现在,我已经浏览了PE头和元数据,找到了想要的函数的RVA,但是它让我找到了IL(字节码)实现,而不是本机实现(在运行时调用)。经过一些调试后,我设法找到了函数的本机(ASM)代码,映射到64位地址空间,我可以从DLL调用它,但我不知道如何动态地找到这个函数(每次IL代码通

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

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


有没有办法获取JITC如何/在内存中何处加载本机代码的信息?我在PE标题中找不到任何与此相关的内容。

经过一番研究,我找到了将返回JIT'ed函数地址的内容(假定它已编译)。设法通过管道服务器使其工作


对于任何试图完成类似于我的任务的人来说,您可能希望了解对象在内存中的处理方式(我想可能会有所不同,具体取决于编译器/.net framework),它们似乎都有指向包含JIT(成员)函数地址和RID的表的指针(也可以在PE标题中找到).JIT编译器通常使用write+exec权限将机器代码直接写入动态分配的内存页,并将其视为函数指针。例如,在Windows上使用
VirtualAlloc
new
+
VirtualProtect
。IDK.net专门处理使链接工作的事情,但您可能只需要在运行时找到它,而不是使用文件元数据/符号表中的任何内容。不清楚您为什么试图以错误的方式执行此操作。Google“如何从C++调用C#方法”可以有所作为。@user2864740:我正在为一个基本的.net游戏制作一个外部脚本工具(用于自动输入),因此修改.net源代码是不可取的(我也不想编辑可执行文件本身)。这意味着,我不能将程序集公开给COM,不能托管它(游戏必须运行),也不能“制作它”导出其功能。这里有一个隐藏的假设:甚至有答案吗?或者这本质上是不可预测的?例如,ASLR故意使地址随机。但即使不是故意的,任何Microsoft修补程序都可能使静态假设无效。另外,另一个假设是存在单个实现。我可以使用imaNet根据分析信息重新编译函数。我不认为这是对此的答案,但
ICorDebugFunction::GetNativeCode
实际上返回一个指向给定代码块的JIT方法的指针。如果通过管道服务器使其工作,我想这只适用于认真的调试目的但是在我找到更好的方法之前,它会一直存在。另外,似乎有某种MethodTable在编译时生成,还没有研究过,但在.net核心文档中提到过-