Я пытаюсь разобрать/отобразить информацию в таблице адресов импорта (IAT) процесса после ее загрузки и запуска. Я понимаю, что вызовы API в программах переходят в соответствующую точку IAT, которая затем переходит к фактической функции в загружаемых DLL.
Правильно ли, что IAT можно найти, прочитав заголовок PE и следуя указателю OptionalHeader.DataDirectory [1], в массив IMAGE_IMPORT_DESCRIPTOR. Затем следуйте указателям FirstThunk. Если указатели OriginalFirstThunk здесь, вы получите исходную таблицу импорта (IT)?
Я также пробовал следовать указателю OptionalHeader.DataDirectory [12] в заголовке PE, но это было еще менее успешным.
Я тестировал это, пытаясь разобрать эту структуру для notepad.exe(32 бит), используя ReadProcessMemory из другого процесса.
Вот грубый C-psuedocode для того, что я делаю:
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, он напечатает все, как ожидалось. Мне нужно что-то пропустить концептуально, и поэтому мне было интересно, может ли кто-нибудь прояснить, что это для меня?
Большое спасибо!