2013-04-12 29 views
-1

我們如何讀取進程內存中的每個字節?在我們讀完之後,我們如何製作這個過程的「十六進制」轉儲?如何讀取另一個進程的內存中的每個字節?

有關示例:

過程A.exe時:

00400000: 00 00 
00400002: 74 05 
... 

掃描:

00 74 05 ... 

傾倒A.exe時到A.TXT:

00 74 05 

我編譯器是visual C++ 2010,我是pla編寫一個win32應用程序,它將使用這個函數。我將要使用的操作系統是Window 8.但是,我的應用程序應該適用於Windows 8,至少Window XP。

到目前爲止,這是我得到了什麼?

#include <windows.h> 

void ScanForBytes(const char* TargetName, DWORD dwFromAddress, DWORD dwToAddress) { 
    HANDLE hProc; // I guess we will be needing the handle to the process. 
    //And this is where I stopped and asked for help... 
} 

int main() { 
    ScanForBytes("Chrome.exe", 0x00400000, 0x00400001); 
    return 0; 
} 
+1

出於好奇心,避免不當應用程序氾濫的不可挽回的慾望,以及認真嘗試提供最佳解決方案......您是否介意與我們分享*爲什麼*您認爲您需要這樣做? –

+0

[讀取進程內存]的可能重複(http://stackoverflow.com/questions/2300894/reading-a-process-memory) – Suma

回答

2

你要找的功能是ReadProcessMemory。您可以找到該功能的文檔here on MSDN

該函數將特定進程的指定地址範圍內的數據複製到指定的緩衝區中。您需要確保您的應用程序正在以適當的權限運行。通常,這是調試權限 - 只有調試器需要讀取和/或修改其他進程的私有內存。如果您沒有指定的內存塊的整個整個所需的權限,該功能將失敗。您可以找到有關訪問權限here on MSDN的更多信息。如果您在此工作時還不熟悉安全模型,我建議您仔細閱讀文檔。

當然,您的過程也需要匹配您希望讀取的內存進程的位數。換句話說,如果您想從Chrome進程讀取內存,則Chrome將被編譯爲32位應用程序,因此您的應用程序也需要成爲一個。如果要從另一個64位應用程序轉儲內存,則需要重新編譯爲64位應用程序。這是MSDN頁面上的一些評論者絆倒了。

毫無疑問,您需要檢查所有返回值並適當地處理錯誤。這種事情應該是預計在常見條件下失敗。

一旦ReadProcessMemory成功返回,您指定的數組將包含請求的數據。從那裏開始,簡單地做任何你想做的事情,比如寫入文本文件。

相關問題