Неправильные данные в 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;
}

Ответы (0 шт):