【问题标题】:Incorporating base memory addresses in C++在 C++ 中合并基本内存地址
【发布时间】:2013-10-28 00:10:40
【问题描述】:

我在应用程序中找到的内存位置的基地址是语法"application_name.exe" + 0007856("application_name.exe" 的地址?我不确定,但这是我使用的方法:

HANDLE proc_handle = OpenProcess(//parameters go here to open the process);
void * base_add = (void*)proc_handle;    //to store the address of the process

如果该方法是正确的,我问的关于如何获取应用程序地址的第一个问题得到回答,这导致我的第二个问题:由于特定内存位置的基地址是"application_name.exe" + 0007856,我可以这样做吗?:

DWORD specific_memory_base_add = (DWORD)base_add + 0x0007856

我可以使用从"application_name.exe" 找到的地址,然后使用+ 将其添加到0x0007856 吗?我已经尝试过了,它似乎没有用。如果不正确,正确的方法是什么?

【问题讨论】:

    标签: c++ winapi base-address


    【解决方案1】:

    在另一个进程中检索模块的基地址需要枚举该进程的模块并检索模块名称以找到匹配项。

    枚举加载到进程调用EnumProcessModules 中的模块。获得模块列表后,请为每个模块调用 GetModuleBaseName 以找到您正在寻找的模块 (application_name.exe)。该模块的HMODULE 是指向模块开头的指针(在目标进程的地址空间中),它是基地址。您可以使用它来添加偏移量。

    【讨论】:

    • 我得到“对 EnumProcessModules@16 的未定义引用”。我包括了 psapi.h
    • 包括 psapi.h 是不够的。您还必须链接到 Psapi.lib。
    【解决方案2】:

    假设您正在谈论 Windows(您是否应该标记 winapi?)您可以使用 GetModuleHandle() 获取已加载模块的基地址。模块在加载之前没有基地址(尽管链接器可以指定首选基地址,但加载器不必使用/尊重它)。

    【讨论】:

    • 我上面用的方法不对吗?在我得到应用程序的地址之后,如何将其添加到 0x0007856 以获得实际的基地址?
    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多