c++ - 转换 "application's"内存地址

标签 c++ winapi pointers memory reverse-engineering

因此,我正在为 Microsoft 的 Spider Solitaire 编写我的第一个培训师。首先,我需要对所有内存地址进行反向工程,直到找到一个静态地址。我使用了偏移量,因此我可以轻松地将它们还原。

我发现了这个:

1000157F78  <-- starting value(never changes)
+ E8        <-- offsets to pointers
+ 14
002DC3D4    <-- final adress(changes every time)

这就是我的训练师如何获得他的最终内存地址:

DWORD FindFinalAddr(HANDLE hProc, BYTE offsets[], DWORD baseAddress, unsigned char pointerLevel)
{
    DWORD pointer = baseAddress;
    DWORD pTemp = 0;
    DWORD pointerAddr = 0;

    // set base address
    ReadProcessMemory(hProc, (LPCVOID)pointer, &pTemp, (DWORD)sizeof(pTemp), NULL);

    for (int c = 0; c < pointerLevel; c++)
    {
        pointerAddr = pTemp + (DWORD)offsets[c];
        ReadProcessMemory(hProc, (LPCVOID)pointerAddr, &pTemp, (DWORD)sizeof(pTemp), NULL);
    }

    return pointerAddr;
}

在这种情况下,我(大致)这样做:FindFinalAddr(hProc, {0xE8, 0x14}, 0x1000157F78, 2);

当 Spider Solitaire 打开并且我刚刚找到静态值时,这工作正常。 但是当我关闭它并重新打开它时,它不再有效。

我发现1000157F78其实就是SpiderSolitaire.exe+B5F78,就像一个偏移量。如果我在 Cheat Engine 中输入它,我会得到正确的内存地址,但我不能简单地在我的代码中输入它。

现在我的问题是:如何将 SpiderSolitaire.exe+B5F78 转换为正确的内存地址?

注意:SpiderSolitaire.exe 是 64 位的。

编辑: 我尝试了以下方法:

void * entryPoint = (void*) hProc;

DWORD base_addr = ((DWORD)(entryPoint) + 0xB5F78);

但这不起作用,因为入口点是5C。它应该给出的地址(在此 session 中)是 FF7A5F78,但实际发生的是 5C + B5F78 = B5F4D

最佳答案

我认为您可以使用 GetModuleInformation 查询加载地址,为模块句柄参数传递 NULL。如果这不起作用,您可以通过 EnumProcessModules 走更长的路和 GetModuleBaseName .

关于c++ - 转换 "application's"内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26782399/

相关文章:

c++ - 如何通过函数内的指针操作 char* 或 char a[]?

c - 硬盘驱动器上分区的名称和数量

c++ - 进程名称比较

C++ 指针问题

c - 解释 c 结构

C++虚方法重载/覆盖编译器错误

c++ - 根据 C++ 标准,int 变量是对象吗?

windows - 调用 FileRead 后的奇怪计数值

C++ getline 和 if/else if 语句没有按我的预期工作

c++ - GetQueuedCompletionStatus 在 UDP 套接字上无限期阻塞