Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
dexfinder — क्रॉस-प्लेटफ़ॉर्म APK/DEX मेथड खोजकर्ता जिसमें कॉल चेन ट्रेसिंग, ProGuard डीऑबफ़स्केशन, और छिपी API का पता लगाना शामिल है। | Kitploit
उपकरण/GitHubGitHub/junelegency/dexfinder
एंड्रॉइड सुरक्षास्थैतिक विश्लेषणभेद्यता विश्लेषणकोड विश्लेषणरिवर्स इंजीनियरिंगजानकारी एकत्र करनाDevSecOpsमोबाइल सुरक्षाबाइनरी विश्लेषण
GitHubjunelegency/dexfinder

dexfinder

क्रॉस-प्लेटफ़ॉर्म APK/DEX मेथड खोजकर्ता जिसमें कॉल चेन ट्रेसिंग, ProGuard डीऑबफ़स्केशन, और छिपी API का पता लगाना शामिल है।

921034 महीने पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें
रिपॉजिटरी देखें

dexfinder

अंग्रेज़ी | चीनी | वेबसाइट dexfinder प्रदर्शन


वेबसाइट: junelegency.github.io/dexfinder

क्रॉस-प्लेटफ़ॉर्म APK/DEX विधि और फ़ील्ड संदर्भ खोजकर्ता, जिसमें कॉल चेन ट्रेसिंग, ProGuard/R8 डीऑब्फस्केशन और Android छिपे API का पता लगाना शामिल है।

Android के veridex टूल से प्रेरित, Go में बढ़ी हुई क्षमताओं के साथ पुनः कार्यान्वित: तेज़ रिफ्लेक्शन डिटेक्शन, कॉल चेन ट्रेसिंग (veridex केवल एक स्तर दिखाता है), और लचीले आउटपुट प्रारूप।

विशेषताएँ

  • APK/DEX/JAR स्कैनिंग — DEX बाइटकोड पार्स करें, सभी विधि/फ़ील्ड/स्ट्रिंग संदर्भ निकालें
  • मल्टी-फ़ॉर्मेट क्वेरी — Java नाम, DEX/JNI हस्ताक्षर, या सरल कीवर्ड द्वारा खोजें
  • कॉल चेन ट्रेसिंग — कॉलर्स को N स्तरों तक ट्रेस करें, मर्ज किया गया ट्री या फ्लैट सूची, साइकिल डिटेक्शन के साथ
  • ProGuard/R8 डीऑब्फस्केशन — mapping.txt लोड करें, ऑब्फस्केटेड नामों के साथ मूल नाम प्रदर्शित करें
  • छिपे API का पता लगाना — hiddenapi-flags.csv लोड करें, ब्लॉक/असमर्थित API का पता लगाएं
  • रिफ्लेक्शन डिटेक्शन — रिफ्लेक्शन-आधारित छिपे API उपयोग को खोजने के लिए क्लास × स्ट्रिंग्स का क्रॉस-मिलान करें
  • लचीला आउटपुट — text / json / model / html / sarif, tree / list लेआउट, java / dex नाम शैली — सभी ऑर्थोगोनल
  • रंगीन टर्मिनल आउटपुट — टैग, ट्री कनेक्टर और API स्तरों के लिए स्वचालित रूप से पहचाने गए ANSI रंग
  • APK डिफ़ — दो APK/DEX संस्करणों की तुलना करें, जोड़े/हटाए/बदले गए API संदर्भों का पता लगाएं
  • HTML रिपोर्ट — स्व-निहित इंटरैक्टिव HTML जिसमें कोलैप्सिबल ट्री, खोज और डार्क थीम शामिल है
  • SARIF आउटपुट — GitHub कोड स्कैनिंग, VS Code और CI पाइपलाइनों के लिए SARIF 2.1.0
  • CI एकीकरण — --fail-on blocked प्रतिबंधित API मिलने पर गैर-शून्य कोड के साथ बाहर निकलता है
  • कॉन्फ़िग फ़ाइल — प्रोजेक्ट डिफ़ॉल्ट के लिए .dexfinder.yaml, CLI फ़्लैग ओवरराइड करता है
  • शून्य बाहरी निर्भरताएँ — शुद्ध Go, स्व-निहित DEX पार्सर
  • क्रॉस-प्लेटफ़ॉर्म — macOS (Intel / Apple Silicon), Linux (amd64 / arm64), Windows

