Откуда VMMap знает, что конкретная область памяти является стеком потоков, в частности?

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

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

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

2 ответа

Решение

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

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

Другие вопросы по тегам