ScratchABit は、データ/制御フロー分析機能を備えた対話型のインクリメンタル逆アセンブラーです。 ScratchABit は、オープンソース リバース エンジニアリング コミュニティ (ベンダーによって適切にサポートされていないハードウェア、ハードウェアとソフトウェアの相互運用性、セキュリティ研究のためのオープンソース ドライバー/ファームウェアを作成するためのリバース エンジニアリング) の取り組みに特化しています。
ScratchABit は、逆アセンブリ/拡張モジュールを作成するために、コミュニティでよく知られている IDAPython API をサポートしています。
ScratchABit は進行中の作業であり、機能は必要に応じて追加されます。貢献は歓迎されています。
ScratchABit は、GNU General Public License v3 (GPLv3) の条件に基づいてリリースされています。
難読化された言語で書かれてはいけません。これらには、低レベルすぎる言語、初期化されていない変数にアクセスできる言語、変数と関数/プロシージャを区別しない言語、配列インデックスを任意の数値から開始する言語などが含まれます。ScratchABit は Python (最新バージョン、Python3) をお楽しみください。
ユーザー インターフェイス フレームワークでは、フレームワークのバージョン間の依存関係、肥大化、問題、非互換性を追加するのではなく、必要なレベルのユーザー操作を許可する必要があります。 ScratchABit は現在、ANSI/VT100 ターミナル エスケープ シーケンスを使用した、シンプルな全画面テキスト ユーザー インターフェイスを使用しています (そうです、curses ライブラリでさえ、ユーザーに強制するには依存関係が大きすぎると考えられていました)。
使いやすいテキスト形式を活用して「データベース」を保存し、再利用やツールの作成、バージョン管理システムへの保存を容易にする必要があります。
ScratchABit を使用するには、Python3 がインストールされていて (Python 3.3 ~ 3.7 でテスト済み)、VT100 (最小) または XTerm (推奨) ターミナルまたはターミナル エミュレータ (Linux/BSD/ などの Unix システムは準拠している必要があります。詳細については、以下の FAQ を参照してください) が必要です。もっと)。
以下を使用してコードのクローンを作成します。
git clone --recursive https://github.com/pfalcon/ScratchABit
--recursive
を使用せずにコードのクローンを作成した場合は、ScratchABit ディレクトリでgit submodule update --init
実行します。
ScratchABit には Capstone Engine ベースの CPU プラグインが同梱されており、これにより多くの CPU アーキテクチャへのアクセスが可能になります。これを使用するには、Capstone 用の最新の Python バインディング モジュールをインストールする必要があります (OS ディストリビューションによって出荷されるパッケージは古いことが多いため、優先して)。これをインストールする最も簡単な方法は、Python ユーザー パッケージ ディレクトリにインストールすることです。
pip3 install --no-cache-dir --user capstone
別の方法として、ScratchABit ディレクトリ内の Python 仮想環境にインストールすることもできます。
python3 -m venv .venv
source .venv/bin/activate
pip3 install --no-cache-dir capstone
ScratchABit を操作するために新しいターミナル セッションを開くたびに、 source .venv/bin/activate
コマンドを再度実行して仮想環境をアクティブ化します。
上記のどれもうまくいかない場合は、capstone パッケージをシステム全体にインストールしてみることができます (推奨されません)。
sudo pip3 install --system capstone
ファイルを自己記述型実行可能形式 (ELF など) で逆アセンブルしたい場合は、それを引数としてScratchABit.py
に渡すだけです。リポジトリには、すぐに開始できるように、さまざまなアーキテクチャ用のexample-*.elf
ファイルが多数含まれています。たとえば、x86 32 ビット バージョンを試すには:
python3 ScratchABit.py example-x86_32.elf
あるいは、生のバイナリ ファイルを逆アセンブルしたい場合は、.def (定義) ファイルを作成して、コードに定義されているメモリ領域、バイナリ ファイルをロードするアドレスなどを指定する必要があります。 def ファイルは、.elf および同様のファイルにも役立つ場合があります。) リポジトリには、単純な x86_64 生のバイナリ コードと、対応する example-x86_64.def ファイルが含まれています (利用可能なファイルの説明については、内部を参照してください)。オプション):
python3 ScratchABit.py example-x86_64.def
F9 を押してメニューにアクセスします (XTerm 互換端末ではマウスも機能します)。 F1 を押すと、キー バインディングに関するヘルプが表示されます (ほとんどのアクションはメニューからもアクセスできます)。 ScratchABit のワークフローは、他の対話型逆サンブラと似ています (これまでの経験や背景知識が役立つ場合があります)。
IDAPython プロセッサ プラグインは、Python モジュール パス上のどこからでもロードできます。あるいは、プラグイン.py
ファイルをplugins/cpu/
サブディレクトリにシンボリックリンク/コピーすることもできます。
プラグインが使用可能になったら、 example-x86_64.def
に基づいて新しい定義ファイルを作成し、 cpu xxx
行にプラグイン モジュール名 (拡張子.py
なし) を設定します。
外部プラグインを使用する非常に簡単な例については、ida-xtensa2 リポジトリの xtensa.py プラグインで動作するこの esp8266.def ファイルを参照してください。
Q: どのようなプロセッサ/アーキテクチャがサポートされていますか?
A: ScratchABit は、それ自体ではプロセッサ アーキテクチャをサポートしていません。IDAPython API プラグインを使用して完全に再ターゲット可能です。多くのプラグインが利用可能で、新しいプラグインを作成するのは簡単です。ユーザーが ScratchABit をテストできるように、内部で Phmasid 逆アセンブラを使用するシンプルな x86 プロセッサ プラグインがディストリビューションに含まれています。
バージョン 2.0 からは、Capstone プラグインも含まれており、x86、ARM、MIPS、PowerPC、SPARC などを含む多数のアーキテクチャへのアクセスが可能になります (アーキテクチャのサポートは、ユーザーのテストに基づいて段階的に有効になります)。
ScratchABit に同梱されているプラグインについてはplugins/cpu/
dir の README を参照してください。
Q: デバッガ?
A: ScratchABit は、静的解析と新しい CPU アーキテクチャの簡単なサポートに特化しています (Python で新しい CPU プラグインをコード化するだけで、数時間で初期結果が得られます)。動的分析はコア機能として考えられていなかったので、すぐに実装する計画はありません。ただし、パッチは大歓迎です。
Q: デコンパイラ?
A: プログラムの詳細な分析、変換、逆コンパイルを目的とした ScratchABlock という関連プロジェクトがあります。 ScratchABlock が成熟するにつれて、その機能の一部が ScratchABit 内で (おそらくプラグイン経由で) 利用できるようになることが予想されます。
Q: Linux を使用していないのですが、ScratchABit を実行するにはどうすればよいですか?
A: システム上のエミュレータ/VM に Linux をインストールしてください。
Q: スクリーンショットは必須ですか?
A: 確かに: