Я пытался проанализировать / отобразить информацию в таблице адресов импорта (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, он напечатает все, как ожидалось. Должно быть, я что-то концептуально упускаю, и поэтому мне было интересно, может ли кто-нибудь прояснить, что это такое для меня?
Большое спасибо!