インポート テーブルから情報を抽出する Python スクリプトを作成しようとしています。各dllがインポートする関数名を取得できました。ただし、ヒントにアクセスする方法がわかりません。なにか提案を?
1 に答える
既に名前を列挙しているため、32 ビット モジュールの IMAGE_THUNK_DATA 構造体 (または PE32+ の IMAGE_THUNK_DATA64) へのポインターがあると仮定します。そのため、そこからベースをカバーすることから始めます。また、特に指定していないため、32 ビット モジュールを扱っていると仮定します。
IMAGE_THUNK_DATA 配列は単なる DWORD の配列であり、各 DWORD はインポートされた関数を表します。関数が序数ではなく名前でインポートされていることを確認するには、最上位ビットが DWORD (つまり 0x80000000) に設定されていないことを確認する必要があります。
1> 上位ビットが設定されている場合、0xFFFF で AND 演算された DWORD の値 (下位 WORD を取得するだけ) が序数になります (また、「ヒント」値でもあります)。したがって、関数は序数によってインポートされ、使用できる名前はありません。
2> 上位ビットが設定されていない場合、DWORD 全体が IMAGE_IMPORT_BY_NAME 構造への RVA (ベースのないメモリ イメージへのポインター) になります。ファイル イメージから読み取る場合は、RVA をファイル オフセットに変換する必要があります。また、既にこれを行っていると仮定します。そうしないと、インポートされた関数名がありません。IMAGE_IMPORT_BY_NAME 構造体は、winnt.h で次のように定義されています。
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
注: Name で指定された BYTE は、もちろん、インポートされた関数名の文字配列の先頭をマークするだけです。名前は 1 文字を超える可能性があるためです。
最初の WORD はヒントです。既に名前を知っている場合はスキップする必要があります。問題があることを示すことができるコードのスニペットはありますか?