【发布时间】:2015-01-03 03:10:43
【问题描述】:
因此,我正在为 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);
当蜘蛛纸牌打开并且我刚刚找到静态值时,这可以正常工作。 但是当我关闭它并重新打开它时它不再有效。
我发现1000157F78实际上是SpiderSolitaire.exe+B5F78,就像一个偏移量。如果我在作弊引擎中输入它,我会得到正确的内存地址,但我不能简单地在我的代码中输入它。
现在我的问题是:如何将SpiderSolitaire.exe+B5F78 转换为正确的内存地址?
注意:SpiderSolitaire.exe 是 64 位的。
编辑: 我尝试了以下方法:
void * entryPoint = (void*) hProc;
DWORD base_addr = ((DWORD)(entryPoint) + 0xB5F78);
但这不起作用,因为入口点是5C。它应该给出的地址(在这个会话中)是FF7A5F78,但真正发生的是5C + B5F78 = B5F4D。
【问题讨论】:
-
地址空间随机化:en.wikipedia.org/wiki/…
-
这是系统特定的。您没有说明系统(某些 M$ 系统除外)。版本? 64位? 32 位?
-
好点,@user3344003。我在 Windows 7 64 位上。
-
@user:这不是系统特定的。确定模块基地址所需的 API 调用适用于所有受支持的 Windows 版本,并且它们的使用方式相同。
标签: c++ winapi pointers memory reverse-engineering