Откуда VMMap знает, что данная область памяти является стеком потоков, в частности? - PullRequest
8 голосов
/ 06 апреля 2011

Я использовал VMMap Марка Руссиновича, чтобы отобразить виртуальную память для процесса, который я анализирую.Используя VirtualQueryEx, я могу обойти пространство внешнего процесса и получить информацию об областях памяти в адресном пространстве процесса.Конечно, эти регионы совпадают с VMMap, но VirtualQueryEx сообщает только, если память выделена / зарезервирована / свободна и является ли она частной / общей / образной.

Я не могу найти другие документированные способы запроса виртуальной памяти процесса.VMMap, похоже, знает способ запроса памяти таким образом, чтобы понять, являются ли они «Личными данными» или «стеком потоков».VirtualQueryEx помечает оба из них как MEM_PRIVATE.Итак, как VMMap делает это различие?

Есть ли другая функция API, которую я могу использовать для распознавания этих деталей?

Ответы [ 2 ]

7 голосов
/ 07 апреля 2011

Марк Руссинович никогда не делится своими секретами, у него много. Я думаю, что это можно найти в недокументированном блоке среды потока, хотя я не вижу хороших кандидатов. Лучшим лидером могут быть атрибуты страницы. Он использует MEM_TOP_DOWN, он есть только в стеках (проверьте VirtualAlloc). А комбинация с защитной страницей, которая отключает StackOverflowException, сделает его совершенно однозначным. Так я и сделаю.

0 голосов
/ 11 июля 2017

Я подозреваю, что это просто идет и ищет все TEB.Помните, что ProcExp имеет драйвер режима ядра, который собирает большую часть своих данных.Из EPROCESS ThreadListHead позволяет вам найти все ETHREAD / KTHREAD, а KTHREAD имеет адрес TEB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...