我在c ++中遇到了ReadProcessMemory函数的问题。实际上函数本身工作正常,但是当涉及到更大的地址时(例如,当我使用未签名的__int64而不是DWORD,因为DWORD对于Address来说太小时)该函数给了我一个错误的指针地址。以下是相关代码:
DWORD tempAddress;
unsigned __int64 potentialBasePointerAddress = 0x13F8A0000 + 0x18606B8; //I used unsigned __int64 since 0x13F8A0000 is too large for DWORD
if (ReadProcessMemory(hProcess, (LPVOID)potentialBasePointerAddress, &tempAddress, sizeof(tempAddress), NULL))
{
cout << tempAddress << endl;
}
//in this specific case the tempAddress is 1BD5679 (or 29185657) but actually it should be 3E7D4FE0 (see (*))
如果我更改DWORD tempAddress; to unsigned __int64 tempAddress; tempAddress是1953A4A0002C88A5(或18249832811198240377)
我真的不知道如何解决这个问题。我很确定有一种方法可以处理大于DWORD大小的Base Addresses,但我太傻了,无法找到...
我感谢你的每一次帮助!
答案 0 :(得分:0)
您是否将程序编译为64位二进制文件?如果您将其编译为32位,则转换为LPVOID
实际上会将指针截断为32位值,因此您只需读取错误的地址。