VMMap如何知道给定的内存区域是Thread Stack,具体来说呢?

时间:2011-04-06 19:36:36

标签: windows winapi visual-c++ memory kernel

我一直在使用Mark Russinovich的VMMap为我正在分析的过程绘制虚拟内存。使用VirtualQueryEx,我可以走外部进程的空间,获取进程地址空间内存区域的信息。当然,这些区域与VMMap匹配,但VirtualQueryEx只告诉我内存是否已提交/保留/免费以及是否为私有/共享/映像。

我找不到任何其他记录的方法来查询进程虚拟内存。 VMMap似乎知道一种查询内存的方法,以便了解它是“私有数据”还是“线程堆栈”。 VirtualQueryEx将这两个标记为MEM_PRIVATE。那么VMMap如何做出这种区分呢?

我可以使用其他API函数来辨别这些细节吗?

2 个答案:

答案 0 :(得分:7)

Mark Russinovich从不分享他的秘密,他有很多。我想它可以从未记录的线程环境块找到,虽然我没有看到很好的候选人。页面属性可能更好。它使用MEM_TOP_DOWN,只有堆栈具有(检查VirtualAlloc)。与Guard页面的组合,使StackOverflowException跳闸的那个页面将使它完全明确。无论如何,这就是我的方式。

答案 1 :(得分:0)

我怀疑它只是去寻找所有的TEB。请记住,ProcExp有一个内核模式驱动程序,可以收集大部分数据。从EPROCESS中,ThreadListHead允许您查找所有ETHREAD / KTHREAD,KTHREAD具有TEB的地址。