誰でも違いを知っていますか?
3 に答える
Portable Executables で遊びたい場合は、仕様書のコピーを入手するしか方法がありません。
しばらく経ちましたが、メモリが正しく機能する場合: IT と IAT は同じですが、IAT はインポートの解決中に PE ローダーによって埋められますが、私の言葉を信じないでください。仕様を確認してください :)
編集:
仕様をざっと見て、少し記憶をリフレッシュしました。インポート テーブルはマスター構造であり、インポート元の DLL ごとに 1 つのエントリがあります。各エントリには、とりわけ、インポート ルックアップ テーブル( ILT ) とインポート アドレス テーブル( IAT ) ポインターが含まれています (これらは以前は および と呼ばれOriginalFirstThunk
ていましたFirstThunk
)。ILT テーブルと IAT テーブルはディスク上では同一ですが、実行時に IAT はインポートされた関数のメモリ アドレスで埋められます。
非標準のEXEを処理できるようにしたい場合、PEヘッダーのIATフィールドは、コードの開始/サイズとデータポインターに依存できないのと同じように、おそらく100%依存することはできません。IAT ヘッダー フィールドを無視して、代わりに IT を解析することをお勧めします。また、IT を解析するとき、一部の実行可能ファイルでは ILT が欠落し、IAT しかありません。古い borland (iirc) リンカは ILT を生成しないことで有名でした。
編集 2: 定義
- IT: インポート テーブル (PeCoff セクション 6.4.1) - DLL ごとのテーブル
IMAGE_IMPORT_DESCRIPTOR
。 - ILT: インポート ルックアップ テーブル (PeCoff セクション 6.4.2) - インポートごとのテーブル
IMAGE_THUNK_DATA
。 - IAT: インポート アドレス テーブル (PeCoff セクション 6.4.4) - オンディスク: ILT と同一、ランタイム: インポートされた関数メモリ アドレスで埋められます。