Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
dexfinder — Plattformübergreifender APK/DEX-Methodenfinder mit Aufrufkettenverfolgung, ProGuard-Entschleierung und Erkennung versteckter APIs | Kitploit
Tools/GitHubGitHub/junelegency/dexfinder
Android-SicherheitStatische AnalyseSchwachstellenanalyseCode-AnalyseReverse EngineeringInformationsbeschaffungDevSecOpsMobile SicherheitBinäranalyse
GitHubjunelegency/dexfinder

dexfinder

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

92103vor 4 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen

dexfinder

Englisch | Chinesisch | Webseite dexfinder demo


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.

Funktionen

  • APK/DEX/JAR-Scanning — Analysiert DEX-Bytecode, extrahiert alle Methoden-/Feld-/String-Referenzen
  • Multi-Format-Suche — Suche nach Java-Name, DEX/JNI-Signatur oder einfachem Schlüsselwort
  • Aufrufkettenverfolgung — Verfolgt Aufrufer bis zu N Ebenen tief, zusammengeführter Baum oder flache Liste, mit Zyklenerkennung
  • ProGuard/R8-Entobfuskierung — Lädt mapping.txt, zeigt ursprüngliche Namen neben obfuskierten an
  • Erkennung verborgener APIs — Lädt hiddenapi-flags.csv, erkennt blockierte/nicht unterstützte APIs
  • Reflexionserkennung — Kreuzvergleich von Klassen × Strings zur Erkennung reflexionsbasierter Nutzung verborgener APIs
  • Flexible Ausgabe — text / json / model / html / sarif, Baum / Listen-Layout, Java / DEX-Namensstil – alle orthogonal kombinierbar
  • Farbige Terminalausgabe — Automatisch erkannte ANSI-Farben für Tags, Baumverbinder und API-Levels
  • APK-Diff — Vergleicht zwei APK/DEX-Versionen, erkennt hinzugefügte/entfernte/geänderte API-Referenzen
  • HTML-Berichte — Eigenständiges interaktives HTML mit einklappbaren Bäumen, Suche und dunklem Design
  • SARIF-Ausgabe — SARIF 2.1.0 für GitHub-Code-Scanning, VS Code und CI-Pipelines
  • CI-Integration — --fail-on blocked beendet mit Fehlercode, wenn eingeschränkte APIs gefunden werden
  • Konfigurationsdatei — .dexfinder.yaml für Projektvorgaben, CLI-Flags überschreiben
  • Keine externen Abhängigkeiten — Reines Go, eigenständiger DEX-Parser
  • Plattformübergreifend — macOS (Intel / Apple Silicon), Linux (amd64 / arm64), Windows

Installieren

Homebrew (macOS / Linux):```bash brew install junelegency/tap/dexfinder

root@kitploit:~
**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

root@kitploit:~
**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

Query Formats

Das --query-Flag akzeptiert mehrere Eingabestile. dexfinder erkennt sie automatisch und konvertiert zwischen ihnen.

All equivalent — find requestLocationUpdates in LocationManager:

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"

root@kitploit:~
## 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

--layout (verwendet mit --trace)

WertBeschreibung
treeZusammengeführter Baum — gemeinsame Aufrufpfade zu einem Baum zusammengefasst (Standard)
listFlache Liste — jeder eindeutige Aufrufpfad als unabhängiger Stack dargestellt

--style

WertBeispielAnwendungsfall
javacom.example.Foo.method(Foo.java)Menschenlesbar (Standard)
dexFoo.method(Ljava/lang/String;)VPräzise Signaturanalyse

--scope (Suchbereich)

Steuert, welche Art von Referenzen die Abfrage abgleicht. Dies ist entscheidend für das Verständnis der Ergebnisse.

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()

root@kitploit:~
`--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:**

| Tag | Bedeutung |
|---|---|
| `[METHOD]` | Eine Methode, die **aufgerufen wird**, stimmt mit Ihrer Abfrage überein (Callee-Übereinstimmung). Eingerückte Zeilen sind die Aufrufer. |
| `[FIELD]` | Ein Feld, auf das **zugegriffen wird**, stimmt mit Ihrer Abfrage überein. Eingerückte Zeilen sind die Zugreifenden. |
| `[CALLER→]` | Eine **aufrufende Methode** stimmt mit Ihrer Abfrage überein. Die eingerückte Zeile zeigt, welche API aufgerufen wird. |
| `[STRING]` | Eine Zeichenfolgenkonstante im Code stimmt mit Ihrer Abfrage überein. Eingerückte Zeilen zeigen, wo sie verwendet wird. |
| `[STRING_TABLE]` | Die Zeichenfolge existiert in der DEX-String-Tabelle, hat aber keinen `const-string`-Verweis im Code (möglicherweise in Annotationen, durch R8 optimiert usw.) |

