WindowsのPE実行形式の「インポートアドレステーブル」が「dllごと」か「exeごと」か知っている人はいますか?
2 に答える
どのPEにもインポートアドレステーブルを含めることができるため、DLLとEXEの両方にインポートアドレステーブルを含めることができます。どちらも他のバイナリに依存関係(インポート)を持つ可能性があるため、これは理にかなっています。動的ロード(LoadLibrary
/ GetProcAddress
)を実行していない限り、別のモジュールを呼び出すときにインポートアドレステーブルがあります。
dumpbin
Visual Studioでユーティリティを使用して、PEのインポートを確認できます。
user32.dllの例:
C:\ Windows \ System32> dumpbin / imports user32.dll
Microsoft(R)COFF / PE Dumperバージョン10.00.30319.01Copyright(C)MicrosoftCorporation。全著作権所有。
ファイルuser32.dllのダンプ
ファイルの種類:DLL
セクションには、次のインポートが含まれています。
ntdll.dll 7DC60000 Import Address Table 7DCCACEC Import Name Table 0 time date stamp 0 Index of first forwarder reference 15A NtOpenKey 7A9 wcscat_s 7AD wcscpy_s ...
...そしてnotepad.exeの場合...
C:\ Windows \ System32> dumpbin / imports notepad.exe
Microsoft(R)COFF / PE Dumperバージョン10.00.30319.01Copyright(C)MicrosoftCorporation。全著作権所有。
ファイルnotepad.exeのダンプ
ファイルタイプ:実行可能イメージ
セクションには、次のインポートが含まれています。
ADVAPI32.dll 1001000 Import Address Table 100A234 Import Name Table FFFFFFFF time date stamp FFFFFFFF Index of first forwarder reference 77C71C82 27E RegSetValueExW 77C7BCD5 26E RegQueryValueExW 77C7BED4 230 RegCloseKey ...
簡潔な答え:
IAT (Import Address Table) は、PE ファイル (dll および exe) ごとです。
長い答え:
ローダーが exe ファイルをロードすると、このセクションに IMAGE_SCN_MEM_DISCARDABLE が設定されていない限り、PE の各セクションがプロセス メモリにコピーされます。IAT は .idata セクション ( msdn ) にあります。
PE ファイルの .idata セクションには、ローダーがターゲット関数のアドレスを特定し、それらを実行可能イメージにパッチするために必要な情報が含まれています。.idata セクション (または、私が好むようにインポート テーブル) ...
IMAGE_SCN_MEM_DISCARDABLE が idata セクションに設定されていません。したがって、idata セクションがメモリにコピーされ、exe と dll の両方にこのセクションがあり、IAT が PE ごとであることを意味します。
理解に役立つ場合は、ここに簡単なdllローダーを書きました。