c# - JIT 编译后如何(以及在何处)加载本机代码?
问题描述
我有一个应用程序,用 .net(C#,64 位)编写,我还有一个 DLL(用 C++ 编写),我想在运行时加载它并从主应用程序(从 DLL 中)调用特定函数。为此,我必须找到这个 .net 应用程序的本机代码并声明一个指向该函数的函数指针。
现在,我已经浏览了 PE 标头和元数据,找到了想要的函数的 RVA,但是它让我得到了 IL(字节码)实现而不是本机实现(在运行时调用)。经过一些调试后,我设法找到了函数的本机(ASM)代码,映射在 64 位地址空间中,我可以从 DLL 调用它,但我不知道如何动态找到这个函数(每次 IL 代码通过 JITC 运行后)。
有什么方法可以获取有关 JITC 如何/在内存中加载本机代码的信息?我在 PE 标头中找不到与此相关的任何内容。
解决方案
经过一番研究,我发现ICorDebugFunction::GetNativeCode将返回 JIT 函数的地址(假设它已被编译)。设法让它通过管道服务器工作。
对于任何试图完成与我类似的事情的人,您可能想研究对象在内存中的处理方式(我想它可能会因编译器/.net 框架而有所不同),它们似乎都有指向表的指针包含带有 RID 的 JIT(成员)函数地址(也可以在 PE 标头中找到)。
推荐阅读
- php - 按平均评级显示来自 mysql db 的项目 - php
- google-cloud-firestore - Firestore 安全规则:权限不足
- git - 为 git 子模块更新指定 autocrlf
- php - 如何在 Symfony 4 中初始化我的数据表?
- c# - 使用 C# 编辑 XML 文件
- python - 通过具有身份验证的代理的 Python 电报机器人
- nat - 网络地址转换如何影响网络上的计算机?
- python - 在python Dataframes中,如何将与其他数据框中的单行相关的多行添加为附加列?
- javascript - Vue Material - 触发 MdTableAlternateHeader 可见性
- angular - 我无法使用 Angular2 将 Excel 文件发送到服务器