
Plattformübergreifender APK/DEX-Methodenfinder mit Aufrufkettenverfolgung, ProGuard-Entschleierung und Erkennung versteckter APIs
Englisch | Chinesisch | Webseite

Webseite: junelegency.github.io/dexfinder
Plattformübergreifender APK/DEX-Methoden- und Feldreferenz-Finder mit Aufrufkettenverfolgung, ProGuard/R8-Entobfuskierung und Erkennung verborgener Android-APIs.
Inspiriert von Androids veridex-Tool, neu implementiert in Go mit erweiterten Fähigkeiten: schnellere Reflexionserkennung, Aufrufkettenverfolgung (veridex zeigt nur eine Ebene) und flexible Ausgabeformate.
--fail-on blocked beendet mit Fehlercode, wenn eingeschränkte APIs gefunden werden.dexfinder.yaml für Projektvorgaben, CLI-Flags überschreibenHomebrew (macOS / Linux):```bash brew install junelegency/tap/dexfinder
**Skript** (erkennt automatisch OS/Architektur):```bash
curl -sSL https://raw.githubusercontent.com/JuneLeGency/dexfinder/main/install.sh | bash
Go installieren:```bash go install github.com/JuneLeGency/dexfinder/cmd/dexfinder@latest
**Binärdatei**: herunterladen von [Releases](https://github.com/JuneLeGency/dexfinder/releases).
## Schnellstart```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
Das --query-Flag akzeptiert mehrere Eingabestile. dexfinder erkennt sie automatisch und konvertiert zwischen ihnen.
| Format | Beispiel | Verhalten |
|---|---|---|
| Einfacher Name | getDeviceId | Ungefähre Teilzeichenfolgen-Übereinstimmung über alle APIs hinweg |
| Java-Klasse | android.telephony.TelephonyManager | Alle Methoden/Felder dieser Klasse |
| Java-Klasse#Methode | android.telephony.TelephonyManager#getDeviceId | Alle Überladungen dieser Methode |
| Vollständige Java-Signatur | ...TelephonyManager#getDeviceId() | Exakt + Überladungs-Fallback |
| DEX/JNI-Signatur | Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String; | Nur exakte Übereinstimmung |
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"
## Output Control
Drei unabhängige Achsen, frei kombinierbar:```
--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| Wert | Beschreibung |
|---|---|
text | Klartext-Ausgabe mit farbigen Tags (Standard) |
json | JSON — Scan-Ergebnisse oder Trace mit Baum/Liste-Layout |
model | Strukturiertes JSON mit vollständigen MethodInfo/FieldInfo-Typen (für IDE/CI) |
html | In sich geschlossener HTML-Bericht mit zusammenklappbaren Bäumen und Suche |
sarif | SARIF 2.1.0 Format für statische Analyse (GitHub / VS Code) |
--layout (verwendet mit --trace)| Wert | Beschreibung |
|---|---|
tree | Zusammengeführter Baum — gemeinsame Aufrufpfade zu einem Baum zusammengefasst (Standard) |
list | Flache Liste — jeder eindeutige Aufrufpfad als unabhängiger Stack dargestellt |
--style| Wert | Beispiel | Anwendungsfall |
|---|---|---|
java | com.example.Foo.method(Foo.java) | Menschenlesbar (Standard) |
dex | Foo.method(Ljava/lang/String;)V | Präzise Signaturanalyse |
--scope (Suchbereich)Steuert, welche Art von Referenzen die Abfrage abgleicht. Dies ist entscheidend für das Verständnis der Ergebnisse.
| Wert | Was wird gesucht | Beantwortete Frage | Ausgabe-Tag |
|---|---|---|---|
all | Callee-APIs + Felder + Code-Strings | "Wer ruft diese API auf?" (Standard) | [METHOD] [FIELD] [STRING] |
callee | Nur Ziel-API-Signaturen in invoke-* / get/put-Anweisungen | "Wer ruft diese spezifische Methode/dieses spezifische Feld auf?" | [METHOD] [FIELD] |
caller | Nur die Signatur der aufrufenden Methode | "Was ruft diese Methode intern auf?" | [CALLER→] |
string | String-Konstanten in const-string-Anweisungen | "Wo wird dieser String im Code verwendet?" | [STRING] |
string-table | Code-Strings + vollständige DEX-String-Tabelle | "Existiert dieser String irgendwo im DEX?" (beinhaltet Annotationen, toten Code) | [STRING] [STRING_TABLE] |
everything | Alle oben genannten kombiniert | Gesamtbild | alle Tags |
Callee vs. Caller verstehen:``` 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` (Standard) = `callee` + `string`. Die `caller`-Richtung ist bewusst vom Standard ausgeschlossen, da sie eine grundlegend andere Frage beantwortet. Verwenden Sie `--scope=caller` oder `--scope=everything` explizit, wenn Sie dies benötigen.
**Ausgabe-Tags verstehen:**