Неправильные данные в PEB
Пытаюсь прочесть экспорты из dll, загруженной в мой процесс, через Process Environment Block. При чтении обнаруживается, что в LDR_DATA_TABLE_ENTRY.DllBase находится неправильный адрес.
// get export directory via PE parsing
bool get_export_directory(void* base, IMAGE_EXPORT_DIRECTORY** buf) {
IMAGE_DOS_HEADER* dos = (IMAGE_DOS_HEADER*)base;
IMAGE_NT_HEADERS* nt = (IMAGE_NT_HEADERS*)(dos + dos->e_lfanew); // ERROR HERE (dos - указатель на неинициализированную память)
*buf = (IMAGE_EXPORT_DIRECTORY*)((char*)base + nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
return true;
}
int main() {
const wchar_t* module_name = L"ntdll.dll";
TEB* teb = get_teb();
PEB* peb = teb->ProcessEnvironmentBlock;
if (!teb || !peb) return 1;
LDR_DATA_TABLE_ENTRY* ntdll = (LDR_DATA_TABLE_ENTRY*)(peb->Ldr->InMemoryOrderModuleList.Flink);
while (ntdll->FullDllName.Buffer && wcscmp(module_name, ntdll->FullDllName.Buffer)) {
ntdll = (LDR_DATA_TABLE_ENTRY*)(((LIST_ENTRY*)ntdll)->Flink);
}
if (!ntdll->FullDllName.Buffer || wcscmp(module_name, ntdll->FullDllName.Buffer)) return 2;
IMAGE_EXPORT_DIRECTORY* ntdll_export;
if (!get_export_directory(ntdll->DllBase, &ntdll_export)) return 3;
return 0;
}