Неверный адрес перехвата IAT.

Я пытаюсь найти запись для wglGetProcAddress (OpenGl32.dll), импортированную в тестовом приложении. По какой-то причине импорт с именем «wglGetProcAddress» указывает на ту же функцию, которая возвращается при вызове GetModuleHandle и GetProcAddress для Opengl32.dll.

Исполняемый файл был загружен в память и представляет собой процесс, поток которого в настоящее время приостановлен. Следующий код правильно считывает модули имен и их функции, импортированные этим исполняемым файлом. Следовательно, IAT не должен содержать RVA, так как он был загружен.

HMODULE h = GetModuleHandle("OPENGL32.dll");
DWORD expect_addr = (DWORD)GetProcAddress(h, "wglGetProcAddress");

PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)(pmem + import_dir);
while (import_desc->Name)
{
    PIMAGE_THUNK_DATA thunk = (PIMAGE_THUNK_DATA)(pmem + import_desc->OriginalFirstThunk);
    while (thunk->u1.Function)
    {
        PIMAGE_IMPORT_BY_NAME import = (PIMAGE_IMPORT_BY_NAME)(pmem + thunk->u1.AddressOfData);

        printf("%s 0x%X\n", import->Name, thunk->u1.Function);
        if ((DWORD)expect_addr == (DWORD)thunk->u1.Function)
        {
            printf("Found wglGetProcAddress\n");
        }
        else if (!strcmp((const char*)import->Name, "wglGetProcAddress"))
        {
            printf("Found wglGetProcAddress's import, but the function has a different value.\n");
        }
        ++thunk;
    }

    ++import_desc;
}

GetProcAddress из этого исходного значения возвращает адрес 60XXC245, где XX варьируется, но thunk->u1.Function всегда возвращает 0xA46D8. Все в thunk->u1 (Function, AddressOfData, Ordinal и ForwarderString) имеет такое же значение. Имена дескрипторов импорта и импорта правильные.Кто-нибудь видит, что мне не хватает?

Редактировать: Я пытаюсь сделать что-то еще: я сканирую pmem (образ исполняемого файла в памяти) на предмет того, что, как я ожидаю, является записью IAT, но она также не находит ее:

HMODULE h = GetModuleHandle("OPENGL32.dll");
DWORD expect_addr = (DWORD)GetProcAddress(h, "wglGetProcAddress");

printf("Looking for 0x%X\n", expect_addr);
for (int i = 0; i < pmem_size - sizeof(DWORD); i++)
{
    if (*(DWORD*)(pmem + i) == expect_addr)
    {
        printf("0x%X at 0x%X\n", *(DWORD*)(pmem + i), i);
    }
}

РЕШЕНО: Я не реализовать это, но вызов CreateProcess с CREATE_SUSPENDED не позволяет загрузчику Windows заполнить FirstThunk фактическими адресами. Если я позволю процессу запуститься на секунду, а затем приостановлю поток, он отлично перехватит адрес IAT. Теперь я должен пойти искать способ исправить это.

5
задан Dmi 15 March 2012 в 01:47
поделиться