2013-01-06 51 views
2

前一段時間,我在C#中創建了一個內存掃描器,它可以讀取進程的內存並查找特定值(例如每次出現整數42的位置)。從那以後,我重新審視了這個項目,並試圖將其設計爲64位系統。我遇到的問題是64位進程被授予高達8TB的虛擬內存(與32位系統上的低至2-4GB相比)!至少對於我的代碼來說,在任何合理的時間範圍內掃描0-8TB範圍內的每個地址都是不可能的。以64位掃描內存?

我試着在Process.MainModule.BaseAddress開始我的掃描,但我不知道停止閱讀的地方,我肯定缺少重要的值。如何縮小範圍以便我可以掃描過程實際使用的範圍?

+4

您需要獲取進程的內存映射。搜索「進程內存映射」,這應該讓你開始。 –

+0

我搜索了進程內存映射和類似的術語,但我能找到的所有解釋是如何分頁和虛擬內存的工作。這是有用的信息,但沒有真正指出如何實現創建或如何查看外部進程的內存映射。然而,這確實使我研究了探索流程虛擬內存的其他方法。 – user1881066

+0

掃描調用'VirtualQueryEx'的地址空間是如何構建一個進程內存映射。 –

回答

2

我最終確定了使用VirtualQueryEx庫方法正在使用哪些內存段或虛擬頁面。我使用這個功能來創建我自己的「內存映射」,並確定使用和可訪問的頁面。 Pinvoke在這裏有一個很好的例子:PInvoke Article

通過查看標記爲MEM_COMMIT的虛擬內存部分並檢查以確保權限不包括PAGE_GUARD,我能夠找到必要的塊的內存相關且可讀。

+0

你可以添加一些示例代碼,然後接受你自己的答案? :) – Orwellophile