我一直在使用Mark Russinovich的VMMap来映射出我正在分析的一个进程的虚拟内存。 使用VirtualQueryEx,我可以遍历外部进程的空间,并获得进程地址空间内存区域的信息。 这些区域肯定与VMMap相匹配,但是VirtualQueryEx只会告诉我内存是否被提交/保留/释放以及是否是私有/共享/映像。
我找不到任何其他logging的方式来查询进程的虚拟内存。 VMMap似乎知道这样一种方式来查询内存,以便了解它是“私有数据”还是“线程堆栈”。 VirtualQueryEx将这两个标记为MEM_PRIVATE。 那么VMMap如何做出这样的区分呢?
是否有另一个API函数可以用来辨别这些细节?
马克Russinovich从不分享他的秘密,他有很多。 我想这可以从无证的线程环境块中找到,虽然我没有看到很好的候选人。 更好的领导可能是页面属性。 它使用MEM_TOP_DOWN,只有堆栈有(检查VirtualAlloc)。 而且与警卫页面的组合,它会使StackOverflowException异常完全无歧义。 无论如何,我就是这么做的。
我怀疑它只是去寻找所有的TEBs。 请记住,ProcExp有一个收集大量数据的内核模式驱动程序。 从EPROCESS中,ThreadListHead让你找到所有的ETHREAD / KTHREAD,而KTHREAD具有TEB的地址。