## Beispiele

### 1. APK-Statistiken scannen```bash
dexfinder --dex-file app.apk --stats
root@kitploit:~
Loaded 31 DEX file(s): 183913 classes, 1250566 method refs
Method references: 680610
Field references:  625572
String constants:  654353
Referenced types:  192586
Time: 3.9s

2. Finde alle Standortverfolgungsaufrufe```bash

dexfinder --dex-file app.apk --query "requestLocationUpdates"

root@kitploit:~

[METHOD] Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V (3 ref) Lcom/example/TestEntry;->init(Landroid/content/Context;)V (2 occurrences) Lcom/example/service/LocationService;->onStartCommand(Landroid/content/Intent;II)I

root@kitploit:~
### 3. Ablaufverfolgung von Aufrufketten — Baumansicht```bash
dexfinder --dex-file app.apk \
  --query "Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;" \
  --trace --depth 5
root@kitploit:~
android.telephony.TelephonyManager.getDeviceId()
└── com.example.aopsdk.TelephonyManager.getDeviceId(TelephonyManager.java)
    ├── com.example.session.PhoneInfo.getImei(PhoneInfo.java)
    ├── com.example.logging.ClientIdHelper.initClientId(ClientIdHelper.java)
    │   └── com.example.logging.ContextInfo.<init>(ContextInfo.java)
    │       ├── com.example.logging.LogStrategyManager.getInstance(LogStrategyManager.java)
    │       └── com.example.logging.LogContextImpl.<init>(LogContextImpl.java)
    ├── com.example.msp.DeviceInfo.k(DeviceInfo.java)
    │   └── com.example.msp.DeviceInfo.<init>(DeviceInfo.java)
    │       └── com.example.msp.DeviceInfo.getInstance(DeviceInfo.java)
    │           ├── com.example.msp.TidHelper.getIMEI(TidHelper.java)
    │           ├── com.example.msp.TidHelper.getIMSI(TidHelper.java)
    │           └── com.example.msp.DeviceCollector.collectData(DeviceCollector.java)
    └── com.example.weex.WXEnvironment.getDevId(WXEnvironment.java)
        └── com.example.weex.WXEnvironment.<clinit>(WXEnvironment.java)

4. Ablaufverfolgung von Aufrufketten — Listenansicht (Java-Absturzstil)```bash

dexfinder --dex-file app.apk
--query "Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;"
--trace --depth 5 --layout list

root@kitploit:~

--- Call chain #1 for android.telephony.TelephonyManager.getDeviceId() --- at com.example.session.PhoneInfo.getImei(PhoneInfo.java) at com.example.aopsdk.TelephonyManager.getDeviceId(TelephonyManager.java) at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java)

--- Call chain #2 for android.telephony.TelephonyManager.getDeviceId() --- at com.example.logging.LogStrategyManager.getInstance(LogStrategyManager.java) at com.example.logging.ContextInfo.(ContextInfo.java) at com.example.logging.ClientIdHelper.initClientId(ClientIdHelper.java) at com.example.aopsdk.TelephonyManager.getDeviceId(TelephonyManager.java) at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java)

root@kitploit:~
### 5. Trace mit DEX-Signaturstil```bash
dexfinder --dex-file app.apk --query "getDeviceId" --trace --depth 3 --style dex
root@kitploit:~
Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
└── TelephonyManager.getDeviceId(Landroid/telephony/TelephonyManager;)Ljava/lang/String;
    ├── PhoneInfo.getImei(Landroid/content/Context;)Ljava/lang/String;
    ├── ClientIdHelper.initClientId(Landroid/content/Context;)Ljava/lang/String;
    └── DeviceInfo.k(Landroid/content/Context;)V

6. JSON-Ausgabe — Baum```bash

dexfinder --dex-file app.apk --query "getDeviceId" --trace --depth 2 --format json

root@kitploit:~
```json
{
  "targets": [{
    "api": "android.telephony.TelephonyManager.getDeviceId()",
    "tree": {
      "method": "android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java)",
      "callers": [
        { "method": "com.example.aopsdk.TelephonyManager.getDeviceId(TelephonyManager.java)",
          "callers": [
            { "method": "com.example.session.PhoneInfo.getImei(PhoneInfo.java)" },
            { "method": "com.example.logging.ClientIdHelper.initClientId(ClientIdHelper.java)" }
          ]}
      ]
    }
  }]
}

7. JSON-Ausgabe — Liste```bash

dexfinder --dex-file app.apk --query "getDeviceId" --trace --depth 2 --format json --layout list

root@kitploit:~
```json
{
  "targets": [{
    "api": "android.telephony.TelephonyManager.getDeviceId()",
    "chains": [
      ["com.example.session.PhoneInfo.getImei(PhoneInfo.java)",
       "com.example.aopsdk.TelephonyManager.getDeviceId(TelephonyManager.java)",
       "android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java)"],
      ["com.example.logging.ClientIdHelper.initClientId(ClientIdHelper.java)",
       "com.example.aopsdk.TelephonyManager.getDeviceId(TelephonyManager.java)",
       "android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java)"]
    ]
  }]
}

