我在Win32 NT頭文件中遇到問題,導致我輸入名稱的RVA爲奇數。這是給我的問題的相關代碼:導入地址表會導致導入名稱的RVA不正確
//Get a pointer to the import table
PIMAGE_IMPORT_DESCRIPTOR piidImportTableAddr;
piidImportTableAddr = (PIMAGE_IMPORT_DESCRIPTOR)(pImgNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (DWORD)pMemFile);
while(piidImportTableAddr->Name != 0)
{
//Itterate over every IMAGE_IMPORT_DESCRIPTOR structure, extracting the names of the DLLs to import
char* name = (char*)((DWORD)piidImportTableAddr->Name + (DWORD)pMemFile);
//Do nothing for now
piidImportTableAddr++;
}
然而,piidImportTableAddr結構的成員包含有壞的指針地址,這裏是會員的表格:
Characteristics 0x42746553
OriginalFirstThunk 0x42746553
TimeDateStamp 0x646f4d6b
ForwarderChain 0x02260065
Name 0x54746547
FirstThunk 0x4d747865
這些都是糟糕的RVA和內存位置。有沒有什麼我在做這個方法查找DLL名稱時做錯了?我將導入表的RVA與PE Lord中顯示的RVA進行了比較,它們是相同的,所以我不確定IMAGE_IMPORT_DESCRIPTORs爲什麼不正確。
這裏是源代碼的鏈接,在它的全部:http://pastebin.com/32MBEvWU
對不起,你能解釋一下嗎?我理解你所說的摘要,但我不太瞭解「導入表」和「導入部分」之間的區別。 – dymk
@Dylan:PE文件被分成不同的部分,代碼,數據,導入,導出等不同部分。通常,導入部分被命名爲「.idata」。但文件中的部分佈局與加載模塊的佈局不同,因此您必須調整地址。我推薦閱讀微軟自己的文檔:http://msdn.microsoft.com/en-us/windows/hardware/gg463125 – Timo
@Dylan:只是爲了澄清,導入部分通常*包含導入表以及導入地址表和其他一些數據。規範是相當有說服力的,所以任何部分都可以包含幾乎任何東西。 – Timo