Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取当前映像基址_C++_C_Windows_Visual Studio_Winapi - Fatal编程技术网

C++ 获取当前映像基址

C++ 获取当前映像基址,c++,c,windows,visual-studio,winapi,C++,C,Windows,Visual Studio,Winapi,我进行了一些计算以获得相对虚拟地址(RVA) 我计算了一个正确的RVA(根据.map文件),并希望将其转换为一个可调用的函数指针 有没有办法将其转换为物理地址 我考虑过把图像的基址加上去。根据需要,可以通过GetModuleHandle(NULL),但结果是“错误的”。只有当我从.map文件中定义的函数的RVA中减去一个指针时,我才会得到一个好结果 是否有WINAPI将RVA转换为物理地址,或获取映像基址,或获取物理地址的RVA 下面是一些示例代码: #include <stdio.h&g

我进行了一些计算以获得相对虚拟地址(RVA)

我计算了一个正确的RVA(根据
.map
文件),并希望将其转换为一个可调用的函数指针

有没有办法将其转换为物理地址

我考虑过把图像的基址加上去。根据需要,可以通过
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;
}
#包括
#包括
#包括
静态整数计数=0;
void reference()//根据.map RVA=0x00401000
{
}
void toCall()//根据.map RVA=0x00401030
{
printf(“称为%d\n”,++计数);
}
int main()
{
typedef void(*fnct_t)();
fnct_t fnct;
fnct=(fnct_t)(0x00401030+((内部)参考)-0x00401000);
fnct();//有效
fnct=(fnct_t)(0x00401030+((int)GetModuleHandle(NULL))-0x00400000);
fnct();//通常有效
返回0;
}

我主要担心的是,有时(可能在线程上下文中)
GetModuleHandle(NULL)
似乎是不正确的。

要获得映像库,而不必在编译时直接预定义入口点,一个简单的对齐搜索eax@1000h从当前VA开始循环,直到在当前内存页中找到有效的PE签名“MZ”

假设基址没有重新定位到另一个PE映像中。我为您准备了一个函数:

DWORD FindImageBase() {
    DWORD* VA = (DWORD *) &FindImageBase, ImageBase;
    __asm {
            mov eax, VA
            and eax, 0FFFF0000h
        search:
            cmp word ptr [eax], 0x5a4d
            je stop
            sub eax, 00010000h
            jmp search
        stop:
            mov [ImageBase], 0
            mov [ImageBase], eax
    }
    return ImageBase;
}

GetModuleHandle(NULL),但结果是“错误的”。
-你的意思是什么<代码>物理地址-您是指虚拟地址(VA)
VA==ImageBase+RVA
发布代码。物理地址与驱动程序相关。您可以使用虚拟地址。你的意思是绝对的而不是物理的吗?可能,我的意思是“能够从函数指针调用它的正确级别”,是虚拟地址吗?为什么是
mov[ImageBase],0
之前的
mov[ImageBase],eax