簡體   English   中英

ReadProcessMemory()對於靜態地址返回0

[英]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添加到地址列表中。 然后右鍵單擊它,然后按“查找對該地址的訪問權限”,即可突然讀取它。 啟用S​​eDebugPrivelege不會執行任何操作。

動態地址可以正常讀取,而無需調試privelege(只要我手動為其輸入地址或作弊引擎對地址進行調試,以便可以讀取靜態地址)

它的結構是這樣的:

靜態地址指向我嘗試讀取的地址,除非見上文,否則返回0作為“新地址”。

動態地址,其中包含我嘗試讀取的值。 如果我手動定義動態地址,這看起來很好。 但是,如果我不這樣做,則因為new_address為0,否則它將失敗,除非見上文。

編輯5

最終我發現了問題,以前的地址是錯誤的。 該地址是作弊引擎的一部分,實際地址為0x013CD878,偏移量為0x4B0。 這就是為什么除非我對其進行調試,否則它不起作用的原因。

但我希望其他人能從我的錯誤中學到東西:P

您不是從其他地址閱讀嗎? address != new_address (void*)address是您開始讀取的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM