我试图做的是读取一个静态地址,它指向一个具有某些值的动态地址。但是,如果我尝试读取静态地址,它总是返回0.它被读取的唯一方法是如果我将调试器附加到作弊引擎中的动态地址。但是,我只读取动态地址来读取它并没有问题。ReadProcessMemory()为静态地址返回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);
我甚至试图得到调试privelege,但没有做任何事情。因为我对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
只是为了澄清。
直接从0x74EA46D8用ReadProcessMemory()读取,返回0。
如果我打开了作弊引擎和地址0x74EA46D8点添加到的地址列表。然后右键单击它并按“查找访问此地址的方式”,它可以突然被读取。启用SeDebugPrivelege不会执行任何操作。
动态地址可被读取为正常,而不必调试privelege(只要我手动它键入地址或欺骗发动机调试地址,以便静态地址可以被读取)
它在此结构方式:
指向我试图读取的地址的静态地址,这将返回0作为“新地址”除非见上文。
动态地址,包含我试图读取的值。如果我手动定义动态地址,这就好了。但是,如果我不这样做失败,因为new_address是0,除非见上面。
编辑5
最后我发现了这个问题,以前的地址是错误的。该地址是作弊引擎的一部分,实际地址为0x013CD878,偏移量为0x4B0。这就是为什么它不工作的原因,除非我调试它。
但我希望其他人会从我的错误中学习:P
是什么让你觉得'0x74EA46D8'是对的? –
如果我使用作弊引擎来调试它所持有的地址,它会被读取很好 – thabubble
这是x86还是x64? –