
著者: Tim Blazytko
難読化されたコードやその他の興味深いコード構造を自動的に検出します
_難読化検出_は、バイナリ内の難読化されたコードや興味深いコード構造(例:ステートマシン)を検出するBinary Ninjaプラグインです。このプラグインは、リバースエンジニアリング中に詳細な調査に値するコード位置を特定することで、解析を容易にします。
さまざまなヒューリスティックに基づいて、プラグインは複雑または一般的でないコード構造を含む関数を特定します。そのようなコード構造は、以下のようなものを実装している可能性があります。
以下のブログ記事では、基礎となるヒューリスティックの詳細とそのユースケースを説明しています。
いくつかのユースケース例は例にあります。さらに、REconトーク「Unveiling Secrets in Binaries using Code Detection Strategies」でいくつかのユースケースを紹介しています。スライドはこちらから、録画はこちらからご覧いただけます。
このツールはBinary Ninjaのプラグインマネージャーを使用してインストールできます。
ヘッドレスバージョンでは、以下の手順に従ってください。
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# obfuscation_detectionをインストール
pip install .
プラグインはユーザーインターフェースおよびヘッドレスモードで使用できます。
個別のヒューリスティックを実行するにはPlugins -> Obfuscation Detectionを、個別のユーティリティ検出を実行するにはPlugins -> Obfuscation Detection -> Utilsを選択します。Plugins -> Obfuscation Detection -> Allコマンドは、すべてのヒューリスティックとすべてのユーティリティを同時に実行します。
結果はログウィンドウに表示されます。
識別された関数アドレスをクリックすると、Binary Ninjaが選択した関数に移動します。
ヘッドレスモードでプラグインを使用するには、scripts/detect_obfuscation.pyを実行します。
$ python3 scripts/detect_obfuscation.py <binary>
これにより、すべてのヒューリスティックとすべてのユーティリティが実行されます。機械可読な出力を得るには、--jsonを指定します。
$ python3 scripts/detect_obfuscation.py --json <binary>
JSONペイロードには、すべての結果がdetectionsキーの下に含まれています。各検出には自動化用の安定したidと、人間が読めるnameがあります。タグ付けされた各関数の発見項目には、Binary Ninjaプラグインで使用されるタグタイプと説明が含まれています。
ヘッドレスモードでステートマシンヒューリスティックのみを実行するには、scripts/detect_state_machine.pyを使用します。
$ python3 scripts/detect_state_machine.py [--json] <binary>
プラグインはさまざまなコード構造を検出するための複数の検出ヒューリスティックを実装しています。以下では、個々のヒューリスティックについて簡単に説明し、その使用方法を解説します。
大きな基本ブロックヒューリスティックは、基本ブロックあたりの平均命令数が最も多い関数の上位10%を識別します。これにより、以下のようなものを検出できます。
複雑な関数ヒューリスティックは、制御フローグラフが最も複雑な関数(サイクロマティック複雑度に基づく)の上位10%を識別します。これにより、以下のようなものを識別できます。
ステートマシンヒューリスティックは、グラフ理論の特性を使用してステートマシンを実装する関数を識別します。通常、そのようなステートマシンはループ内でディスパッチされるswitch文として表現できます。このヒューリスティックにより、以下のものを識別できます。
一般的でない命令シーケンスヒューリスティックは、統計分析を実行して、コードパターンが事前に計算されたベースラインから逸脱している関数の上位10%を識別します。これにより、以下のようなものを識別できます。
重複命令ヒューリスティックは、位置ずれした命令(命令バイトが2つの異なる命令で共有されている)を持つ関数を識別します。このヒューリスティックは以下のものを識別します。
このヒューリスティックをBinary Ninjaのユーザーインターフェースで使用すると、重複命令がグラフビューで強調表示されます。
最も呼び出される関数ヒューリスティックは、異なる関数からの呼び出し数が最も多い関数の上位10%を識別します。これにより、以下のようなものを識別できます。
このヒューリスティックは、ループ数が多い関数を識別します。このような関数は以下のようなものを実装している可能性があります。
このヒューリスティックは、潜在的なパフォーマンスのボトルネックを特定するのにも役立ちます。
このヒューリスティックは、まれで複雑なループ構造を持つ関数を識別します。これは通常、以下のようなものを示唆します。
このヒューリスティックは、ループ内で定数によるXOR演算を実行する関数を識別します。これにより、以下のようなものを識別できます。
このヒューリスティックは、式に複数の算術演算と1つのブール演算が同時に含まれている関数を識別します。これにより、以下のようなものを識別できます。
このヒューリスティックは、反復的なコンテキストハッシュ手法を使用して、各関数の制御フローグラフ内で繰り返されるマルチブロック構造を検出します。各ブロックのオペコードシグネチャとその後続ブロックのシグネチャを比較することで、単一関数内で複製またはほぼ複製されたサブグラフを識別します。これにより、以下のようなものを特定できます。
プラグインには、興味深い関数やコード領域を特定するための、より限定されたユーティリティも含まれています。これらはUtilsサブメニューから利用できます。Allコマンドは、これらをより広範なヒューリスティックと一緒に実行します。
このヘルパーは、既知の呼び出し元がない関数を識別します。これらの関数は以下のようなものである可能性があります。
このヘルパーは、他の関数を呼び出さない関数を識別します。この種の関数は、例えば以下のようなものである可能性があります。
このヘルパーは、再帰関数(直接的または間接的に自身を呼び出す関数)を識別します。再帰関数は以下のようなものを示している可能性があります。
このヘルパーは、各セクションのエントロピーを評価します。エントロピーは0から8の範囲の値を持つ統計的なランダム性の尺度です。エントロピーが8に近いセクションは、ランダム性の高さを示し、以下のようなものを示唆します。
このヘルパーは、RC4の鍵スケジューリングアルゴリズム(KSA)および疑似乱数生成アルゴリズム(PRGA)に一般的に関連するヒューリスティックマーカーを使用して、潜在的なRC4アルゴリズムの実装を検出します。RC4はマルウェアで以下のような目的で広く使用されています。
詳細については、@mr_phrazerまでお問い合わせください。