(2025年5月14日更新)
準備中
IWM UtilitiesはUNIX系OSおよびWindowsで動作する逆アセンブラ、ダンプ、アンパッカーなどを1つのパッケージにまとめたバイナリ解析ユーティリティです。
C89規格に基づくCコンパイラでコンパイルできます。OSやハードウェアには依存しません。IWM Utilitiesが用意している関数の代わりにGTK+-2.0を利用することもできます。
GTK+版はXubuntu 20.04、Windows版はWindows 10 Professional 日本語版
32ビットWindows実行可能プログラムまたは任意のバイナリから32ビットWindows実行可能プログラムを作成する。 作成される32ビットWindows実行可能プログラムはファイルアライメントとセクションアライメントが一致する。 入力されたファイルが32ビットWindows実行可能プログラムではないときには、ファイルの先頭にPEヘッダを付加して32ビットWindows実行可能プログラムにする。 このときのデフォルトのセクションアライメントは1000h、ベースアドレスは400000h、エントリーポイントはバイナリの先頭になる。
標準ではエントリーポイントおよびエクスポートされているサブルーチンをエクスポートテーブルの順番で強制逆アセンブルをする。 強制逆アセンブルでは、たとえそのサブルーチンで逆アセンブルが正常に終了しなくても逆アセンブルを行う。 次にここでサブルーチンと思われるコードの逆アセンブルを試みる。 相対アドレス指定は分岐命令しかありえないので、相対アドレス指定の場合には強制逆アセンブルをする。 即値アドレス指定の場合には(正常終了した場合のみ)逆アセンブルをする。 オフセット値指定の場合にはそのアドレスがまだ未解決のときに、そのアドレスにある値が示すアドレスに対してサブルーチンのcallならば強制逆アセンブル、それ以外ならば逆アセンブルをする。 32ビットの配列指定の場合にはそのアドレスにある値が示すアドレスに対して逆アセンブルが可能な限り繰り返す。 逆アセンブルの優先順位はこの順番であり、同じならばアドレスが小さい方を優先する。 強制逆アセンブルを除いて、逆アセンブルができなかった場合にはデータ参照として扱われる。
データ参照では即値アドレス指定の場合には、そのアドレスが文字列として有効かどうか調べる。 オフセット値指定の場合にはそのアドレスに8~32ビットのデータがあると仮定する。 また32ビットのときにはその値が示すアドレスが文字列として有効かどうか調べる。 32ビットの配列指定の場合には、そのアドレスにある値が示すアドレスが文字列として有効かどうか調べる。 これを文字列が有効な限り繰り返す。
--analyse-linearが有効ならば、アドレスの下位から順番に逆アセンブルを試みる。 逆アセンブルが可能ならば、そのアドレスをエントリーポイントやエクスポートと同様に扱う。
--analyse-refererが有効ならば、アドレスの下位から順番にその32ビットの値が示すアドレスの逆アセンブルを試みる。 逆アセンブルが可能ならば、そのアドレスを32ビットのデータとし、値が示すアドレスをエントリーポイントやエクスポートと同様に扱う。
--analyse-dataが有効ならば、未定義の領域をデータとして扱う。
32ビットWindows実行可能プログラムの情報を表示する。 長いコマンドはスペースで区切る。 短いコマンドはh、e、i, r, lの5種類ありスペースなしで複数のコマンドを与えることができる。 引数の最後はファイル名になる。
バイナリの解析方法は静的解析と動的解析がある。 静的解析では逆アセンブルを行ってニーモニックを得る。 動的解析では仮想環境で実行してニーモニックを得る。 デフォルトは静的解析である。 静的解析と動的解析は同一のデータベースに登録される。
entryコマンドでは引数で与えられた複数の32ビットWindows実行可能ファイルのエントリーポイントのニーモニックを登録する。 最低でも8ステップのニーモニックが必要であり、最大で24ステップのニーモニックを登録する。
ignoreコマンドでは引数で与えられた複数の32ビットWindows実行可能ファイルのエントリーポイントのニーモニックを無視するために登録する。 登録されたニーモニックはentryコマンドで登録できない。
displayコマンドは登録されているエントリーポイントのニーモニックを表示する。
removeコマンドは登録されているニーモニックを削除する。 引数で先頭から一致した場合には、該当するニーモニックをすべて削除する。
checkコマンドでは引数で与えられた複数の32ビットWindows実行可能ファイルのエントリーポイントのニーモニックが登録されているか確認する。
findコマンドでは引数で与えられたファイルの中に登録されているエントリーポイントがあるか確認する。 ファイルは32ビットWindows実行可能ファイルに限らない。 また引数で2つ目のファイルを指定したときには、見つけたエントリーポイントに変更した32ビットWindows実行可能ファイルを書き出す。 入力ファイルが32ビットWindows実行可能ファイルではないときにはヘッダが先頭に付加される。 --dumpおよび--rawオプションは入力ファイルが32ビットWindows実行可能ファイルか任意のバイナリかを明示的に指定する。 どちらのオプションもないときには自動的に判定する。 デフォルトのセクションアライメントは1000h、ベースアドレスは400000hである。
findコマンドはホームディレクトリの.maid.org/iwmutlis/findep.iniにデータを保存する。 このファイルはWindows XPでは C:\Documents and Settings\<ユーザ名>\Local Settings\maid.org\iwmutlis\findep.ini であり、Windows Vista以降では C:\Users\<ユーザ名>\AppData\Local\maid.org\iwmutlis\findep.ini になる。
入力ファイルの先頭から順番に静的解析(逆アセンブル)または動的解析(仮想環境による実行)を行い、多くのステップ数が得られたアドレスを順番に表示する。 また出力ファイルを指定したときには、そのファイルに32ビットWindows実行可能ファイルを出力する。 32ビットWindows実行可能ファイルのエントリーポイントは最も多くのステップが得られたアドレスになる。 デフォルトでは静的解析を行う。 仮想環境による実行の最大のステップ数は256である。
仮想環境でプログラムを実行することで、Unpackされたイメージの取得を行う。 実装されていない命令やAPIの呼び出しなど、継続して実行することができなくなったときには、その時点で終了する。 仮想環境のメモリにはレベルという概念があり、プログラムによって書き換えられたメモリのレベルは、そのプログラムコードがあるメモリのレベルよりも1つ大きくなる。 またレベルが高いメモリにプログラムの制御が移ったときには、そのアドレスをオリジナルのエントリーポイントの候補とする。 レベルの初期値は0である。
--dynamicオプションではプログラムが終了するときに確保されているメモリを出力ファイルに含める。
--importオプションが指定されると、プログラムが終了するとき状態でインポートテーブルを再構築して出力ファイルに加える。
--breakオプションではプログラムを終了させるアドレスを16進数で指定する。 「-b 401000」では401000を実行する時に終了する。 また「-b 401000,402000-403000」というようにカンマで区切り複数指定することや、一定の範囲の指定も可能である。
--entryオプションが指定されるときには、新たなエントリーポイントを見つけることができなかったときにはファイルに出力しない。
zlibで圧縮されたFlashファイルを展開する。 LZMAで圧縮されたFlashファイルには対応していない。
未圧縮のFlashファイルのtag block構造を表示する。 圧縮されたFlashファイルは事前に展開しなければならない。
シェルコードを実行可能メモリに読み込んで実行する。 デフォルトでは任意のメモリに配置され、シェルコードの先頭から実行される。 シェルコードの実行前に指定のファイルを開いておくことができる。
プロセスIDまたはプロセスのファイル名を指定する。 アドレスとバイト数を指定したときには、その範囲のメモリの内容をファイルに保存する。 デフォルトではプロセスを作成したモジュールのイメージをファイルに保存する。 保存時に、メモリのイメージとともにインポートテーブルの情報を保存する。 デフォルトではモジュールのファイルの名前で拡張子が「.dmp」にメモリのイメージ、「.imp」にインポートテーブルの情報を保存する。 モジュールのイメージでは、セクションヘッダのファイルオフセットと仮想相対アドレスは一致する。
tlhlpが作成したメモリのイメージとインポートデーブルの情報からインポートテーブルを再構築してファイルに保存する。