8. Strukturierte Modellausgabe (für CI/IDE)```bash

dexfinder --dex-file app.apk --query "getDeviceId" --trace --format model | jq '.call_chains[0]'

root@kitploit:~
```json
{
  "target": "Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;",
  "chain": [
    { "method": { "dex_signature": "...", "class": "...", "name": "getImei",
                   "param_types": ["Landroid/content/Context;"], "return_type": "Ljava/lang/String;",
                   "java_readable": "com.example.session.PhoneInfo.getImei(...)" }},
    { "method": { "dex_signature": "...", "java_readable": "...TelephonyManager.getDeviceId(...)" }},
    { "method": { "dex_signature": "...", "java_readable": "...TelephonyManager.getDeviceId(...)" }}
  ],
  "depth": 2
}

9. ProGuard/R8-Mapping — Abfrage und Anzeige

Mit --mapping unterstützen sowohl Eingabe als auch Ausgabe originale (nicht verschleierte) Namen.

Abfrage nach originalem Namen → automatische Umwandlung in verschleierten Namen für DEX-Suche:```bash

Query with original simple class name (mapping converts "KotlinCases" → "LJ7;" internally)

dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt

Query with original Java full name

dexfinder --dex-file app.apk --query "com.example.app.utils.Helper" --mapping mapping.txt

Query with obfuscated name still works

dexfinder --dex-file app.apk --query "LJ7;" --mapping mapping.txt

root@kitploit:~
**Ausgabe deobfuszierten Namen in der Ablaufverfolgung:**```bash
# Tree trace with deobfuscated names
dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --trace --depth 3
root@kitploit:~
com.example.kotlin.KotlinCases$$ExternalSyntheticLambda1.<init>(int)
└── com.example.TestEntry.runAllTests(TestEntry.java)
    └── com.example.MainActivity.onCreate(MainActivity.java)

Zeige sowohl obfuskatierte als auch ursprüngliche Namen:```bash dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --show-obf --trace

root@kitploit:~

com.example.kotlin.KotlinCases.fetchLocationAsync(KotlinCases.java) └── com.example.kotlin.KotlinCases$testCoroutines$3.invokeSuspend(KotlinCases.java) [obf: G7.e] └── com.example.kotlin.KotlinCases$testCoroutines$3.create(KotlinCases.java) [obf: G7.b]

root@kitploit:~
**Alle Kombinationen mit anderen Flags:**```bash
# Original name + trace as flat list
dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --trace --layout list

# Original name + DEX signature style
dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --trace --style dex

# Original name + JSON tree + show-obf
dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --show-obf --trace --format json

# Original name + reverse direction (what does this class call?)
dexfinder --dex-file app.apk --query "com.example.kotlin.KotlinCases" --mapping mapping.txt --scope caller

Input × Output matrix:

10. Erkennung verborgener APIs```bash

Download CSV (one-time)

curl -o hiddenapi-flags.csv
https://dl.google.com/developers/android/baklava/non-sdk/hiddenapi-flags.csv

Full scan — linking + reflection detection

dexfinder --dex-file app.apk --api-flags hiddenapi-flags.csv

root@kitploit:~

#1: Linking unsupported Lsun/misc/Unsafe;->allocateInstance(Ljava/lang/Class;)Ljava/lang/Object; use(s): Lcom/google/gson/internal/UnsafeAllocator;->create()Lcom/google/gson/internal/UnsafeAllocator;

#2: Reflection blocked Landroid/location/ILocationManager;->getCurrentLocation potential use(s): Lcom/example/monitor/LocationMonitor;->hookSystemLocationManager(Landroid/content/Context;)V

root@kitploit:~
### 11. Suchstring-Konstanten (content:// URIs, API-Schlüssel usw.)```bash
# Find content:// URIs in code
dexfinder --dex-file app.apk --query "content://com.android.contacts" --scope string

# Include strings only in DEX table (optimized out by R8, annotations, etc.)
dexfinder --dex-file app.apk --query "content://com.android.contacts" --scope everything
root@kitploit:~
[STRING] "content://com.android.contacts/" (1 ref)
       Lcom/example/imageloader/BaseImageDownloader;->getStreamFromContent(Ljava/lang/String;)Ljava/io/InputStream;
[STRING_TABLE] "content://com.android.contacts" (in DEX string table, no code reference found)

