VMMap 如何知道给定的内存区域是线程堆栈,具体来说?

Posted

技术标签:

【中文标题】VMMap 如何知道给定的内存区域是线程堆栈,具体来说?【英文标题】:How does VMMap know a given memory region is Thread Stack, specifically? 【发布时间】:2011-07-31 03:06:22 【问题描述】:

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

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

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

【问题讨论】:

你可以试试***.com/questions/3918375/… 【参考方案1】:

Mark Russinovich 从不​​分享他的秘密,他有很多。我想它可以从未记录的线程环境块中找到,尽管我没有看到很好的候选人。更好的线索可能是页面属性。它使用 MEM_TOP_DOWN,只有堆栈有(检查 VirtualAlloc)。与保护页面的组合,即触发 ***Exception 的页面将使其完全明确。无论如何我都会这样做。

【讨论】:

同意。我删除了一个几乎相同的答案,我刚刚完成输入。 :) 如何查询一块内存的页面属性? 没看VirtualAlloc()和朋友?使用 VirtualQuery()。 VirtualQuery 只给我一个 MEMORY_BASIC_INFORMATION,它不能告诉我页面是否为 MEM_TOP_DOWN。 :( 粗鲁,不起作用。 Type & MEM_WRITE_WATCH 已打开,似乎还不够。没有想法。【参考方案2】:

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

【讨论】:

以上是关于VMMap 如何知道给定的内存区域是线程堆栈,具体来说?的主要内容,如果未能解决你的问题,请参考以下文章

如何分析进程的内存占用问题

java虚拟机:Java内存区域及对象

如何排空java线程栈内存区?

Java内存的堆栈与常量池

在JAVA中以编程方式监视JVM的堆栈区域? [复制]

未请求分配的内存