1

为了练习,我试图获取某个内存地址指向的地址。我有一个工具可以显示我必须得到的结果。就我而言,它是:

"clientApp.exe"+0x11F9B08 -> 0E4C5F90

所以我假设这基本上意味着:("The base address of the .exe" + 0x11F9B08)并且指向地址0x0E4C5F90

我已经有了clientApp.exe 的基地址。我用EnumProcessModulesGetModuleFileNameEx为此。

小片段

if ( GetModuleFileNameEx( hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
{
    if(gameName.compare(szModName))
    {
        dwClientBase = (DWORD)hMods[i]; //base address
        break;
    }
}

然后稍后我试图获取指向的地址。但以下给了我一个完全不同的结果:

DWORD result = (DWORD)(dwClientBase + 0x11F9B08);

这给了我:23042824。我正在寻找:0x0E4C5F90。我想我已经接近了,但不确定接下来我可以尝试什么。

任何人都知道我应该怎么做才能获得与工具给我的结果相同的结果?

4

2 回答 2

1

您不取消引用指针。尝试任一

DWORD result = *(DWORD*)(dwClientBase + 0x11F9B08);

或者

DWORD result = *(DWORD*)(0x11F9B08);

转换为DWORD*表示编译器将数字视为指针,然后取消引用*它会导致读取实际数字。

于 2013-01-27T19:10:26.893 回答
1

什么类型dwClientBase?如果它是 aDWORD那么你应该转换为 aBYTE *然后做你的算术,确保取消引用指针以返回该地址指向的值:

DWORD result = *(DWORD *)( (BYTE *)dwClientBase + 0x11F9B08);

向指针添加数字时,编译器将添加等于该数字乘以指针类型大小的字节数。这就是为什么我们转换为BYTE *第一个,所以我们添加的正是0x11F9B08字节。

于 2013-01-27T19:16:02.837 回答