gpt4 book ai didi

c++ - 获取当前图像基地址

转载 作者:可可西里 更新时间:2023-11-01 10:33:12 29 4
gpt4 key购买 nike

我做了一些计算以获得相对虚拟地址 (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) 似乎不正确。

最佳答案

要在编译时直接预定义入口点的情况下获取镜像库,您可以执行从当前 VA 对齐 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;
}

关于c++ - 获取当前图像基地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42125878/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com