स्थापना

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

root@kitploit:~
**Script** (स्वचालित रूप से OS/arch पहचानता है):```bash
curl -sSL https://raw.githubusercontent.com/JuneLeGency/dexfinder/main/install.sh | bash

Go इंस्टॉल करें:```bash go install github.com/JuneLeGency/dexfinder/cmd/dexfinder@latest

root@kitploit:~
**बाइनरी**: [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 स्वचालित रूप से उनका पता लगाता है और उनके बीच रूपांतरण करता है।

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:~
## आउटपुट नियंत्रण

तीन स्वतंत्र अक्ष, स्वतंत्र रूप से संयोजनीय:```
--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 (--trace के साथ प्रयुक्त)

मानविवरण
treeविलयित ट्री — साझा कॉल पथ एक ट्री में समाहित (डिफ़ॉल्ट)
listसपाट सूची — प्रत्येक अद्वितीय कॉल श्रृंखला स्वतंत्र स्टैक के रूप में दिखाई जाती है

--style

मानउदाहरणउपयोग मामला
javacom.example.Foo.method(Foo.java)मानव-पठनीय (डिफ़ॉल्ट)
dexFoo.method(Ljava/lang/String;)Vसटीक हस्ताक्षर विश्लेषण

--scope (खोज का दायरा)

यह नियंत्रित करता है कि क्वेरी किस प्रकार के संदर्भों से मेल खाती है। परिणामों को समझने के लिए यह महत्वपूर्ण है।

कैली बनाम कॉलर को समझना:``` 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` (डिफ़ॉल्ट) = `callee` + `string`। `caller` दिशा को डिफ़ॉल्ट से जानबूझकर बाहर रखा गया है क्योंकि यह एक मौलिक रूप से भिन्न प्रश्न का उत्तर देता है। जब आपको इसकी आवश्यकता हो, तो स्पष्ट रूप से `--scope=caller` या `--scope=everything` का उपयोग करें।

**आउटपुट टैग को समझना:**

| Tag | Meaning |
|---|---|
| `[METHOD]` | एक विधि **जिसे कॉल किया जा रहा है** आपकी क्वेरी से मेल खाती है (callee match)। इंडेंट की गई पंक्तियाँ caller हैं। |
| `[FIELD]` | एक फ़ील्ड **जिसे एक्सेस किया जा रहा है** आपकी क्वेरी से मेल खाती है। इंडेंट की गई पंक्तियाँ accessors हैं। |
| `[CALLER→]` | एक **कॉल करने वाली विधि** आपकी क्वेरी से मेल खाती है। इंडेंट की गई पंक्ति दिखाती है कि वह किस API को कॉल कर रही है। |
| `[STRING]` | कोड में एक स्ट्रिंग स्थिरांक आपकी क्वेरी से मेल खाता है। इंडेंट की गई पंक्तियाँ वह स्थान हैं जहाँ इसका उपयोग किया गया है। |
| `[STRING_TABLE]` | स्ट्रिंग DEX स्ट्रिंग तालिका में मौजूद है लेकिन कोड में `const-string` संदर्भ नहीं है (एनोटेशन में हो सकता है, R8 द्वारा ऑप्टिमाइज़ किया गया हो, आदि)। |

## उदाहरण

### 1. APK सांख्यिकी स्कैन करें```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. सभी स्थान ट्रैकिंग कॉल खोजें```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. कॉल चेन ट्रेस करें — ट्री दृश्य```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. कॉल श्रृंखलाओं को ट्रेस करें — सूची दृश्य (जावा क्रैश शैली)```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. DEX हस्ताक्षर शैली के साथ अनुरेखण```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 आउटपुट — वृक्ष```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 आउटपुट — सूची```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. संरचित मॉडल आउटपुट (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 के साथ, इनपुट और आउटपुट दोनों मूल (अस्पष्टीकृत) नामों का समर्थन करते हैं।

मूल नाम से क्वेरी → DEX खोज के लिए अस्पष्टीकृत नाम में स्वतः रूपांतरित होता है:```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:~
**ट्रेस में डीओबफस्केटेड नाम आउटपुट करें:**```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)

दोनों अस्पष्टित और मूल नाम दिखाएं:```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:~
**अन्य फ़्लैग के साथ सभी संयोजन:**```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

इनपुट × आउटपुट मैट्रिक्स:

10. छिपी एपीआई का पता लगाना```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. स्ट्रिंग कॉन्स्टेंट खोजें (content:// URIs, API keys, आदि.)```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. क्लास प्रीफिक्स द्वारा फ़िल्टर करें```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. सब कुछ संयोजित करें```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 रिपोर्ट```bash

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

root@kitploit:~
किसी भी ब्राउज़र में खुलता है — संकुचित कॉल ट्री, खोज बार, डार्क थीम।
### 15. SARIF for 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 अंतर```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 --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

प्रदर्शन

Apple M-श्रृंखला, एकल थ्रेड पर बेंचमार्क:

समान ~300MB APK पर veridex (C++, अपरिशुद्ध मोड) की तुलना में:

  • veridex सटीक: 27s (Binder/AIDL के माध्यम से कोई प्रतिबिंब नहीं)
  • veridex अपरिशुद्ध: >32 मिनट (समाप्त, कार्तीय गुणनफल विस्फोट)
  • dexfinder: 5.4s (विपरीत-अनुक्रमणिका अनुकूलन)

सभी विकल्प

कॉन्फ़िग फ़ाइल

डिफ़ॉल्ट सेट करने के लिए अपने प्रोजेक्ट रूट में .dexfinder.yaml बनाएं:```yaml mapping: ./build/outputs/mapping.txt class-filter: "Lcom/mycompany/" api-flags: ./hiddenapi-flags.csv style: java depth: 8 color: auto

root@kitploit:~
CLI फ़्लैग्स हमेशा कॉन्फ़िग फ़ाइल मानों को ओवरराइड करते हैं।

## स्रोत से निर्माण```bash
git clone https://github.com/JuneLeGency/dexfinder.git
cd dexfinder
go build -o dexfinder ./cmd/dexfinder/
go test ./...

लाइसेंस

Apache License 2.0


dexfinder

आधिकारिक वेबसाइट: junelegency.github.io/dexfinder

क्रॉस-प्लेटफ़ॉर्म APK/DEX विधि और फ़ील्ड संदर्भ खोजक, कॉल चेन ट्रैकिंग, ProGuard/R8 डी-ऑबफ़स्केशन, Android Hidden API डिटेक्शन को सपोर्ट करता है।

Android veridex के सिद्धांत पर आधारित, Go में पुनः कार्यान्वित और उन्नत: तेज़ परावर्तन डिटेक्शन, बहु-स्तरीय कॉल चेन ट्रैकिंग (veridex केवल एक स्तर), लचीला आउटपुट प्रारूप।

विशेषताएँ

  • APK/DEX/JAR स्कैनिंग — DEX बाइटकोड को पार्स करता है, सभी विधियों/फ़ील्ड/स्ट्रिंग संदर्भ निकालता है
  • बहु-प्रारूप क्वेरी — जावा क्लास नाम, DEX/JNI हस्ताक्षर, सरल कीवर्ड सपोर्ट करता है
  • कॉल चेन ट्रैकिंग — ऊपर की ओर N स्तरों तक कॉल करने वालों को ट्रैक करता है, मर्ज किए गए ट्री या विस्तृत सूची, स्वचालित रूप से रिकर्सन लूप का पता लगाता है
  • ProGuard/R8 डी-ऑबफ़स्केशन — mapping.txt लोड करता है, मूल नाम प्रदर्शित करता है
  • Hidden API डिटेक्शन — hiddenapi-flags.csv लोड करता है, blocked/unsupported API का पता लगाता है
  • परावर्तन डिटेक्शन — क्लास नाम × स्ट्रिंग क्रॉस-मैचिंग, परावर्तन के माध्यम से कॉल किए गए हिडन API का पता लगाता है (veridex के साथ संगत)
  • लचीला आउटपुट — text / json / model / html / sarif प्रारूप, tree / list लेआउट, java / dex नामकरण शैली — ऑर्थोगोनल कॉम्बिनेशन
  • रंगीन टर्मिनल आउटपुट — स्वचालित TTY डिटेक्शन, लेबल, ट्री कनेक्शन लाइन्स, API स्तर रंग
  • APK अंतर तुलना — दो APK संस्करणों की तुलना करता है, नए/हटाए गए/बदले गए API संदर्भों का पता लगाता है
  • HTML रिपोर्ट — स्व-निहित इंटरैक्टिव HTML, फोल्डेबल ट्री, खोज फ़िल्टर, डार्क थीम
  • SARIF आउटपुट — SARIF 2.1.0 प्रारूप, GitHub Code Scanning, VS Code सपोर्ट करता है
  • CI एकीकरण — --fail-on blocked प्रतिबंधित API का पता चलने पर गैर-शून्य निकास कोड लौटाता है
  • कॉन्फ़िगरेशन फ़ाइल — .dexfinder.yaml प्रोजेक्ट डिफ़ॉल्ट कॉन्फ़िगरेशन, कमांड-लाइन तर्कों द्वारा ओवरराइड
  • शून्य बाहरी निर्भरता — शुद्ध Go कार्यान्वयन, स्व-निहित DEX पार्सर
  • क्रॉस-प्लेटफ़ॉर्म — macOS (Intel / Apple Silicon), Linux (amd64 / arm64), Windows

स्थापना

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

root@kitploit:~
**स्क्रिप्ट इंस्टॉलेशन** (स्वचालित जाँच प्रणाली):```bash
curl -sSL https://raw.githubusercontent.com/JuneLeGency/dexfinder/main/install.sh | bash

Go स्थापना:```bash go install github.com/JuneLeGency/dexfinder/cmd/dexfinder@latest

root@kitploit:~
**बाइनरी डाउनलोड**: [Releases](https://github.com/JuneLeGency/dexfinder/releases)

## त्वरित आरंभ```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

查询格式 (--query)

输出控制

三个独立维度,自由组合:``` --format (text / json / model / html / sarif) 输出什么 --layout (tree / list) 怎么排列调用链 --style (java / dex) 怎么显示名称 --color (auto / always / never) 终端着色

root@kitploit:~
### `--layout` तुलना (`--trace` के साथ)

**tree** — सामान्य पथों को मर्ज करता है, एक पेड़ पूरा दृश्य दिखाता है:```
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 — प्रत्येक श्रृंखला को स्वतंत्र रूप से प्रदर्शित करें (Java crash शैली):``` --- 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` तुलना

**java** (डिफ़ॉल्ट): `com.example.Foo.method(Foo.java)`
**dex**: `Foo.method(Ljava/lang/String;)V`

### JSON आउटपुट```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 खोज सीमा

नियंत्रित करता है कि क्वेरी किस प्रकार के संदर्भ से मेल खाती है। परिणामों की सही व्याख्या के लिए इस पैरामीटर को समझना आवश्यक है।

callee बनाम caller का अंतर:``` scope=callee: "谁调了 finish()?" onCreate ──调用──→ finish() ← 显示这些调用者 onResume ──调用──→ finish()

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

root@kitploit:~
`--scope=all` (डिफ़ॉल्ट) = `callee` + `string`। `caller` दिशा को जानबूझकर डिफ़ॉल्ट से बाहर रखा गया है, क्योंकि यह पूरी तरह से अलग प्रश्न का उत्तर देता है। जब आवश्यक हो, `--scope=caller` या `--scope=everything` का उपयोग करके स्पष्ट रूप से सक्षम करें।

**आउटपुट टैग का अर्थः**

| टैग | अर्थ |
|---|---|
| `[METHOD]` | आपके द्वारा खोजी गई विधि **दूसरों द्वारा कॉल की गई**। इंडेंटेड पंक्तियाँ कॉल करने वाली हैं। |
| `[FIELD]` | आपके द्वारा खोजा गया फ़ील्ड **दूसरों द्वारा एक्सेस किया गया**। इंडेंटेड पंक्तियाँ एक्सेस करने वाली हैं। |
| `[CALLER→]` | आपके द्वारा खोजा गया विधि नाम किसी **कॉलर** में दिखाई देता है, इंडेंटेड पंक्तियाँ दिखाती हैं कि उसने कौन सी API कॉल की। |
| `[STRING]` | कोड में स्ट्रिंग स्थिरांक का मिलान। इंडेंटेड पंक्तियाँ उस स्ट्रिंग का उपयोग करने वाली विधि हैं। |
| `[STRING_TABLE]` | स्ट्रिंग केवल DEX स्ट्रिंग तालिका में मौजूद है, कोड में कोई `const-string` संदर्भ नहीं है (शायद एनोटेशन में, R8 द्वारा ऑप्टिमाइज़ किया गया, आदि)। |

## और उपयोग

### विघटनकरण (--mapping)

`--mapping` लोड करने के बाद, **इनपुट और आउटपुट** दोनों मूल (अव्यवस्थित) नामों का समर्थन करते हैं।

**मूल नाम से क्वेरी करें → DEX में खोजने के लिए स्वचालित रूप से अव्यवस्थित नाम में बदलें:**```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

输出反混淆名称:```bash

trace 树形 + 反混淆

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

root@kitploit:~
**सम्मिलित नाम और मूल नाम एक साथ प्रदर्शित करें:**```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]

अन्य मापदंडों के साथ स्वतंत्र रूप से संयोजित करें:```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:~
**इनपुट × आउटपुट मैट्रिक्स:**

| क्वेरी इनपुट | कोई मैपिंग नहीं | `--mapping` | `--mapping --show-obf` |
|---|---|---|---|
| अस्पष्ट नाम `LJ7;` | ✓ अस्पष्ट आउटपुट | ✓ विपरीत अस्पष्टीकरण आउटपुट | ✓ दोनों एक साथ |
| मूल संक्षिप्त नाम `KotlinCases` | ✗ नहीं मिला | ✓ स्वचालित रूपांतरण + विपरीत अस्पष्टीकरण आउटपुट | ✓ स्वचालित रूपांतरण + दोनों एक साथ |
| मूल पूरा नाम `com.example...` | ✗ नहीं मिला | ✓ स्वचालित रूपांतरण + विपरीत अस्पष्टीकरण आउटपुट | ✓ स्वचालित रूपांतरण + दोनों एक साथ |

### छिपा एपीआई पता लगाना```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

स्ट्रिंग खोज```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:~
### पैकेज नाम के अनुसार फ़िल्टर करें```bash
# 只扫描自己的代码
dexfinder --dex-file app.apk --query "getDeviceId" --class-filter "Lcom/mycompany/"

संयुक्त उपयोग```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 रिपोर्ट```bash
dexfinder --dex-file app.apk --query "getDeviceId" --trace --format html --output report.html

浏览器打开即用——可折叠调用树、搜索栏、暗色主题。

SARIF(GitHub Code Scanning)```bash

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

root@kitploit:~
### APK संस्करण तुलना```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 卡点```bash

检测到 blocked API 时 CI 失败

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

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

root@kitploit:~
## प्रदर्शन

Apple M श्रृंखला चिप, एकल-थ्रेड:

| APK आकार | DEX संख्या | क्लास की संख्या | विधि संदर्भ | स्कैन | Hidden API |
|---|---|---|---|---|---|
| ~1 MB | 1 | ~2K | ~18K | **24ms** | — |
| ~10 MB | 2 | ~25K | ~100K | **335ms** | — |
| ~300 MB | 30+ | ~180K | ~1.2M | **3.9s** | **5.4s** |

veridex (C++) के साथ समान ~300MB APK पर तुलना:
- veridex precise: **27s** (Binder/AIDL रिफ्लेक्शन को ट्रैक नहीं कर सकता)
- veridex imprecise: **>32 मिनट** (कार्टेशियन उत्पाद विस्फोट, kill कर दिया गया)
- **dexfinder: 5.4s** (रिवर्स इंडेक्स ऑप्टिमाइज़ेशन)

## सभी पैरामीटर

| पैरामीटर | विवरण | डिफ़ॉल्ट मान |
|---|---|---|
| `--dex-file` | APK/DEX/JAR फ़ाइल पथ **(आवश्यक)** | — |
| `--query` | खोज कीवर्ड (Java / DEX/JNI / सरल नाम) | — |
| `--trace` | कॉल चेन ट्रेसिंग सक्षम करें (`--query` के साथ आवश्यक) | `false` |
| `--depth` | कॉल चेन की अधिकतम गहराई | `5` |
| `--layout` | ट्रेस लेआउट: `tree` (मर्ज किया गया ट्री) या `list` (विस्तृत सूची) | `tree` |
| `--style` | नामकरण शैली: `java` (पठनीय) या `dex` (JNI सिग्नेचर) | `java` |
| `--format` | आउटपुट प्रारूप: `text`, `json`, `model`, `html`, `sarif` | `text` |
| `--output` | stdout के बजाय फ़ाइल में आउटपुट | — |
| `--color` | रंग मोड: `auto`, `always`, `never` | `auto` |
| `--mapping` | ProGuard/R8 mapping.txt पथ | — |
| `--show-obf` | अस्पष्ट और अप्रतिबंधित दोनों नाम दिखाएँ | `false` |
| `--api-flags` | hiddenapi-flags.csv पथ | — |
| `--class-filter` | क्लास डिस्क्रिप्टर उपसर्ग फ़िल्टर करें (अल्पविराम से अलग) | — |
| `--exclude-api-lists` | बहिष्कृत API स्तर | — |
| `--scope` | खोज दायरा: `all`, `callee`, `caller`, `string`, `string-table`, `everything` | `all` |
| `--diff` | दूसरे APK/DEX से तुलना करें, API अंतर दिखाएँ | — |
| `--fail-on` | निर्दिष्ट स्तर का API मिलने पर गैर-शून्य एग्ज़िट कोड (CI गेट) | — |
| `--stats` | केवल सांख्यिकीय सारांश दिखाएँ | `false` |
| `--version` | संस्करण संख्या दिखाएँ | `false` |

### कॉन्फ़िगरेशन फ़ाइल

प्रोजेक्ट रूट में `.dexfinder.yaml` बनाकर डिफ़ॉल्ट मान सेट करें:```yaml
mapping: ./build/outputs/mapping.txt
class-filter: "Lcom/mycompany/"
api-flags: ./hiddenapi-flags.csv
style: java
depth: 8
color: auto

कमांड लाइन तर्क हमेशा कॉन्फ़िगरेशन फ़ाइलों को ओवरराइड करते हैं।

स्रोत से निर्माण```bash

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

root@kitploit:~
## लाइसेंस

Apache License 2.0
टूल डाउनलोड करें
प्रारूपउदाहरणव्यवहार
सरल नामgetDeviceIdसभी API में फजी सबस्ट्रिंग मिलान
जावा वर्गandroid.telephony.TelephonyManagerउस वर्ग के सभी विधियाँ/फ़ील्ड्स
जावा वर्ग#विधिandroid.telephony.TelephonyManager#getDeviceIdउस विधि के सभी ओवरलोड
जावा पूर्ण हस्ताक्षर...TelephonyManager#getDeviceId()सटीक + ओवरलोड फ़ॉलबैक
DEX/JNI हस्ताक्षरLandroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;केवल सटीक मिलान
मानविवरण
textप्लेन टेक्स्ट आउटपुट जिसमें रंगीन टैग होते हैं (डिफ़ॉल्ट)
jsonJSON — स्कैन परिणाम या ट्रेस जिसमें ट्री/लिस्ट लेआउट होता है
modelसंरचित JSON जिसमें पूर्ण MethodInfo/FieldInfo प्रकार होते हैं (IDE/CI के लिए)
htmlस्व-निहित HTML रिपोर्ट जिसमें संकुचित होने वाले ट्री और खोज सुविधा होती है
sarifSARIF 2.1.0 स्थैतिक विश्लेषण प्रारूप (GitHub / VS Code)
मानयह क्या खोजता हैयह किस प्रश्न का उत्तर देता हैआउटपुट टैग
allकॉल किए गए APIs + फ़ील्ड + कोड स्ट्रिंग्स"यह एपीआई कौन कॉल करता है?" (डिफ़ॉल्ट)[METHOD] [FIELD] [STRING]
calleeकेवल invoke-* / get/put निर्देशों में लक्ष्य API हस्ताक्षर"यह विशिष्ट विधि/फ़ील्ड कौन कॉल करता है?"[METHOD] [FIELD]
callerकेवल कॉल करने वाली विधि का हस्ताक्षर"यह विधि आंतरिक रूप से क्या कॉल करती है?"[CALLER→]
stringconst-string निर्देशों में स्ट्रिंग स्थिरांक"यह स्ट्रिंग कोड में कहाँ उपयोग की गई है?"[STRING]
string-tableकोड स्ट्रिंग्स + पूर्ण DEX स्ट्रिंग तालिका"क्या यह स्ट्रिंग DEX में कहीं मौजूद है?" (एनोटेशन, मृत कोड शामिल है)[STRING] [STRING_TABLE]
everythingउपरोक्त सभी का संयोजनपूरी तस्वीरसभी टैग
क्वेरी इनपुटकोई मैपिंग नहीं--mapping--mapping --show-obf
अस्पष्ट: LJ7;✓ अस्पष्ट आउटपुट✓ डीऑबफस्केटेड आउटपुट✓ दोनों नाम
मूल सरल: KotlinCases✗ नहीं मिला✓ स्वचालित रूपांतरण, डीऑबफस्केटेड आउटपुट✓ स्वचालित रूपांतरण, दोनों नाम
मूल पूर्ण: com.example...KotlinCases✗ नहीं मिला✓ स्वचालित रूपांतरण, डीऑबफस्केटेड आउटपुट✓ स्वचालित रूपांतरण, दोनों नाम
APK आकारDEX फ़ाइलेंक्लासेज़विधि संदर्भस्कैनछिपा API
~1 MB1~2K~18K24ms—
~10 MB2~25K~100K335ms—
~300 MB30+~180K~1.2M3.9s5.4s
Flagविवरणडिफ़ॉल्ट
--dex-fileविश्लेषण करने के लिए APK/DEX/JAR फ़ाइल (आवश्यक)—
--queryखोज कीवर्ड (Java, DEX/JNI, या सरल नाम)—
--traceकॉल श्रृंखला ट्रेसिंग सक्षम करें (--query आवश्यक है)false
--depthअधिकतम कॉल श्रृंखला गहराई5
--layoutट्रेस लेआउट: tree या listtree
--styleनाम शैली: java या dexjava
--formatआउटपुट प्रारूप: text, json, model, html, sariftext
--outputstdout के बजाय फ़ाइल में आउटपुट लिखें—
--colorरंग मोड: auto, always, neverauto
--mappingProGuard/R8 mapping.txt पथ—
--show-obfअस्पष्टीकृत नामों को डी-ऑब्स्क्यूरेटेड के साथ दिखाएंfalse
--api-flagshiddenapi-flags.csv का पथ—
--class-filterअल्पविराम से अलग किए गए वर्ग डिस्क्रिप्टर उपसर्ग—
--exclude-api-listsरिपोर्टिंग से बाहर करने के लिए API सूचियाँ—
--scopeखोज गुंजाइश: all, callee, caller, string, string-table, everythingall
--diffकिसी अन्य APK/DEX से तुलना करें और API अंतर दिखाएं—
--fail-onयदि इस स्तर पर छिपे हुए API मिलते हैं तो गैर-शून्य निकास (CI गेट)—
--statsकेवल सारांश आँकड़े दिखाएंfalse
--versionसंस्करण दिखाएंfalse
格式示例行为
简单名称getDeviceId模糊子串匹配
Java 类名android.telephony.TelephonyManager匹配该类所有方法
Java 类名#方法...TelephonyManager#getDeviceId匹配该方法所有重载
Java 完整签名...#getDeviceId()精确匹配 + 重载回退
DEX/JNI 签名Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;精确匹配
मानखोज सामग्रीउत्तर देता है प्रश्नआउटपुट लेबल
allबुलाया गया API + फ़ील्ड + कोड स्ट्रिंग"इस विधि को किसने कॉल किया?" (डिफ़ॉल्ट)[METHOD] [FIELD] [STRING]
calleeकेवल invoke-* / get/put निर्देशों में लक्ष्य हस्ताक्षर"इस विशिष्ट विधि/फ़ील्ड को किसने कॉल किया?"[METHOD] [FIELD]
callerकेवल कॉल करने वाली विधि का हस्ताक्षर"यह विधि आंतरिक रूप से क्या कॉल करती है?"[CALLER→]
stringconst-string निर्देश में स्ट्रिंग स्थिरांक"यह स्ट्रिंग कोड में कहाँ उपयोग की गई है?"[STRING]
string-tableकोड स्ट्रिंग + DEX पूर्ण स्ट्रिंग तालिका"क्या यह स्ट्रिंग DEX में मौजूद है?" (एनोटेशन, मृत कोड सहित)[STRING] [STRING_TABLE]
everythingउपरोक्त सभीपूर्ण दृश्यसभी लेबल