对于练习,我试图获取某个内存地址所指向的地址。我有一个 工具 ,它显示了我必须得到的结果。就我而言,它是:
"clientApp.exe"+0x11F9B08 -> 0E4C5F90
所以我假设这基本上意味着:("The base address of the .exe" + 0x11F9B08)
并指向地址0x0E4C5F90
。
我已经拥有clientApp.exe的基地址。我使用了EnumProcessModules
和GetModuleFileNameEx
。
小片段
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
。我想我很接近,但不确定我接下来会尝试什么。
任何人都知道我应该做些什么来获得与 工具 相同的结果?
答案 0 :(得分:1)
您不取消引用指针。尝试
DWORD result = *(DWORD*)(dwClientBase + 0x11F9B08);
或
DWORD result = *(DWORD*)(0x11F9B08);
转换为DWORD*
表示编译器将数字视为指针,然后取消引用*
它会导致读取实际数字。
答案 1 :(得分:1)
dwClientBase
是什么类型的?如果它是DWORD
,那么你应该转换为BYTE *
,然后进行算术运算,确保取消引用指针以返回该地址指向的值:
DWORD result = *(DWORD *)( (BYTE *)dwClientBase + 0x11F9B08);
当向指针添加数字时,编译器将添加等于数字乘以指针类型大小的字节数。这就是我们首先转换为BYTE *
的原因,因此我们只添加了0x11F9B08
个字节。