【发布时间】:2017-02-09 00:00:08
【问题描述】:
我做了一些计算得到一个相对虚拟地址(RVA)。
我计算了一个正确的 RVA(根据 .map 文件)并且我想将它转换为一个可调用的函数指针。
有没有办法把它翻译成物理地址?
我想到了获取图像基地址并添加它。根据this thread,应该可以通过GetModuleHandle(NULL),但结果是“错误的”。只有当我从 .map 文件中定义的函数的 RVA 中减去一个函数的指针时,我才会得到一个好的结果。
是否有 WINAPI 可以将 RVA 转换为物理地址,或者获取图像基地址,或者获取物理地址的 RVA?
下面是一些示例代码:
#include <stdio.h>
#include <Windows.h>
#include <WinNT.h>
static int count = 0;
void reference() // According to .map RVA = 0x00401000
{
}
void toCall() // According to .map RVA = 0x00401030
{
printf("Called %d\n", ++count);
}
int main()
{
typedef void (*fnct_t)();
fnct_t fnct;
fnct = (fnct_t) (0x00401030 + (((int) reference) - 0x00401000));
fnct(); // works
fnct = (fnct_t) (0x00401030 + ((int) GetModuleHandle(NULL)) - 0x00400000);
fnct(); // often works
return 0;
}
我主要担心的是,有时(可能在线程上下文中)GetModuleHandle(NULL) 似乎不正确。
【问题讨论】:
-
GetModuleHandle(NULL) but the result is "wrong".- 你是什么意思?physical address- 你的意思是 虚拟地址 (VA) ?VA== ImageBase + RVA -
发布您的代码。
-
物理地址与驱动程序相关。您使用虚拟地址。你的意思是绝对的而不是物理的?
-
大概,我的意思是“能够从函数指针调用它的正确级别”,是虚拟地址吗?
标签: c++ c windows visual-studio winapi