
Binder Traceは、Android Binderメッセージをインターセプトして解析するためのツールです。「Binder用のWireshark」と考えてください。
Binder Trace は、Android Binder メッセージをインターセプトして解析するためのツールです。「Binder 用の Wireshark」と考えてください。

Python バージョン 3.9 以上
root 化された Android デバイスまたはエミュレータが必要です。
(Linux のみ) - 「クリップボードにコピー」機能のために xclip または xsel をインストールします。
sudo apt-get install xclip
sudo apt-get install xsel
PyPi からインストールします。
pip install binder-trace
インストールされている frida のバージョンを確認します(pip で要件をインストール済みであることを確認してください)。
pip list | grep frida
frida リリースページ から一致するバージョンの frida-server をダウンロードします。
adb が root として実行されていることを確認し、frida-server をデバイスにプッシュして実行します。
adb root
adb push frida-server /data/local/tmp
adb shell
chmod u+x /data/local/tmp/frida-server
/data/local/tmp/frida-server
| 引数 | 説明 |
|---|---|
| -h | 引数のヘルプを表示します。 |
| -d DEVICE | 接続先のデバイス(例: "emulator-5554")。利用可能なデバイスを一覧表示するには adb devices を使用します。指定しない場合は USB デバイスがデフォルトになります。 |
| -p PID | 接続先の DEVICE 上のプロセスの PID。 |
| -n NAME | 接続先の DEVICE 上のプロセス名(例: "Messaging")。 |
| -a [9, 10, 11, 12, 13, 14] | 対象デバイスの Android バージョン。構造体パスが指定されていない場合は、デフォルトの構造体が使用されます。 |
| -s STRUCTPATH | 構造体ファイルのディレクトリへのパス。 |
| -c CONFIG | フィルタリング用の設定ファイルへのパス。 |
| --spawn | アタッチ前にプロセスをスポーンします。-n オプション が必須で、有効なプロセス識別子を含んでいる必要があります。 |
binder trace を開始するには、接続先のデバイスとプロセスを選択する必要があります。
次の例では、ローカルエミュレータ上の接続先プロセスを特定するために adb と frida-ps を使用します。Android 11 エミュレータなので、Android 11 の構造体ディレクトリを選択します。お使いの Android バージョンに最も近い構造体ディレクトリを選択してください。別のバージョンの Android 用の構造体が必要な場合は、お知らせください。実行が開始されたら、ターゲットアプリを使用して Binder トランザクションを生成します。
> adb devices
List of devices attached
emulator-5554 device
> frida-ps -Ua
PID Name Identifier
---- ------------- ----------------------------
8334 Messaging com.android.messaging
7941 Phone com.android.dialer
9607 Settings com.android.settings
> cd binder_trace
> binder-trace -d emulator-5554 -n Messaging -a 11
| キー | アクション |
|---|---|
up | 上へ移動 |
down | 下へ移動 |
shift + up | ページアップ |
shift + down | ページダウン |
home | 先頭へ移動 |
end | 末尾へ移動 |
tab | 次のペイン |
shift + tab | 前のペイン |
ctrl + c | ペインをクリップボードにコピー |
space | トランザクション記録の一時停止/再開 |
c | クリア |
h | ヘルプを開く |
r | 設定ファイルを再読み込み |
q | 終了 |
| キー | アクション |
|---|---|
p | 昇順/降順を切り替え |
w | 次のインターフェースへジャンプ |
s | 前のインターフェースへジャンプ |
a | すべてのフィルターをオンにする |
n | すべてのフィルターをオフにする |
enter | フィルターを切り替え |
フィルタリングするには、interface、method、type、inclusive オプションのいずれかまたはすべてを定義します。オプションを使用しない場合は "" のままにします。
> binder-trace -d emulator-5554 -n Contacts -a 13

{
"filters": [
{
"interface": "android.gui.IDisplayEventConnection",
"method": "requestNextVsync",
"type": "",
"inclusive": false
},
{
"interface": "android.content.IContentProvider",
"method": "",
"type": "call",
"inclusive": false
}
]
}
> binder-trace -d emulator-5554 -n Contacts -a 13 -c .\binder_trace\binder_trace\config.json
android.gui.IDisplayEventConnection->requestNextVsync->"" と android.content.IContentProvider->"" ->call がフィルタリングされました。

内部の Binder インターフェースはマイナーバージョン間で変更される可能性があります。また、実質的にすべてが一緒にコンパイルされ、実行時のバージョン情報がないため、Android の高度に断片化されたエコシステム全体のすべてのリリースに対して 100% 正確な構造体情報を提供することは困難です。
構造体の詳細については、構造体ページ を参照してください。