
バイナリ解析プラグイン。難読化されたコードを解析・簡略化する。
著者: Tim Blazytko & Nicolò Altamura
難読化されたコードを解析し、簡素化する
Obfuscation Analysis は、強力に保護されたバイナリを扱う際の苦労を軽減する Binary Ninja プラグインです。 いくつかの焦点を絞ったヘルパーを同梱しており、以下のことが可能です
いくつかの使用例は examples にあります。さらに、REcon トーク「Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications」ではいくつかの使用例が紹介されています。スライドはこちらにあります。このプラグインは Obfuscation Detection を補完します。疑わしい関数がフラグ付けされたら、Obfuscation Analysis がそれらをクリーンアップして理解するのに役立ちます。ヘルパーは今後も追加されていく予定です。
このツールは Binary Ninja のプラグインマネージャーを使用してインストールできます。
手動でインストールする場合は、Binary Ninja のプラグインフォルダで以下の手順に従ってください:
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
仮想環境を使用する場合は、Binary Ninja の設定で site-packages のパスを手動で設定する必要があります。
このプラグインは Binary Ninja のトップバーメニューの Plugins -> Obfuscation Analysis から利用できます。
算術難読化を簡素化するには、まずデコンパイラビューで簡素化したい HLIL 式をハイライトします。次に、Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify を選択します。プラグインは完全な計算を解決し、それを msynth に通し、簡素化された結果を同じ行のコメントとして挿入します。以下の短いアニメーションはワークフロー全体を示しています:
MBA 簡素化は msynth に依存しています。デフォルトでは、プラグインは msynth のデフォルト簡素化オラクルを使用します。これはプラグインに同梱され、事前設定されています。より大きなオラクルやカスタムオラクルを使用したい場合は、obfuscation_analysis.mba_oracle_path を手動で設定するか、Binary Ninja の設定ウィンドウでファイルを参照してください。
何か問題が発生した場合、プラグインは簡潔なユーザーレベルのメッセージを Log ペインに書き込みます。ログビューを Debug に切り替えると、完全なトレースバックを確認できます。
このプラグインは、保護されたバイナリをリバースエンジニアリングする際に遭遇する一般的な障害に対処する、焦点を絞ったヘルパーを同梱しています。それぞれは UI またはヘッドレススクリプトからバックグラウンドタスクとして実行できます。以下は現在利用可能な機能です。
破損した関数とは、逆アセンブリに未定義のアーティファクト (空の基本ブロック、無効または重複する命令など) が現れる関数です。このヘルパーは BinaryView 全体を走査し、そのような症状を持つ関数をフラグ付けし、リストアップすることで、アナリストが誤ってパースされたコードや意図的に難読化されたコードを素早く検査できるようにします。オプションの削除アクションは、フラグ付けされたすべての関数を消去し、再解析を強制して関数リストをクリーンアップします。これは特に以下の特定に役立ちます
Mixed-Boolean Arithmetic (MBA) は、単純な計算を算術演算とブール演算の長い連鎖に埋め込む難読化手法です。この機能はデコンパイラ内でそのような式を簡素化します。HLIL 命令を選択すると、プラグインは現在の基本ブロックに制限された SSA 後方スライスを使用してその完全な計算チェーンを収集し、そのスライスを Miasm IR に変換し、msynth に投入し、最後に簡素化された結果をデコンパイラビューにコメントとして追加します。この機能により、以下が可能になります
現在選択されている関数について、このヘルパーはデコンパイラビュー内のすべての呼び出し先を再帰的にインライン展開し、Binary Ninja に単一の自己完結した IL を提供します。すべての境界がなくなると、デコンパイラは関数をまたいでデータを伝播でき、より深い定数畳み込み、デッドコード除去、そして一般的により明確なロジックが可能になります。以下の用途に使用します
HLIL は非常に巨大になり、非常に大きな関数や深いコールツリーではレンダリングが遅くなる可能性があることに注意してください。さらに、すべてが単一のユニットにマージされると、一部のデコンパイラ最適化が効果的でなくなる場合があります。これを制御するには、インライン展開の深さを制限できます: Settings -> Obfuscation Analysis -> Max Function Inlining Depth を上限 N に設定します (デフォルトでは 1 に設定されています)。深さ制限がある場合、最初の N コールレベルのみがインライン展開され、より深い呼び出しはインライン展開されません。
このプラグインには、注意すべきいくつかの注意点があります。そのほとんどは MBA 簡素化パイプラインに関連しています:
Binary Ninja のバグ: BN 5.0 stable では、HLIL の型キャストが欠落しているため、後方スライスステップが失敗する可能性があります: https://github.com/Vector35/binaryninja-api/issues/6371。この問題は 5.1.7477-de 以降で修正されています
スライスが1つの基本ブロックに限定される: 先行ブロックにある変数定義は無視されます (多くの場合、制御フローに依存するため)、そのため一部の MBA 項は部分的にしか解決されない可能性があります
HLIL から Miasm IR への変換ギャップ: すべての HLIL 構文に健全な Miasm の等価物があるわけではありません。変換が失敗すると、その式はスキップされ、エラーがログに記録されます
IL カバレッジ: 制御フローノードと浮動小数点演算は現在変換されません
msynth の制約を継承 : MBA 簡素化はすべての msynth の制限を継承します
詳細については、Tim Blazytko (@mr_phrazer) または Nicolò Altamura (@nicolodev) までお問い合わせください。