12. Nach Klassenpräfix filtern```bash

Only scan classes in your own package

dexfinder --dex-file app.apk --query "getDeviceId" --class-filter "Lcom/mycompany/"

Scan multiple packages

dexfinder --dex-file app.apk --query "getDeviceId" --class-filter "Lcom/mycompany/,Lcom/mylib/"

root@kitploit:~
### 13. Alles kombinieren```bash
# Deobfuscated JSON tree of location API usage, filtered to your code
dexfinder --dex-file app.apk \
  --query "android.location.LocationManager#requestLocationUpdates" \
  --trace --depth 8 \
  --format json --layout tree --style java \
  --mapping mapping.txt --show-obf \
  --class-filter "Lcom/mycompany/"

14. HTML-Bericht```bash

dexfinder --dex-file app.apk --query "getDeviceId" --trace --format html --output report.html

root@kitploit:~
Öffnet in jedem Browser – einklappbare Aufrufbäume, Suchleiste, dunkles Thema.

### 15. SARIF für GitHub Code Scanning```bash
dexfinder --dex-file app.apk --api-flags hiddenapi-flags.csv --format sarif > results.sarif
# Upload to GitHub:
# gh api repos/OWNER/REPO/code-scanning/sarifs -f "[email protected]"

16. APK diff```bash

Compare two APK versions

dexfinder --dex-file new.apk --diff old.apk --query "getDeviceId"

root@kitploit:~
  • 1 added method(s)
    • Lcom/new/Feature;->trackDevice()V
  • 1 removed method(s)
    • Lcom/old/Legacy;->getIMEI()V

Summary: +1 added, -1 removed, ~0 changed

root@kitploit:~
### 17. CI-Gate mit --fail-on```bash
# Fail CI if any blocked hidden APIs are used
dexfinder --dex-file app.apk --api-flags hiddenapi-flags.csv --fail-on blocked
# Exit code: 0 = clean, 2 = violations found

Performance

Gemessen auf Apple M-Serie, Einzelthread:

Verglichen mit veridex (C++, ungenauer Modus) auf derselben ~300MB APK:

  • veridex präzise: 27s (keine Reflexion über Binder/AIDL)
  • veridex ungenau: >32 min (abgebrochen, Explosion des kartesischen Produkts)
  • dexfinder: 5.4s (Reverse-Index-Optimierung)

Alle Optionen

Konfigurationsdatei

Erstelle .dexfinder.yaml im Projektstammverzeichnis, um Standardwerte festzulegen:```yaml mapping: ./build/outputs/mapping.txt class-filter: "Lcom/mycompany/" api-flags: ./hiddenapi-flags.csv style: java depth: 8 color: auto

root@kitploit:~
CLI flags überschreiben immer Konfigurationsdateiwerte.

## Erstellen aus dem Quellcode```bash
git clone https://github.com/JuneLeGency/dexfinder.git
cd dexfinder
go build -o dexfinder ./cmd/dexfinder/
go test ./...

Lizenz

Apache Lizenz 2.0


dexfinder

Offizielle Website: junelegency.github.io/dexfinder

Plattformübergreifender APK/DEX Methoden- und Feldreferenz-Finder mit Unterstützung für Aufrufkettenverfolgung, ProGuard/R8-Entschleierung und Android Hidden API Erkennung.

Basiert auf dem Android veridex-Prinzip, neu implementiert und erweitert in Go: schnellere Reflexionserkennung, mehrschichtige Aufrufkettenverfolgung (veridex nur eine Schicht), flexible Ausgabeformate.

Funktionen

  • APK/DEX/JAR-Scan — Analysiert DEX-Bytecode, extrahiert alle Methoden-/Feld-/String-Referenzen
  • Mehrformat-Abfrage — Unterstützt Java-Klassennamen, DEX/JNI-Signaturen, einfache Schlüsselwörter
  • Aufrufkettenverfolgung — Verfolgt N Ebenen von Aufrufern nach oben, konsolidierter Baum oder erweiterte Liste, automatische Erkennung von Rekursionsschleifen
  • ProGuard/R8-Entschleierung — Lädt mapping.txt, zeigt ursprüngliche Namen an
  • Hidden API Erkennung — Lädt hiddenapi-flags.csv, erkennt blockierte/nicht unterstützte APIs
  • Reflexionserkennung — Kreuzvergleich von Klassennamen und Strings, findet reflektierte Hidden APIs (kompatibel mit veridex)
  • Flexible Ausgabe — text / json / model / html / sarif Formate, tree / list Layout, java / dex Namensstil – orthogonale Kombination
  • Farbige Terminalausgabe — Automatische TTY-Erkennung, farbige Tags, Baumlinien, API-Level
  • APK-Differenzvergleich — Vergleicht zwei APK-Versionen, erkennt hinzugefügte/entfernte/geänderte API-Referenzen
  • HTML-Bericht — Eigenständiges interaktives HTML, einklappbare Bäume, Suchfilter, dunkles Thema
  • SARIF-Ausgabe — SARIF 2.1.0 Format, unterstützt GitHub Code Scanning, VS Code
  • CI-Integration — --fail-on blocked gibt bei Erkennung eingeschränkter APIs einen Nicht-Null-Exit-Code zurück
  • Konfigurationsdatei — .dexfinder.yaml Projektstandardkonfiguration, überschreibbar durch Befehlszeilenparameter
  • Keine externen Abhängigkeiten — Reine Go-Implementierung, eigenständiger DEX-Parser
  • Plattformübergreifend — macOS (Intel / Apple Silicon), Linux (amd64 / arm64), Windows

