
Radare2とFridaは一緒に使うとより優れています。
radare2 向けの自己完結型プラグインで、frida を内蔵しています。Frida スクリプトに限定せず、r2 コマンドを使用してローカルまたはリモートのプロセスをインストルメント化できます(Frida スクリプトも使用可能)。
radareプロジェクトはリバースエンジニアリングのための完全なツールチェーンを提供し、積極的にメンテナンスされており、十分に整備された機能を提供するとともに、他のプログラミング言語やツールで機能を拡張できます。
Frida は動的インストルメンテーションツールキットであり、独自の JavaScript を注入して実行中のプロセスを検査・操作したり、必要に応じてスクリプトと通信したりすることが容易です。
:. コマンドを使用):db API を使用したネイティブブレークポイントr_fs API を使用したリモートファイルシステムへのアクセス推奨されるインストール方法は r2pm を使用するものです:
$ r2pm -ci r2frida
コンパイル不要のバイナリビルドは、近日中に r2pm および r2env でサポートされる予定です。それまでの間は、Releases ページ から最新ビルドをダウンロードしてください。
GNU/Debian では、以下のパッケージをインストールする必要があります:
$ sudo apt install -y make gcc libzip-dev nodejs npm curl pkg-config git
$ git clone https://github.com/nowsecure/r2frida.git
$ cd r2frida
$ make
$ make user-install
radare2 に変更(radare2-x.y.z の代わりに)preconfigure.bat)configure.bat を実行し、その後 make.bat を実行テスト用には、r2 frida://0 を使用します。frida で pid0 にアタッチすると、ローカルで動作する特別なセッションになります。その後 :? コマンドで利用可能なコマンド一覧を表示できます。
$ r2 'frida://?'
r2 frida://[action]/[link]/[device]/[target]
* action = list | apps | attach | spawn | launch
* link = local | usb | remote host:port
* device = '' | host:port | device-id
* target = pid | appname | process-name | program-in-path | abspath
ローカル:
* frida://? # このヘルプを表示
* frida:// # ローカルプロセス一覧
* frida://0 # frida-helper にアタッチ(スポーン不要)
* frida:///usr/local/bin/rax2 # 絶対パスでスポーン
* frida://rax2 # 上記と同じ、local/bin が PATH にある場合
* frida://spawn/$(program) # 現在のシステムで新しいプロセスをスポーン
* frida://attach/(target) # 現在のホストでターゲット PID にアタッチ
USB:
* frida://list/usb// # 最初の USB デバイスのプロセス一覧
* frida://apps/usb// # 最初の USB デバイスのアプリ一覧
* frida://attach/usb//12345 # 最初の USB デバイスの指定 PID にアタッチ
* frida://spawn/usb//appname # 最初に解決された USB デバイスでアプリをスポーン
* frida://launch/usb//appname # 最初の USB デバイスでアプリをスポーン+再開
リモート:
* frida://attach/remote/10.0.0.3:9999/558 # リモート frida-server の PID 558 に TCP でアタッチ
環境変数:(`%` コマンドを使用して実行時に環境を変更できます)
R2FRIDA_SAFE_IO=0|1 # Android/thumb での Frida のバグを回避する
R2FRIDA_DEBUG=0|1 # 引数解析の動作をデバッグするために使用
R2FRIDA_COMPILER_DISABLE=0|1 # 新しい frida typescript コンパイラを無効にする (`:. foo.ts`)
R2FRIDA_AGENT_SCRIPT=[file] # r2frida エージェントのファイルパス
$ r2 frida://0 # frida -p 0 と同じ、ローカルセッションに接続
名前または PID で任意のプログラムにアタッチ、スポーン、起動できます。次の行は rax2 という名前の最初のプロセスにアタッチします(別のターミナルで rax2 - を実行してテストしてください)
$ r2 frida://rax2 # `rax2` という名前の最初のプロセスにアタッチ
$ r2 frida://1234 # 指定された PID にアタッチ
バイナリの絶対パスを使用してスポーンすると、プロセスが起動します:
$ r2 frida:///bin/ls
[0x00000000]> :dc # ターゲットプログラムの実行を続行
引数も使用できます:
$ r2 frida://"/bin/ls -al"
USB デバッグで iOS/Android アプリをデバッグするには、次のアクションを使用します。spawn は launch または attach に置き換え可能で、プロセス名は bundleid または PID にできます。
$ r2 frida://spawn/usb/ # デバイス一覧
$ r2 frida://spawn/usb// # 最初の iOS デバイスのアプリ一覧
$ r2 frida://spawn/usb//Weather # Weather アプリを実行
以下は最も頻繁に使用するコマンドです。これらを覚え、サブコマンドのヘルプを表示するには末尾に ? を付けてください。
:i # ターゲットの情報を取得(pid、name、home、arch、bits...)
.:i* # ターゲットプロセスの詳細をローカル r2 にインポート
:? # 利用可能なすべてのコマンドを表示
:dm # マップ一覧。`:dm|head` を使用し、プログラムのベースアドレスにシーク
:iE # 現在のバイナリのエクスポート一覧(シーク位置)
:dt fread # 'fread' 関数をトレース
:dt-* # すべてのトレースを削除
r2frida プラグインはエージェント側で動作し、r2frida.pluginRegister API で登録します。
その他のプラグインスクリプトの例については、plugins/ ディレクトリを参照してください。
[0x00000000]> cat example.js
r2frida.pluginRegister('test', function(name) {
if (name === 'test') {
return function(args) {
console.log('Hello Args From r2frida plugin', args);
return 'Things Happen';
}
}
});
[0x00000000]> :. example.js # プラグインスクリプトを読み込む
:. コマンドは r2 の . コマンドと同様に動作しますが、エージェント内で実行されます。
:. a.js # プラグインを登録するスクリプトを実行
:. # プラグイン一覧
:.-test # 名前を指定してプラグインをアンロード
:.. a.js # スクリプトを永続化(デタッチ後も実行を継続)
Android 上で Termux を使用して r2frida をネイティブにインストール・使用する場合、シンボル解決に関するライブラリ依存関係にいくつかの注意点があります。これを機能させるには、Termux の libdir よりも前にシステムディレクトリを指すように LD_LIBRARY_PATH 環境変数を拡張します。
$ LD_LIBRARY_PATH=/system/lib64:$LD_LIBRARY_PATH r2 frida://...
最新バージョンの r2 を使用していることを確認してください(可能であれば最新リリースまたは git 版)。
r2 -L | grep frida を実行してプラグインが読み込まれているか確認します。何も表示されない場合は、R2_DEBUG=1 環境変数を使用してデバッグメッセージを表示し、原因を特定してください。
r2frida のコンパイルに問題がある場合は、r2env を使用するか、GitHub Releases ページからリリースビルドを取得してください。ただし、MAJOR.MINOR バージョンが一致している必要があることに注意してください。つまり、r2-5.7.6 は 5.7.0 から 5.7.8 の間の任意のバージョンでコンパイルされたプラグインを読み込むことができます。
+---------+
| radare2 | 土台の上にある radare2 ツール
+---------+
:
+----------+
| io_frida | r2frida io プラグイン
+----------+
:
+---------+
| frida | ターゲットとやり取りする Frida ホスト API とロジック
+---------+
:
+-------+
| app | JavaScript で Frida によってインストルメント化されたターゲットプロセス
+-------+
このプラグインは、pancake(別名 Sergi Alvarez、radare2 の作者)によって NowSecure 向けに開発されました。
Frida の作成とメンテナンス、そしてこの連携を機能させるために必要なあらゆるバグ修正や技術詳細の議論に積極的に協力してくれた Ole André に感謝します。称賛