获取当前映像基址
Get current Image Base address
我做了一些计算来得到一个相对虚拟地址(RVA(。
我计算了一个正确的 RVA(根据 .map
文件(,我想将其转换为可调用的函数指针。
有没有办法将其转换为物理地址?
我想过获取图像基址并添加它。根据这个线程,应该可以通过 GetModuleHandle(NULL)
,但结果是"错误的"。只有当我从 .map
文件中定义的函数中减去指针时,我才会得到一个好的结果。
是否有 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 %dn", ++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并循环直到在当前内存页面中找到有效的 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;
}
相关文章:
- SDL 映像:无法打开映像,仅显示错误消息
- C++ W:使用子线程的运行映像
- 从头开始为应用程序创建 docker 映像是否有意义?
- 主机箱/bash 未执行 docker 映像
- 无法从Java读取C++中保存的Opencv Mat映像
- CMake链接库在Docker映像中失败
- 在.NET Core 3.1中运行托管C++/CLI程序集时,映像格式错误
- 如何在C++中使用ZeroMQ通信多个映像
- 无法写入映像 SimpleElastix (Python)
- 如何在 windowsservercore Docker 映像上安装执行本机C++ DLL/EXE 所需的所有依赖二进制
- 无法将映像加载到 SDL2 程序
- 从 docker 映像构建中省略安装文件
- 使用 OpenGL 中的 imageStore 写入映像
- QML 映像不会在映像源中加载具有非 ASCII 字符的图像
- 警告在将 OpenCV 垫映像投射到 QImage 时使用旧式转换
- 在控制台上显示 BMP 映像时堆损坏
- 处理映像上的多个转换
- 获取当前映像基址
- 如何使用C++从Windows映像组件(WIC)获取错误消息
- 获取存储在blob中的MySQL映像大小