2010-02-20 71 views
2

我正在嘗試使用ReadProcessMemory()API函數讀取控制檯程序的進程內存。正在讀取進程內存

更新的代碼:

HWND hWnd = FindWindow(NULL, "Read Memory Window"); 
    DWORD ProcessId; 
    ProcessId = GetProcessId(hWnd); 
    GetWindowThreadProcessId(hWnd, &ProcessId); 
    HANDLE hProcess = OpenProcess(PROCESS_VM_READ,FALSE, ProcessId); 

    SIZE_T NumberOfBytesRead; 
    CHAR Buffer[128] = {0}; 
    dwAddr = 0x0012FD6C; //address of array to get 
    BOOL sucess = ReadProcessMemory(hProcess, &dwAddr, &Buffer, 128, &NumberOfBytesRead); 

我得到空和垃圾值作爲我的程序讀取陣列沿運行程序。

+0

哪裏是打開的代碼hProcess?你確定它成功了嗎? 您確定該地址在目標進程中包含有效數據嗎? – 2010-02-20 03:20:08

+0

是的,我從窗口句柄中得到一個有效的進程ID – cpx 2010-02-20 03:33:30

+0

NumberOfBytesRead返回值爲128. – cpx 2010-02-20 03:39:55

回答

3

您使用的是固定地址,這通常是一個非常糟糕的主意,甚至更多的是,現在Windows Vista和Windows 7使用ASLR,這使得即使不固定的模塊也不安全(即使沒有ASLR也是不安全的,因爲圖像可以因各種原因重新分配)。

此外,該地址看起來非常狡猾,你是如何得到該地址?並且它是否被正確調整爲虛擬地址而不是相對地址?

最後,也是最重要的是,你不應該傳遞的地址,當你做緩衝,應該通過像這樣:

BOOL sucess = ReadProcessMemory(hProcess, (LPVOID)dwAddr, &Buffer[0], 128, &NumberOfBytesRead); 

BOOL sucess = ReadProcessMemory(hProcess, (LPVOID)dwAddr, Buffer, 128, &NumberOfBytesRead); 
+0

使用LPVOID來轉換DWORD dwAddr有幫助,實際上當我試圖讀取進程中的數據時,我試圖將數組更改爲整數類型int Buffer [128]。所以我犯了一個錯誤,在ReadProcessMemory()的第四級中,要讀取的字節數應該是128 * 4 = 512字節。 – cpx 2010-02-20 09:04:28