#概要
IDA Pro上で関数ポインタが連続する領域(関数の配列)を見つけた後には、構造体とプロトタイプ宣言を利用。
すると、各関数呼び出し時に引数が自動で識別されるようになり、解析がはかどる。
関数がWin32 APIの場合にはFireEyeのflare-idaのStructTyperを利用することでプロトタイプ宣言の自動化も可能。
#設定フロー
- 関数の配列から、配列要素の関数呼び出しを見つける
- 構造体を定義して配列要素の各関数を定義
- 各関数にプロトタイプ宣言を定義【ココをStructTyperで自動化】
- 引数を定数表示
##関数の配列から、配列要素の関数呼び出しを見つける
今回の例では、スタック上に積まれた関数の配列へのポインタをcallしている部分を見つけたところから開始します。
##構造体を定義して配列要素の各関数を定義
- Structureタブで右クリックし、Add struct typeを選択
- 構造体名を入力しOKで構造体作成
- 構造体名を右クリックし、Data選択
- 追加された要素上でd押下により要素サイズをdd(4 bytes)とする
※ 本説明中では32bitのプログラムを解析しているためポインタサイズは4 bytesであるが、
64bitのプログラムを解析する場合には要素サイズを 8 bytesとすること
- 配列の要素数分だけ(3)~(4)を繰り返す
- 各要素を右クリックし、Renameを選択で関数名を付与
- 配列要素の関数呼び出し箇所でオペランドを右クリック(※)し、Structure offset->作成した構造体を選択
※ 本説明中ではcall dword ptr [eax+4]のeaxを右クリック
##各関数にプロトタイプ宣言を定義【ココをStructTyperで自動化】
###手動でのプロトロタイプ宣言方法
Structureタブで(6)で付与した関数名を右クリックし、Set type選択、Microsoftのドキュメントで確認した関数定義を設定
###自動でのプロトタイプ宣言方法(StructTyper利用)
- Github上にてfireeye/flare-idaをダウンロード
- StrutTyperをIDA proへインストール
plugins
To install, copy the contents of the plugins directory in this repository to your %PROGRAMFILES%\IDA\plugins folder.
python
The python directory here can be copied to your %PROGRAMFILES%\IDA\python folder, or you can modify your PYTHONPATH environment variable to include the directory.
- IDA Pro上部メニューのEdit > Plugins > StructTyperにて作成した構造体を選択
####引数を定数表示
引数の数値を右クリックし、Symbolic constant選択、適切な定数を設定
##最後に
今後も、バイナリ解析用のテクニックを自分のメモとして残していくつもりです。
間違いや改善点がありましたら、ご一報いただけるとありがたいです。