2011-05-06 50 views
2

我一直在玩最近的內存轉儲,偶然發現了一些我並沒有完全理解的東西。通過內部/外部進程生成的不同內存轉儲

如果我有一個進程並通過使用VirtualQueryEx & ReadProcessMemory來獲取數據並將其轉儲到文件中,則轉儲它的內存內容一切正常。與此同時,我嘗試了通過在進程內部執行VirtualQuery並僅轉儲它返回的指針的內容來做同樣的事情。 我能夠通過代理我正在測試的進程的某個DLL來完成此操作。 現在,問題是這兩個內存轉儲是不同的(從進程內部創建的轉儲缺失的區域) 有人可以告訴我爲什麼會發生這種情況嗎? Windows XP SP3 + Visual Studio 2008 非常感謝。

回答

0

你需要轉儲什麼?說到進程分配的所有內存頁面,我認爲可以得到不同的值,因爲內部進程狀態(一般而言)每次都是唯一的。此外,如果您在進程外部轉儲進程的內存,那麼轉儲程序的代碼不在轉儲進程地址空間中,而如果您從進程內部轉儲進程,則此進程現在包含轉儲程序的代碼。所以,只轉儲屬於流程應用程序或DLL的一定數量的頁面可能會很有用。

+0

我試圖轉儲一切除了代碼;是的,我知道這個過程現在包括翻斗車代碼,我已經考慮到了這一點;內部和外部轉儲同步,內部區域丟失 – 2011-05-06 19:42:26

+0

您可以嘗試在轉儲之前用VirtualLock()鎖定內存嗎?你能否獲得關於錯過哪些頁面的信息? – 2011-05-06 19:51:44

+0

我的假設是線程棧頁面丟失,但我真的不知道;此外,我不會做VirtualLock(),因爲這是一款遊戲,它可能會產生...後果;在它內部運行我掛鉤了一個DLL函數;這就像我不能'看到'從鉤住內線程的一切。 – 2011-05-06 20:08:04