首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取当前映像基址

获取当前映像基址
EN

Stack Overflow用户
提问于 2017-02-09 08:00:08
回答 1查看 1.7K关注 0票数 3

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

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

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

我已经考虑过获取镜像基地址并添加它。根据this thread的说法,这应该可以通过GetModuleHandle(NULL)实现,但结果是“错误的”。只有当我从.map文件中定义的RVA中减去函数中的指针时,我才会得到一个好的结果。

是否有WINAPI可以将RVA转换为物理地址,或者获取镜像基址,或者获取物理地址的RVA?

下面是一些示例代码:

代码语言:javascript
复制
#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)似乎是不正确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-10 19:03:45

要获得映像库而不直接在编译时预定义入口点,可以从当前VA开始对齐eax@1000h并循环,直到在当前内存页中找到有效的PE签名'MZ‘。

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

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42125878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档