我试图做的是读取一个静态地址,该地址指向一个具有一定价值的动态地址。但是,如果我尝试读取静态地址,它总是返回 0。读取它的唯一方法是在作弊引擎中将调试器附加到动态地址。但是,我只从动态地址读取它没有问题。
DWORD address = 0x74EA46D8;
int value = 0;
int new_address = 0;
DWORD pid;
HWND hwnd;
hwnd = FindWindow(NULL,L"HackMe.exe");
if(!hwnd) {
cout <<"Window not found!\n";
cin.get();
} else {
GetWindowThreadProcessId(hwnd,&pid);
HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);
if(!phandle) {
cout <<"Could not get handle!\n";
cin.get();
} else {
while(1) {
ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
cout << new_address << "\n"; //Always print 0
//int new_address = 0x2ECA40B0; //This works if I uncomment this
ReadProcessMemory(phandle,(void*)new_address,&value,sizeof(value),0);
我什至尝试获得调试权限,但这并没有做任何事情。我不知道问题是什么,因为我对 C++ 很陌生。任何帮助表示赞赏。
谢谢你。
编辑
GetLastError() 首先返回 0,然后返回 299
编辑 2
BOOL x = ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
cout << x << " " << GetLastError() << "\n";
返回
1 0
1 299
1 299
1 299
等等
编辑 3 字节读取为 4。
编辑 4
只是为了澄清。
使用 ReadProcessMemory() 直接从 0x74EA46D8 读取返回 0。
如果我打开作弊引擎并将地址 0x74EA46D8 指向地址列表。然后右键单击它并按“找出访问此地址的内容”它可以一下子被读取。启用 SeDebugPrivelege 什么都不做。
动态地址可以正常读取,无需调试权限(只要我手动输入地址或作弊引擎调试地址以便读取静态地址)
它的结构是这样的:
指向我尝试读取的地址的静态地址,除非见上文,否则返回 0 作为“新地址”。
动态地址,包含我要读取的值。如果我手动定义动态地址,这会很好。但如果我不这样做,它会失败,因为 new_address 为 0,除非见上文。
编辑 5
终于发现问题了,之前的地址写错了。该地址是作弊引擎的一部分,真实地址是 0x013CD878,偏移量为 0x4B0。这就是为什么除非我调试它,否则它不起作用的原因。
但我希望其他人能从我的错误中吸取教训:P