2013-01-04 16 views
2

我知道Windows進程是通過加載PE頭和隨後的段(.text .data等)在RAM中映射的,並且我可以用ReadProcessMemory讀取它們,但是什麼是VirtualQueryEx?我認爲它應該一次讀取一頁(分頁系統使用的內存頁面),但我沒有看到內存頁面是如何與PE部分相關的。如果我想只掃描.text部分,我是否也應該使用VirtualQueryEx或頁面與其內容無關?VirtualQueryEx和ReadProcessMemory之間的關係

回答

8

VirtualQueryEx爲您提供有關如何分配頁面的信息,它包含的常用信息類型等信息。我在previous answer中發佈了一些演示代碼。這遍歷了一個進程,並將有關目標進程從操作系統分配的每塊內存信息都轉儲出來。

ReadProcessMemory將讓您讀取指定進程中內存塊的實際內容。要使用它,你需要在目標進程中指定一個地址 - 但它本身並不知道該進程中的地址。

如果您想在某個過程中讀取映射的可執行文件的一部分,通常會使用VirtualQueryEx來查找內存中您關心的部分已加載的內容,然後使用ReadProcessMemory讀取您關心的部分。例如,在another previous answer中,我發佈了一些代碼,用於在進程的所有頁面中搜索指定的模式,這些頁面是提交的並且是私有的或映射的。

根據你在找什麼(特別是如果你想看像目標進程中的代碼的東西),你可能想使用符號處理程序API之類的東西來找到你關心的部分。 VirtualQueryEx以相當粗的粒度查看事物 - 例如,它會告訴你整個可執行文件已映射的整個內存塊的基地址和大小,但並沒有告訴你有關內部的什麼內容(通常是大塊)。

符號處理程序API可以告訴您(例如)該可執行文件中特定函數的地址(前提是信息可用,例如包含調試信息的可執行文件或您關心從exe中導出的函數/ DLL)。

2

要確定哪個內存頁屬於內存中加載的PE的哪一部分,您必須先閱讀它的PE頭,解析它並找到.text,.code,.bss等部分。

VirtualQueryEx返回PMEMORY_BASIC_INFORMATION,其中包含有關該頁面的內存信息,如讀取,寫入,執行標誌。