我一直在使用 Mark Russinovich 的 VMMap 来绘制我正在分析的进程的虚拟内存。使用 VirtualQueryEx,我可以遍历外部进程的空间并获取有关进程地址空间内的内存区域的信息。当然,这些区域与 VMMap 匹配,但 VirtualQueryEx 只告诉我内存是否已提交/保留/免费以及它是否是私有(private)/共享/镜像。
我找不到任何其他记录在案的方法来查询进程虚拟内存。 VMMap 似乎知道一种查询内存的方法,以了解它是“私有(private)数据”还是“线程堆栈”。 VirtualQueryEx 将这两个标签都标记为 MEM_PRIVATE。那么 VMMap 是如何做出这种区分的呢?
我可以使用其他 API 函数来识别这些细节吗?
最佳答案
Mark Russinovich 从不分享他的 secret ,他有很多。我想它可以从未记录的线程环境 block 中找到,尽管我没有看到很好的候选人。更好的线索可能是页面属性。它使用 MEM_TOP_DOWN,只有堆栈有(检查 VirtualAlloc)。与保护页面的组合,即触发 StackOverflowException 的页面将使其完全明确。无论如何我都会这样做。
关于windows - VMMap 如何知道给定的内存区域是线程堆栈,具体来说?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5571995/