[英]ReadProcessMemory() returns 0 for static addresses
我試圖做的是讀取一個靜態地址,該地址指向具有某種價值的動態地址。 但是,如果我嘗試讀取靜態地址,則它總是返回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不會執行任何操作。
動態地址可以正常讀取,而無需調試privelege(只要我手動為其輸入地址或作弊引擎對地址進行調試,以便可以讀取靜態地址)
它的結構是這樣的:
靜態地址指向我嘗試讀取的地址,除非見上文,否則返回0作為“新地址”。
動態地址,其中包含我嘗試讀取的值。 如果我手動定義動態地址,這看起來很好。 但是,如果我不這樣做,則因為new_address為0,否則它將失敗,除非見上文。
編輯5
最終我發現了問題,以前的地址是錯誤的。 該地址是作弊引擎的一部分,實際地址為0x013CD878,偏移量為0x4B0。 這就是為什么除非我對其進行調試,否則它不起作用的原因。
但我希望其他人能從我的錯誤中學到東西:P
您不是從其他地址閱讀嗎? address != new_address
。 (void*)address
是您開始讀取的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.