Installation

Homebrew (macOS / Linux):```bash brew install junelegency/tap/dexfinder

root@kitploit:~
**Skriptinstallation** (automatisches Erkennungssystem):```bash
curl -sSL https://raw.githubusercontent.com/JuneLeGency/dexfinder/main/install.sh | bash

Go Installation:```bash go install github.com/JuneLeGency/dexfinder/cmd/dexfinder@latest

root@kitploit:~
**Binärer Download**: [Releases](https://github.com/JuneLeGency/dexfinder/releases)

## Schnellstart```bash
# 查看 APK 概况
dexfinder --dex-file app.apk --stats

# 查找所有 getDeviceId 调用(获取 IMEI)
dexfinder --dex-file app.apk --query "getDeviceId"

# 追踪调用链(合并树形视图)
dexfinder --dex-file app.apk --query "getDeviceId" --trace

# 追踪调用链(展开为独立调用栈)
dexfinder --dex-file app.apk --query "getDeviceId" --trace --layout list

# 用精确 JNI 签名查询
dexfinder --dex-file app.apk \
  --query "Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;" \
  --trace --depth 8

Abfrageformat (--query)

Ausgabesteuerung

Drei unabhängige Dimensionen, frei kombinierbar:``` --format (text / json / model / html / sarif) 输出什么 --layout (tree / list) 怎么排列调用链 --style (java / dex) 怎么显示名称 --color (auto / always / never) 终端着色

root@kitploit:~
### `--layout` Vergleich (mit `--trace`)

**tree** — gemeinsame Pfade zusammenführen, ein Baum zeigt die Übersicht:```
android.telephony.TelephonyManager.getDeviceId()
└── ...aopsdk...TelephonyManager.getDeviceId(TelephonyManager.java)
    ├── PhoneInfo.getImei(PhoneInfo.java)
    ├── ClientIdHelper.initClientId(ClientIdHelper.java)
    │   └── ContextInfo.<init>(ContextInfo.java)
    └── DeviceInfo.k(DeviceInfo.java)
        └── DeviceInfo.getInstance(DeviceInfo.java)
            ├── TidHelper.getIMEI(TidHelper.java)
            └── DeviceCollector.collectData(DeviceCollector.java)

list — jede Kette unabhängig anzeigen (Java-Crash-Stil):``` --- Call chain #1 --- at PhoneInfo.getImei(PhoneInfo.java) at ...aopsdk...TelephonyManager.getDeviceId(TelephonyManager.java) at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java)

--- Call chain #2 --- at ContextInfo.(ContextInfo.java) at ClientIdHelper.initClientId(ClientIdHelper.java) at ...aopsdk...TelephonyManager.getDeviceId(TelephonyManager.java) at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java)

root@kitploit:~
### `--style` Vergleich

**java** (Standard): `com.example.Foo.method(Foo.java)`
**dex**: `Foo.method(Ljava/lang/String;)V`

### JSON Ausgabe```bash
# JSON 树
dexfinder --dex-file app.apk --query "getDeviceId" --trace --format json

# JSON 列表
dexfinder --dex-file app.apk --query "getDeviceId" --trace --format json --layout list

--scope Suchbereich

Steuert, welcher Referenztyp bei der Abfrage übereinstimmen soll. Das Verständnis dieses Parameters ist entscheidend für die korrekte Interpretation der Ergebnisse.

