因此,我正在为 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/