我一直試圖解析/顯示加載並運行後的進程的導入地址表(IAT)中的信息。我理解程序中的API調用會跳轉到IAT中的相關位置,然後跳轉到加載的DLL中的實際函數。導入表(IT)vs導入地址表(IAT)
可以通過讀取PE頭文件和OptionalHeader.DataDirectory [1]指針找到IMAGE_IMPORT_DESCRIPTORs數組來找到IAT是否正確。然後繼FirstThunk指針。而指針在這裏,會給你原來的導入表(IT)?
我也嘗試了PE頭中的OptionalHeader.DataDirectory [12]指針,但是這種方法甚至不太成功。
我一直在試圖用notepad.exe(32位)解析這個結構,使用另一個進程的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
如果,在3日到最後一行,我import.OriginalFirstThunk代替FirstThunk所代替它,它會打印一切如預期。我在概念上必須錯過一些東西,所以我想知道是否有人能澄清這是什麼,對我來說?
非常感謝!
謝謝!現在有道理。我想我應該已經意識到,當我回來的價值看起來像有效的地址,而不是RVA的。 – kwytay 2011-04-13 06:52:32
@Eric拉姆,你確定你的第一個要點嗎?在'winnt.h'中,可選的頭結構定義了'IMAGE_DATA_DIRECTORY DataDirectory [IMAGE_NUMBEROF_DIRECTORY_ENTRIES];',而不是'IMAGE_IMPORT_DESCRIPTOR DataDirectory [IMAGE_NUMBEROF_DIRECTORY_ENTRIES];' – 2017-05-22 20:31:55
這就是我現在卡住的地方......我要獲取數據目錄,但是如何將它們加載到正確的結構中以從IAT或ILT或INT獲取DLL名稱目前阻止了我。 – 2017-05-22 20:33:50