2011-04-06 59 views
7

我一直在使用Mark Russinovich的VMMap來映射出我正在分析的一個進程的虛擬內存。使用VirtualQueryEx,我可以遍歷外部進程的空間,並獲取進程地址空間內存區域的信息。當然,這些區域與VMMap相匹配,但VirtualQueryEx只會告訴我內存是否已提交/保留/釋放以及是否爲private/shared/image。VMMap如何知道給定的內存區域是Thread Stack,具體是什麼?

我找不到任何其他記錄的方式來查詢進程虛擬內存。 VMMap似乎知道一種查詢內存的方式,以便了解它是「私有數據」還是「線程堆棧」。 VirtualQueryEx將這兩者都標記爲MEM_PRIVATE。那麼VMMap如何做出這種區分呢?

是否有另一個API函數可以用來辨別這些細節?

+0

您可以嘗試http://stackoverflow.com/questions/3918375/how-to-get-thread-stack-information-on-windows – Adam 2016-05-30 12:20:47

回答

6

馬克Russinovich從不分享他的祕密,他有很多。我想它可以從無證的線程環境塊中找到,儘管我沒有看到很好的候選人。更好的領導可能是頁面屬性。它使用MEM_TOP_DOWN,只有堆棧有(檢查VirtualAlloc)。並且與警衛頁面的組合,即脫離StackOverflowException的頁面將使其完全無歧義。無論如何,我都會這樣做。

+0

同意。我刪除了一個幾乎相同的答案,我剛剛輸入完畢。 :) – 2011-04-06 21:01:49

+0

如何查詢內存塊的頁面屬性? – 2011-04-06 21:52:54

+0

沒有看VirtualAlloc()和朋友嗎?使用VirtualQuery()。 – 2011-04-06 22:00:49

0

我懷疑它只是去尋找所有的TEBs。請記住,ProcExp有一個收集大量數據的內核模式驅動程序。從EPROCESS中,ThreadListHead讓你找到所有的ETHREAD/KTHREAD,而KTHREAD具有TEB的地址。