
grapは、パターンとバイナリファイルを受け取り、Capstoneベースの逆アセンブラを使用してバイナリから制御フローグラフを取得し、パターンとのマッチングを行います。
パターンはユーザー定義のグラフで、命令条件(「opcodeがxorでarg1がeax」)や繰り返し条件(3つの同一命令、基本ブロックなど)を持ちます。
grapは、逆アセンブラとPythonバインディングを備えたスタンドアロンツールとして、またIDAとリバースエンジニアが行った逆アセンブリを活用するIDAプラグインとして利用可能です。
サポート:




このドキュメントでは、Linuxディストリビューション上でgrapをビルドおよびインストールする方法について説明します。
以下の資料も参照してください:
コンパイラ(build-essential)に加えて、以下の依存関係をインストールする必要があります:
したがって、Ubuntu / Debianでは次のコマンドが機能するはずです:
sudo apt-get install build-essential cmake bison flex libboost-regex-dev libboost-system-dev libboost-filesystem-dev libseccomp-dev python3-dev python3-pefile python3-pyelftools python3-capstone swig
これらは最新のUbuntu LTS(18.04.3)でテストされていることに注意してください。 パッケージはディストリビューションによって異なる場合があります。
以下のコマンドでプロジェクトをビルドおよびインストールします:
mkdir build; cd build/ 専用ディレクトリにプロジェクトをビルドすることをお勧めしますcmake ../src/; make でcmakeとmakeを使用してビルドsudo make install でgrapを/usr/local/bin/にインストールデフォルトのPythonバージョンがpython2の場合、SWIGがpython3を見つけられないことがあります。これはデフォルトをpython3に切り替えることで解決できます。 例えばUbuntuでは:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
ツールは次のコマンドで起動できます:
$ grap [options] pattern test_paths
以下はサポートされているオプションの例です:
grap -h: サポートされているオプションの説明文字列からパターンを推測させることもできます。サポートされるオプションは限られていますが、プロトタイピングに便利です:
grap "opcode is xor and arg1 contains '['" (test.exe): メモリ書き込みを伴うxorを検索grap -v "sub->xor->sub" (test.exe): -vで推測されたパターンのパスを出力バイナリの逆アセンブル方法を選択:
grap -od (pattern.grapp) samples/*: マッチングを試みずにsamples/フォルダ内のファイルを逆アセンブルgrap -f (pattern.grapp) (test.exe): バイナリを強制的に再逆アセンブルし、pattern.grappとマッチングgrap --raw (pattern.grapp) (test.bin): rawファイルの逆アセンブル(64ビットバイナリの場合は--raw-64を使用)出力の冗長性を制御:
grap -q -sa (pattern.grapp) (samples/*.grapcfg): 逆アセンブルされたファイルをマッチングし、マッチしたものとマッチしなかったものを1行ずつ表示grap -m (pattern.grapp) (test.grapcfg): マッチしたすべてのノードを表示逆アセンブルされたファイル(.grapcfg)の出力先を選択; 複数のファイルを複数のパターンとマッチング:
grap patterns/basic_block_loop.grapp -o ls.grapcfg /bin/ls: lsをls.grapcfgに逆アセンブルし、基本ブロックループを検索grap (pattern1.grapp) -p (pattern2.grapp) (test.exe): 複数のパターンファイルとマッチングgrap -r -q patterns/ /bin/ -o /tmp/: /bin/のすべてのファイルを/tmp/に逆アセンブルし、patterns/のすべての.grappパターンとマッチング(再帰オプション-rは/bin/に適用され、patterns/には適用されません)次のパターンは、Backspaceサンプルに見られるxorとそれに続くsubからなる復号ループを検出します:
digraph decryption_md5_4ee00c46da143ba70f7e6270960823be {
A [cond=true, repeat=3]
B [cond="opcode is xor and arg2 is 0x11"]
C [cond="opcode is sub and arg2 is 0x25"]
D [cond=true, repeat=3]
E [cond="opcode beginswith j and nchildren == 2"]
A -> B
B -> C
C -> D
D -> E
E -> A [childnumber=2]
}
パターンファイルには複数のパターングラフを含めることができます。
追加のパターン例は2つのディレクトリにあります:
マルウェアサンプルについて:
Pythonバインディングの使用法:
詳細なドキュメントはdoc/フォルダにあります:
パターンとテストグラフの構文は、リリースセクション内のファイルgrap_graphs.pdfに詳細が記載されています。
grapはMITライセンスの下でライセンスされています。完全なライセンステキストはLICENSEにあります。