Вопрос в следующем. Есть полный дамп физической памяти системы. Есть значения регистров, eax, ebx и компании, также Cr3, Gdtr, Ldtr и компании на момент создания дампа. Хочу по дампу памяти перечислить все активные процессы в системе, т.е UCHAR ImageFileName[16] из структуры EPROCESS, a по LIST_ENTRY ActiveProcessLinks переходить на следующий структуры EPROCESS. Только вот как найти хотя бы одну структуру EPROCESS не могу додуматься... PS. придумал только один очень топорный метод, но я не верю что нет других методов))
Найти ядро в памяти, в нём найти переменную PsActiveProcessHead, эта двусвязанный список и пройтись по нему, типо как в PsEnumProcesses(). Это теоретически, на практике никогда из дампа эту инфу не вытягивал.
Честно говоря, не понимаю в чём проблема. Если дамп был создан самой операционной системой в виде .dmp-файла (например, при падении), тогда достаточно загрузить его в WinDbg и дать команду !process 0 0. Если дамп создан другим способом, следует для начала указать каким именно.
x64 Даже если дамп и есть не факт что виндбг его прочитает. Для процесса в контексте которого крах произошёл наиболее просто видимо определить из GDT указатель на PCR(PKPRCB = +0x124) и из него взять указатель на тред, затем из этого ETHREAD указатель на процесс.
в дамп, afaik, записываются некоторые неэкспортируемые переменные ядра. PsActiveProcessHead в том числе.
FreeX Я не понял, тебе программно чтоли это нужно сделать? Ну в чем тогда проблема, к виндбг идет хелп, где есть и апи dbgeng.dll комовские в том числе. Ну это через ком интерфейс. Либо - я даже статью писал про формат. Для быстренького выдирания нужных данных можно и вручную по дампу пройтись (в смысле, без виндбг) Clerk Даже ничего искать не придется, я писал в статье про формат дампов, что туда пишется целый блок неэкспортиуемых переменных, в том числе и она. Это ты о чем "не факт что виндбг его прочитает"?
у меня сырой дамп памяти, содержимое физ памяти как есть, и больше ничего. (не дамп, который система генерит) Вот, спасиб, так сделать получилось... Только пару вопросов осталось... где можно почитать про структуру GDT, и обязательно ли в ring0 FS = 0x3B, а в ring3 FS = 0x30?
Не обещается, что эти константы не будут меняться, но эти константы не менялись вроде бы аж до вин7. это было неочевидно из 1 поста) да хотя бы у брокен сворда на этом сайта. а лучше - в интел мануалах. первоисточник все-таки