Unterschied zwischen callee und caller:``` scope=callee: "谁调了 finish()?" onCreate ──调用──→ finish() ← 显示这些调用者 onResume ──调用──→ finish()

scope=caller: "finish() 内部调了什么?" finish() ──调用──→ Log.i() ← 显示这些被调用者 finish() ──调用──→ super.finish()

root@kitploit:~
`--scope=all`(Standard)= `callee` + `string`. Die `caller`-Richtung wurde bewusst vom Standard ausgeschlossen, da sie eine ganz andere Frage beantwortet. Aktivieren Sie sie explizit mit `--scope=caller` oder `--scope=everything`, wenn nötig.

**Bedeutung der Ausgabekennzeichnungen:**

| Kennzeichnung | Bedeutung |
|---|---|
| `[METHOD]` | Die gesuchte Methode **wird von jemand anderem aufgerufen**. Die eingerückte Zeile ist der Aufrufer. |
| `[FIELD]` | Das gesuchte Feld **wird von jemand anderem zugegriffen**. Die eingerückte Zeile ist der Zugreifende. |
| `[CALLER→]` | Der gesuchte Methodenname erscheint in einem **Aufrufer**, die eingerückte Zeile zeigt, welche API aufgerufen wird. |
| `[STRING]` | Ein String-Literal im Code stimmt überein. Die eingerückte Zeile ist die Methode, die diesen String verwendet. |
| `[STRING_TABLE]` | Der String existiert nur in der DEX-String-Tabelle, es gibt keine `const-string`-Referenz im Code (möglicherweise in Annotationen, von R8 optimiert usw.). |

## Weitere Verwendung

### Deobfuskierung (--mapping)

Nach dem Laden von `--mapping` unterstützen **Eingabe und Ausgabe** die ursprünglichen (nicht obfuskierten) Namen.

**Abfrage mit ursprünglichem Namen → automatische Umwandlung in obfuskierten Namen für die DEX-Suche:**```bash
# 用原始简短类名查(mapping 内部将 "KotlinCases" 转为 "LJ7;")
dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt

# 用原始 Java 全名查
dexfinder --dex-file app.apk --query "com.example.app.utils.Helper" --mapping mapping.txt

# 用混淆名查也正常工作
dexfinder --dex-file app.apk --query "LJ7;" --mapping mapping.txt

Ausgabe-Entschleierungsname:```bash

trace 树形 + 反混淆

dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --trace

root@kitploit:~
**Gleichzeitig den obfuskierten Namen und den ursprünglichen Namen anzeigen:**```bash
dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --show-obf --trace
root@kitploit:~
com.example.KotlinCases.fetchLocationAsync(KotlinCases.java)
└── com.example.KotlinCases$testCoroutines$3.invokeSuspend(KotlinCases.java)  [obf: G7.e]

Frei kombinierbar mit anderen Parametern:```bash

原始名 + 展开列表

dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --trace --layout list

原始名 + DEX 签名风格

dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --trace --style dex

原始名 + JSON 树 + 显示混淆名

dexfinder --dex-file app.apk --query "KotlinCases" --mapping mapping.txt --show-obf --trace --format json

原始名 + 反向查看(这个类内部调了什么)

dexfinder --dex-file app.apk --query "com.example.KotlinCases" --mapping mapping.txt --scope caller

root@kitploit:~
**Eingabe×Ausgabe-Matrix:**

| Abfrageeingabe | Kein Mapping | `--mapping` | `--mapping --show-obf` |
|---|---|---|---|
| Verschleierter Name `LJ7;` | ✓ Verschleierte Ausgabe | ✓ Entschleierte Ausgabe | ✓ Beide nebeneinander |
| Originaler Kurzname `KotlinCases` | ✗ Nicht gefunden | ✓ Automatische Konvertierung + entschleierte Ausgabe | ✓ Automatische Konvertierung + beide nebeneinander |
| Originaler vollständiger Name `com.example...` | ✗ Nicht gefunden | ✓ Automatische Konvertierung + entschleierte Ausgabe | ✓ Automatische Konvertierung + beide nebeneinander |

### Hidden-API-Erkennung```bash
# 下载 CSV(一次性)
curl -o hiddenapi-flags.csv \
  https://dl.google.com/developers/android/baklava/non-sdk/hiddenapi-flags.csv

# 全量检测(直接链接 + 反射检测)
dexfinder --dex-file app.apk --api-flags hiddenapi-flags.csv

Zeichenkettensuche```bash

搜索代码中的 content:// URI

dexfinder --dex-file app.apk --query "content://com.android.contacts" --scope string

包含被 R8 优化掉的字符串(注解、死代码等)

dexfinder --dex-file app.apk --query "content://com.android.contacts" --scope everything

root@kitploit:~
### Nach Paketnamen filtern```bash
# 只扫描自己的代码
dexfinder --dex-file app.apk --query "getDeviceId" --class-filter "Lcom/mycompany/"

Kombinierte Nutzung```bash

反混淆 + JSON 树形输出 + 定位 API 调用 + 过滤自己的代码

dexfinder --dex-file app.apk
--query "android.location.LocationManager#requestLocationUpdates"
--trace --depth 8
--format json --layout tree --style java
--mapping mapping.txt --show-obf
--class-filter "Lcom/mycompany/"

root@kitploit:~
### HTML-Bericht```bash
dexfinder --dex-file app.apk --query "getDeviceId" --trace --format html --output report.html

Direkt im Browser nutzbar – zusammenklappbarer Aufrufbaum, Suchleiste, dunkles Thema.

