インポート名に奇妙なRVAを与えるWin32 NTヘッダーに問題があります。ここでは私の問題与えている、関連するコードです:インポートアドレステーブルが正しくインポートされません。インポート名が正しくない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_DESCRIPTORが間違っているのか分かりません。 http://pastebin.com/32MBEvWUが
申し訳ありません、それ以上説明できますか?私はあなたが言っていることの要約を理解していますが、私は "インポートテーブル"と "インポートセクション"の違いをよく理解していません。 – dymk
@Dylan:PEファイルは、セクション、コード、データ、インポート、エクスポートなどのセクションが分かれています。通常、インポートセクションの名前は ".idata"です。しかし、ファイル内のセクションレイアウトはロードされたモジュールのレイアウトと同じではないので、アドレスを調整する必要があります。 http://msdn.microsoft.com/en-us/windows/hardware/gg463125 – Timo
@Dylan:そしてわかりやすくするために、インポートセクションは通常、インポートテーブルとインポートテーブルを含んでいますアドレステーブルとその他のデータがあります。仕様は非常に魅力的なので、どのセクションにもほとんど何も含めることができません。 – Timo