API呼び出しのしくみとIAT

参考書籍 : リバースエンジニアリングバイブル、デバッガによるx86プログラム解析入門【x64対応版】


API呼び出しの仕組み?
user32.dllが提供するLoadIconAというAPIを呼び出す場合を考える。
LoadIconAは、Windows XP SP3 に基づいてuser32.dllの0x77D0E8F6番地に宣言されている。
もしアプリケーションがLoadIconAを直接呼び出す場合、
(メモリ上の)DLLのBaseAddressにBaseOfCodeを足してLoadIconAのアドレスを割り出し、CALLで相対アドレス呼び出しをしなければならない。
この方法だとCALLの位置が変わるたび、DLLの位置が変わるたびに、オペランドの番地をすべて変えなくてはならない。
この方法は非効率であるため、IATを利用する。



・IAT(Import Address Table)
IATは、DLLの関数ポインタを集めたテーブルであり、プログラムはIATを経由してAPIを呼び出す。
DLLが読み込まれた際に、IATをDLL内のアドレスで書き直す。
こうすることにより、プログラムは簡単にAPIを呼び出すことができる。

APIフッキングのうち、IATフッキングというものがある。
APIと同じプロトタイプの関数を作成し、IATのポインタを書き換えるという手法である。

パッカーはこういったインポートデータを壊すので、ちゃんとしたアンパッキングをしなければ、IATを読み込むことができず実行ができなくなる。
アンパッキングの基本は、インポートデータを回復することだと言える。