SARIF (GitHub Code Scanning)```bash

dexfinder --dex-file app.apk --api-flags hiddenapi-flags.csv --format sarif > results.sarif

root@kitploit:~
### APK Versionsvergleich```bash
dexfinder --dex-file new.apk --diff old.apk --query "getDeviceId"
root@kitploit:~
+ 1 added method(s)
  + Lcom/new/Feature;->trackDevice()V

- 1 removed method(s)
  - Lcom/old/Legacy;->getIMEI()V

Summary: +1 added, -1 removed, ~0 changed

CI-Gate```bash

检测到 blocked API 时 CI 失败

dexfinder --dex-file app.apk --api-flags hiddenapi-flags.csv --fail-on blocked

退出码: 0 = 通过, 2 = 有违规

root@kitploit:~
## Leistung

Apple M-Serie Chips, Single-Thread:

| APK Größe | DEX Anzahl | Klassenanzahl | Methodenreferenzen | Scan | Hidden API |
|---|---|---|---|---|---|
| ~1 MB | 1 | ~2K | ~18K | **24ms** | — |
| ~10 MB | 2 | ~25K | ~100K | **335ms** | — |
| ~300 MB | 30+ | ~180K | ~1.2M | **3.9s** | **5.4s** |

Vergleich mit veridex (C++) auf demselben ~300MB APK:
- veridex precise: **27s** (kann Binder/AIDL-Reflexion nicht verfolgen)
- veridex imprecise: **>32 Minuten** (kartesisches Produkt explodiert, gekillt)
- **dexfinder: 5.4s** (optimiert mit invertiertem Index)

## Alle Parameter

| Parameter | Beschreibung | Standardwert |
|---|---|---|
| `--dex-file` | APK/DEX/JAR Dateipfad **(erforderlich)** | — |
| `--query` | Suchschlüsselwort (Java / DEX/JNI / einfacher Name) | — |
| `--trace` | Aufrufkettenverfolgung aktivieren (erfordert `--query`) | `false` |
| `--depth` | Maximale Tiefe der Aufrufkette | `5` |
| `--layout` | Verfolgungslayout: `tree` (zusammengeführter Baum) oder `list` (erweiterte Liste) | `tree` |
| `--style` | Namensstil: `java` (lesbar) oder `dex` (JNI-Signatur) | `java` |
| `--format` | Ausgabeformat: `text`, `json`, `model`, `html`, `sarif` | `text` |
| `--output` | Ausgabe in Datei statt stdout | — |
| `--color` | Farbmodus: `auto`, `always`, `never` | `auto` |
| `--mapping` | ProGuard/R8 mapping.txt Pfad | — |
| `--show-obf` | Gleichzeitig verschleierte und entverschleierte Namen anzeigen | `false` |
| `--api-flags` | hiddenapi-flags.csv Pfad | — |
| `--class-filter` | Klassendeskriptor-Präfixfilter (kommagetrennt) | — |
| `--exclude-api-lists` | Ausgeschlossene API-Stufen | — |
| `--scope` | Suchbereich: `all`, `callee`, `caller`, `string`, `string-table`, `everything` | `all` |
| `--diff` | Vergleich mit einem anderen APK/DEX, zeigt API-Unterschiede | — |
| `--fail-on` | Gibt einen Exit-Code ungleich Null zurück, wenn API der angegebenen Stufe erkannt wird (CI-Gate) | — |
| `--stats` | Nur statistische Zusammenfassung anzeigen | `false` |
| `--version` | Versionsnummer anzeigen | `false` |

### Konfigurationsdatei

Erstelle `.dexfinder.yaml` im Projektstammverzeichnis zum Festlegen von Standardwerten:```yaml
mapping: ./build/outputs/mapping.txt
class-filter: "Lcom/mycompany/"
api-flags: ./hiddenapi-flags.csv
style: java
depth: 8
color: auto

Befehlszeilenargumente überschreiben immer die Konfigurationsdatei.

