2016-07-12 4 views
0

Я пытаюсь получить свой собственный PEB и получить свой собственный адрес модуля. я написал простой код, как это:PEB (Process Environment Block) недействительный адрес DllBase

PLIST_ENTRY myModule = (PLIST_ENTRY)pebLdr->InMemoryOrderModuleList.Flink; 

PLDR_DATA_TABLE_ENTRY myImageBase = (PLDR_DATA_TABLE_ENTRY)myModule; 

PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)myImageBase->DllBase; 

Но я не вижу правильный заголовок PE в dosHeader. Это то, что я вижу в отладчике MSVC в переменной dosHeader: e_magic=???,e_cblp=???. Почему я не могу получить свой собственный заголовок? Я проверил все, я сделал все, как задокументировано, и я могу видеть свое имя exe в pData->FullDllName, все кажется правильным, и DllBase имеет смысл его не нуль или что-то вроде ffffff. Есть ли какая-то конкретная вещь, которую нужно делать пчелам, возможно, расчет адреса?

+0

Скорее всего, 'myImageBase' не инициализирован правильно. Проверьте 'myImageBase-> FullDllName', содержит ли оно допустимое имя модуля? Также возможно, что ваш SDK слишком старый, поэтому «PLDR_DATA_TABLE_ENTRY» были изменены, и вы читаете с использованием неправильного смещения. – Ari0nhh

+0

@ Ari0nhh я проверил, и я вижу, что 'myImageBase-> FullDllName' имеет мое действительное имя exe. – Vlad

+0

Почему вы используете этот низкоуровневый трюк, вместо того, чтобы использовать вызов более высокого уровня, например ['NtQueryInformationProcess()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280 .aspx)? Установка 'ProcessInformationClass' в' ProcessBasicInformation' * * извлекает указатель на структуру PEB ... * " –

ответ

3

Вы не можете сделать

PLDR_DATA_TABLE_ENTRY myImageBase = (PLDR_DATA_TABLE_ENTRY)myModule; 

InMemoryOrderLinks, поскольку это не первое поле в LDR_DATA_TABLE_ENTRY. Вместо этого вы должны включать CONTAINING_RECORD() макрос:

PLIST_ENTRY le = (PLIST_ENTRY)pebLdr->InMemoryOrderModuleList.Flink; 
PLDR_DATA_TABLE_ENTRY mainModule = CONTAINING_RECORD(le, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks); 
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)mainModule->DllBase; 

В довершении вы можете свободно перебирать двусвязный циклический список LIST_ENTRY «эс и получить фактические данные узла следует использовать CONTAINING_RECORD(). Обратите внимание: этот узел, который находится в PEB_LDR_DATA, выделен и не имеет связанных данных. Вы должны использовать его только как знак того, что вы прошли весь список.

+0

Но я получаю первое поле здесь 'PLIST_ENTRY myModule = (PLIST_ENTRY) pebLdr-> InMemoryOrderModuleList.Flink;' 'pebLdr' уже указывает на' PEB_LDR_DATA' – Vlad

+0

Да, эта строка верна. – Sergio

+0

И ваш 'myModule' - это просто указатель на' LIST_ENTRY' и ничего больше. И этот 'LIST_ENTRY' является полем« InMemoryOrderLinks »в' LDR_DATA_TABLE_ENTRY'. Перед использованием вы должны настроить указатель на то, чтобы указать структуру окружения. Немного docs: https://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx – Sergio

 Смежные вопросы

  • Нет связанных вопросов^_^