
クロスプラットフォームのAPK/DEXメソッドファインダー:コールチェーントレーシング、ProGuard難読化解除、および隠しAPI検出機能
ウェブサイト: junelegency.github.io/dexfinder
クロスプラットフォームのAPK/DEXメソッド・フィールド参照ファインダーで、コールチェーントレース、ProGuard/R8の難読化解除、Android隠しAPI検出を備えています。
Androidのveridexツールに触発され、Goで再実装され、拡張機能(より高速なリフレクション検出、コールチェーントレース(veridexは1レベルのみ表示)、柔軟な出力形式)を備えています。
--fail-on blocked 制限付きAPIが見つかると非ゼロで終了.dexfinder.yaml、CLIフラグで上書きHomebrew (macOS / Linux):```bash brew install junelegency/tap/dexfinder
**スクリプト** (OS/アーキテクチャを自動検出):```bash
curl -sSL https://raw.githubusercontent.com/JuneLeGency/dexfinder/main/install.sh | bash
Go install:```bash go install github.com/JuneLeGency/dexfinder/cmd/dexfinder@latest
**バイナリ**: [Releases](https://github.com/JuneLeGency/dexfinder/releases)からダウンロード
## クイックスタート```bash
# Show APK overview
dexfinder --dex-file app.apk --stats
# Find all calls to getDeviceId (IMEI)
dexfinder --dex-file app.apk --query "getDeviceId"
# Trace call chains as merged tree
dexfinder --dex-file app.apk --query "getDeviceId" --trace
# Trace as flat call stacks (Java crash style)
dexfinder --dex-file app.apk --query "getDeviceId" --trace --layout list
# Exact JNI signature query
dexfinder --dex-file app.apk \
--query "Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;" \
--trace --depth 8
# Hidden API detection
dexfinder --dex-file app.apk --api-flags hiddenapi-flags.csv
--queryフラグは複数の入力スタイルを受け付けます。dexfinderはそれらを自動検出して変換します。
| 形式 | 例 | 動作 |
|---|---|---|
| 単純な名前 | getDeviceId | すべてのAPIにおけるあいまい部分文字列一致 |
| Javaクラス | android.telephony.TelephonyManager | そのクラスのすべてのメソッド/フィールド |
| Javaクラス#メソッド | android.telephony.TelephonyManager#getDeviceId | そのメソッドのすべてのオーバーロード |
| Java完全シグネチャ | ...TelephonyManager#getDeviceId() | 完全一致 + オーバーロードフォールバック |
| DEX/JNIシグネチャ | Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String; | 完全一致のみ |
dexfinder --dex-file app.apk --query "requestLocationUpdates" dexfinder --dex-file app.apk --query "android.location.LocationManager#requestLocationUpdates" dexfinder --dex-file app.apk --query "Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V"
## 出力制御
3つの独立した軸、自由に組み合わせ可能:```
--format (text / json / model / html / sarif) what to output
--layout (tree / list) how to arrange traces
--style (java / dex) how to display names
--color (auto / always / never) terminal colors
--format| 値 | 説明 |
|---|---|
text | 色付きタグ付きのプレーンテキスト出力 (デフォルト) |
json | JSON — スキャン結果またはトレースをツリー/リストレイアウトで出力 |
model | 完全なMethodInfo/FieldInfo型を含む構造化JSON (IDE/CI向け) |
html | 折りたたみ可能なツリーと検索機能を備えた自己完結型HTMLレポート |
sarif | SARIF 2.1.0 静的解析形式 (GitHub / VS Code) |
--layout (used with --trace)| 値 | 説明 |
|---|---|
tree | マージツリー — 共有呼び出しパスを1つのツリーにまとめたもの (デフォルト) |
list | フラットリスト — 各ユニークな呼び出しチェーンを独立したスタックとして表示 |
--style| 値 | 例 | 使用例 |
|---|---|---|
java | com.example.Foo.method(Foo.java) | 人間可読 (デフォルト) |
dex | Foo.method(Ljava/lang/String;)V | 正確なシグネチャ解析 |
--scope (search scope)検索対象の参照の種類を制御します。結果を理解する上で重要です。
| 値 | 検索対象 | 答えられる質問 | 出力タグ |
|---|---|---|---|
all | 呼び出し先API + フィールド + コード文字列 | 「このAPIを誰が呼び出しているか?」(デフォルト) | [METHOD] [FIELD] [STRING] |
callee | invoke-* / get/put 命令内のターゲットAPIシグネチャのみ | 「この特定のメソッド/フィールドを誰が呼び出しているか?」 | [METHOD] [FIELD] |
caller | 呼び出し元メソッドのシグネチャのみ | 「このメソッドは内部で何を呼び出しているか?」 | [CALLER→] |
string | const-string 命令内の文字列定数 | 「この文字列はコード内のどこで使用されているか?」 | [STRING] |
string-table | コード文字列 + DEX文字列テーブル全体 | 「この文字列はDEXのどこかに存在するか?」(注釈、デッドコードを含む) | [STRING] [STRING_TABLE] |
everything | 上記すべての組み合わせ | 完全な全体像 | すべてのタグ |
callee と caller の理解:``` scope=callee: "Who calls finish()?" onCreate ──calls──→ finish() ← these callers are shown onResume ──calls──→ finish()
scope=caller: "What does finish() call internally?" finish() ──calls──→ Log.i() ← these callees are shown finish() ──calls──→ super.finish()
`--scope=all` (デフォルト) = `callee` + `string`。`caller`方向はデフォルトから意図的に除外されています。これは根本的に異なる質問に答えるためです。必要なときは明示的に `--scope=caller` または `--scope=everything` を使用してください。
**出力タグの理解:**
| タグ | 意味 |
|---|---|
| `[METHOD]` | クエリに一致する**呼び出されている**メソッド(calleeマッチ)。インデント行は呼び出し元。 |
| `[FIELD]` | クエリに一致する**アクセスされている**フィールド。インデント行はアクセス元。 |
| `[CALLER→]` | クエリに一致する**呼び出し元メソッド**。インデント行は呼び出しているAPIを示します。 |
| `[STRING]` | コード内の文字列定数がクエリに一致。インデント行はその使用箇所。 |
| `[STRING_TABLE]` | 文字列はDEX文字列テーブルに存在するが、コード内に`const-string`参照がない(アノテーション内、R8による最適化などが原因)。 |
## 使用例