Build aus dem Quellcode```bash

git clone https://github.com/JuneLeGency/dexfinder.git cd dexfinder go build -o dexfinder ./cmd/dexfinder/ go test ./...

root@kitploit:~
## Lizenz

Apache License 2.0
Tool herunterladen
FormatBeispielVerhalten
Einfacher NamegetDeviceIdUngefähre Teilzeichenfolgen-Übereinstimmung über alle APIs hinweg
Java-Klasseandroid.telephony.TelephonyManagerAlle Methoden/Felder dieser Klasse
Java-Klasse#Methodeandroid.telephony.TelephonyManager#getDeviceIdAlle Überladungen dieser Methode
Vollständige Java-Signatur...TelephonyManager#getDeviceId()Exakt + Überladungs-Fallback
DEX/JNI-SignaturLandroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;Nur exakte Übereinstimmung
WertBeschreibung
textKlartext-Ausgabe mit farbigen Tags (Standard)
jsonJSON — Scan-Ergebnisse oder Trace mit Baum/Liste-Layout
modelStrukturiertes JSON mit vollständigen MethodInfo/FieldInfo-Typen (für IDE/CI)
htmlIn sich geschlossener HTML-Bericht mit zusammenklappbaren Bäumen und Suche
sarifSARIF 2.1.0 Format für statische Analyse (GitHub / VS Code)
WertWas wird gesuchtBeantwortete FrageAusgabe-Tag
allCallee-APIs + Felder + Code-Strings"Wer ruft diese API auf?" (Standard)[METHOD] [FIELD] [STRING]
calleeNur Ziel-API-Signaturen in invoke-* / get/put-Anweisungen"Wer ruft diese spezifische Methode/dieses spezifische Feld auf?"[METHOD] [FIELD]
callerNur die Signatur der aufrufenden Methode"Was ruft diese Methode intern auf?"[CALLER→]
stringString-Konstanten in const-string-Anweisungen"Wo wird dieser String im Code verwendet?"[STRING]
string-tableCode-Strings + vollständige DEX-String-Tabelle"Existiert dieser String irgendwo im DEX?" (beinhaltet Annotationen, toten Code)[STRING] [STRING_TABLE]
everythingAlle oben genannten kombiniertGesamtbildalle Tags
Query inputNo mapping--mapping--mapping --show-obf
Verschleiert: LJ7;✓ verschleierte Ausgabe✓ entschleierte Ausgabe✓ beide Namen
Original einfach: KotlinCases✗ nicht gefunden✓ automatische Konvertierung, entschleierte Ausgabe✓ automatische Konvertierung, beide Namen
Original vollständig: com.example...KotlinCases✗ nicht gefunden✓ automatische Konvertierung, entschleierte Ausgabe✓ automatische Konvertierung, beide Namen
APK-GrößeDEX-DateienKlassenMethodenreferenzenScanVersteckte API
~1 MB1~2K~18K24ms—
~10 MB2~25K~100K335ms—
~300 MB30+~180K~1.2M3.9s5.4s
FlagBeschreibungStandard
--dex-fileAPK/DEX/JAR-Datei zur Analyse (erforderlich)—
--querySuchbegriff (Java, DEX/JNI oder einfacher Name)—
--traceAktiviert Aufrufketten-Tracing (erfordert --query)false
--depthMaximale Tiefe der Aufrufkette5
--layoutTrace-Layout: tree oder listtree
--styleNamensstil: java oder dexjava
--formatAusgabeformat: text, json, model, html, sariftext
--outputAusgabe in Datei statt stdout schreiben—
--colorFarbmodus: auto, always, neverauto
--mappingPfad zu ProGuard/R8 mapping.txt—
--show-obfZeigt verschleierte Namen neben entschleierten anfalse
--api-flagsPfad zu hiddenapi-flags.csv—
--class-filterKommagetrennte Präfixe von Klassen-Deskriptoren—
--exclude-api-listsVon der Berichterstattung auszuschließende API-Listen—
--scopeSuchumfang: all, callee, caller, string, string-table, everythingall
--diffVergleiche mit einer anderen APK/DEX und zeige API-Unterschiede—
--fail-onGebe einen Nicht-Null-Exitcode aus, wenn versteckte APIs auf dieser Ebene gefunden werden (CI-Gate)—
--statsNur zusammenfassende Statistiken anzeigenfalse
--versionVersion anzeigenfalse
FormatBeispielVerhalten
Einfacher NamegetDeviceIdunscharfe Teilstring-Übereinstimmung
Java-Klassennameandroid.telephony.TelephonyManagerÜbereinstimmung aller Methoden dieser Klasse
Java-Klassenname#Methode...TelephonyManager#getDeviceIdÜbereinstimmung aller Überladungen dieser Methode
Vollständige Java-Signatur...#getDeviceId()exakte Übereinstimmung + Rückfall auf Überladungen
DEX/JNI-SignaturLandroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;exakte Übereinstimmung
WertSuchinhaltBeantwortete FrageAusgabe-Tag
allAufgerufene APIs + Felder + Code-Strings"Wer hat diese Methode aufgerufen?" (Standard)[METHOD] [FIELD] [STRING]
calleeNur Ziel-Signaturen in invoke-* / get/put-Anweisungen"Wer hat diese spezifische Methode/dieses Feld aufgerufen?"[METHOD] [FIELD]
callerNur Signaturen von aufrufenden Methoden"Was wurde innerhalb dieser Methode aufgerufen?"[CALLER→]
stringString-Konstanten in const-string-Anweisungen"Wo wird dieser String im Code verwendet?"[STRING]
string-tableCode-Strings + vollständige DEX-String-Tabelle"Existiert dieser String im DEX?" (einschließlich Annotationen, totem Code)[STRING] [STRING_TABLE]
everythingAlles oben GenannteVollständige AnsichtAlle Tags