我知道Windows進程是通過加載PE頭和隨後的段(.text .data等)在RAM中映射的,並且我可以用ReadProcessMemory讀取它們,但是什麼是VirtualQueryEx?我認爲它應該一次讀取一頁(分頁系統使用的內存頁面),但我沒有看到內存頁面是如何與PE部分相關的。如果我想只掃描.text部分,我是否也應該使用VirtualQueryEx或頁面與其內容無關?VirtualQueryEx和ReadProcessMemory之間的關係
2
A
回答
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,其中包含有關該頁面的內存信息,如讀取,寫入,執行標誌。
相關問題
- 1. VirtualQueryEx/ReadProcessMemory
- 2. C++和Ruby之間的關係和依賴關係是什麼?
- 3. 谷歌分析之間的關係之間的關係
- 4. GraphViewer類和GraphEditorViewer類之間的關係
- 5. VendPackingSlipJour和GeneralJournalEntry之間的關係
- 6. Webapi,Webhost和Owin之間的關係
- 7. 在asp.net gridviews和formview之間的關係
- 8. LiquiBase,Maven和Jenkins之間的關係?
- 9. dreload()和autoreload之間的關係/區別
- 10. ejs.co和embeddedjs.com之間的關係
- 11. FHIR和openEHR之間的關係
- 12. REX OS和Brew OS之間的關係?
- 13. JPQL,Java(和Oracle DB)之間的關係
- 14. 視圖和模型之間的關係
- 15. Symfony:Bundles和Services之間的關係
- 16. 「app.config」和「user.config」文件之間的關係?
- 17. 瞭解Liskov和OCP之間的關係
- 18. 'view'和'base'關係之間的區別
- 19. django:BoundField和Form Field之間的關係?
- 20. 出口和requirejs之間的關係
- 21. GEF和GMF之間的關係?
- 22. dwPageSize和dwAllocationGranularity之間的關係
- 23. custinvoiceTrans和GeneralJournalAccountEntry之間的關係
- 24. 邊界和實體之間的關係
- 25. 表之間的基數和關係
- 26. System.Object類和Structs之間的關係
- 27. log4j和apache.commons.logging之間的關係
- 28. time.time()和file.getmtime()之間的關係?
- 29. SelectionDAG和SelectionDAGISel之間的關係
- 30. BinaryFormatter和Filestream之間的關係