Таблица импорта (IT) против таблицы адресов импорта (IAT)

Я пытался проанализировать / отобразить информацию в таблице адресов импорта (IAT) процесса после его загрузки и запуска. Я понимаю, что вызовы API в программах переходят к соответствующей точке в IAT, которая затем переходит к фактической функции в загруженной DLL.

Верно ли, что IAT можно найти, прочитав заголовок PE и выполнив OptionalHeader.DataDirectory [1] указатель на массив IMAGE_IMPORT_DESCRIPTOR. Затем следуя указателям FirstThunk . В то время как указатели OriginalFirstThunk здесь дадут вам исходную таблицу импорта (IT)?

Я также пробовал следовать указателю OptionalHeader.DataDirectory [12] в заголовке PE, но это было еще менее успешным .

I ' Мы тестировали это, пытаясь проанализировать эту структуру для notepad.exe (32bit), используя ReadProcessMemory из другого процесса.

Вот примерный C-псевдокод того, что я делаю:

char buf[128];

// get first import descriptor
readMemory(&import, procImgBase + DataDirectory[1].VirtualAddress, sizeof(IMAGE_IMPORT_DESCRIPTOR));

// get dll name 
readMemory(buf, import.Name + procImgBase, 127);
printf("libname: %s\n", buf);

// get first function name
DWORD iltAddress = 0;
readMemory(&iltAddress, import.FirstThunk + procImgBase, 4);
readMemory(buf, iltAddress + procImgBase, 127);
printf("fname: %s\n", libName + 2); // <-- the +2 for the 2byte 'hint' of import lookup table entries

Если в предпоследней строке я заменю его на import.OriginalFirstThunk вместо FirstThunk, он напечатает все, как ожидалось. Должно быть, я что-то концептуально упускаю, и поэтому мне было интересно, может ли кто-нибудь прояснить, что это такое для меня?

Большое спасибо!

12
задан kwytay 12 April 2011 в 06:40
поделиться