
क्रॉस-प्लेटफ़ॉर्म APK/DEX मेथड खोजकर्ता जिसमें कॉल चेन ट्रेसिंग, ProGuard डीऑबफ़स्केशन, और छिपी API का पता लगाना शामिल है।
वेबसाइट: junelegency.github.io/dexfinder
क्रॉस-प्लेटफ़ॉर्म APK/DEX विधि और फ़ील्ड संदर्भ खोजकर्ता, जिसमें कॉल चेन ट्रेसिंग, ProGuard/R8 डीऑब्फस्केशन और Android छिपे API का पता लगाना शामिल है।
Android के veridex टूल से प्रेरित, Go में बढ़ी हुई क्षमताओं के साथ पुनः कार्यान्वित: तेज़ रिफ्लेक्शन डिटेक्शन, कॉल चेन ट्रेसिंग (veridex केवल एक स्तर दिखाता है), और लचीले आउटपुट प्रारूप।
--fail-on blocked प्रतिबंधित API मिलने पर गैर-शून्य कोड के साथ बाहर निकलता है.dexfinder.yaml, CLI फ़्लैग ओवरराइड करता हैHomebrew (macOS / Linux):```bash brew install junelegency/tap/dexfinder
**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
**बाइनरी**: [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 में फजी सबस्ट्रिंग मिलान |
| जावा वर्ग | android.telephony.TelephonyManager | उस वर्ग के सभी विधियाँ/फ़ील्ड्स |
| जावा वर्ग#विधि | android.telephony.TelephonyManager#getDeviceId | उस विधि के सभी ओवरलोड |
| जावा पूर्ण हस्ताक्षर | ...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"
## आउटपुट नियंत्रण
तीन स्वतंत्र अक्ष, स्वतंत्र रूप से संयोजनीय:```
--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 | संरचित JSON जिसमें पूर्ण MethodInfo/FieldInfo प्रकार होते हैं (IDE/CI के लिए) |
html | स्व-निहित HTML रिपोर्ट जिसमें संकुचित होने वाले ट्री और खोज सुविधा होती है |
sarif | SARIF 2.1.0 स्थैतिक विश्लेषण प्रारूप (GitHub / VS Code) |
--layout (--trace के साथ प्रयुक्त)| मान | विवरण |
|---|---|
tree | विलयित ट्री — साझा कॉल पथ एक ट्री में समाहित (डिफ़ॉल्ट) |
list | सपाट सूची — प्रत्येक अद्वितीय कॉल श्रृंखला स्वतंत्र स्टैक के रूप में दिखाई जाती है |
--style| मान | उदाहरण | उपयोग मामला |
|---|---|---|
java | com.example.Foo.method(Foo.java) | मानव-पठनीय (डिफ़ॉल्ट) |
dex | Foo.method(Ljava/lang/String;)V | सटीक हस्ताक्षर विश्लेषण |
--scope (खोज का दायरा)यह नियंत्रित करता है कि क्वेरी किस प्रकार के संदर्भों से मेल खाती है। परिणामों को समझने के लिए यह महत्वपूर्ण है।
| मान | यह क्या खोजता है | यह किस प्रश्न का उत्तर देता है | आउटपुट टैग |
|---|---|---|---|
all | कॉल किए गए APIs + फ़ील्ड + कोड स्ट्रिंग्स | "यह एपीआई कौन कॉल करता है?" (डिफ़ॉल्ट) | [METHOD] [FIELD] [STRING] |
callee | केवल invoke-* / get/put निर्देशों में लक्ष्य API हस्ताक्षर | "यह विशिष्ट विधि/फ़ील्ड कौन कॉल करता है?" | [METHOD] [FIELD] |
caller | केवल कॉल करने वाली विधि का हस्ताक्षर | "यह विधि आंतरिक रूप से क्या कॉल करती है?" | [CALLER→] |
string | const-string निर्देशों में स्ट्रिंग स्थिरांक | "यह स्ट्रिंग कोड में कहाँ उपयोग की गई है?" | [STRING] |
string-table | कोड स्ट्रिंग्स + पूर्ण DEX स्ट्रिंग तालिका | "क्या यह स्ट्रिंग DEX में कहीं मौजूद है?" (एनोटेशन, मृत कोड शामिल है) | [STRING] [STRING_TABLE] |
everything | उपरोक्त सभी का संयोजन | पूरी तस्वीर | सभी टैग |
कैली बनाम कॉलर को समझना:``` 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` का उपयोग करें।
**आउटपुट टैग को समझना:**
| Tag | Meaning |
|---|---|
| `[METHOD]` | एक विधि **जिसे कॉल किया जा रहा है** आपकी क्वेरी से मेल खाती है (callee match)। इंडेंट की गई पंक्तियाँ caller हैं। |
| `[FIELD]` | एक फ़ील्ड **जिसे एक्सेस किया जा रहा है** आपकी क्वेरी से मेल खाती है। इंडेंट की गई पंक्तियाँ accessors हैं। |
| `[CALLER→]` | एक **कॉल करने वाली विधि** आपकी क्वेरी से मेल खाती है। इंडेंट की गई पंक्ति दिखाती है कि वह किस API को कॉल कर रही है। |
| `[STRING]` | कोड में एक स्ट्रिंग स्थिरांक आपकी क्वेरी से मेल खाता है। इंडेंट की गई पंक्तियाँ वह स्थान हैं जहाँ इसका उपयोग किया गया है। |
| `[STRING_TABLE]` | स्ट्रिंग DEX स्ट्रिंग तालिका में मौजूद है लेकिन कोड में `const-string` संदर्भ नहीं है (एनोटेशन में हो सकता है, R8 द्वारा ऑप्टिमाइज़ किया गया हो, आदि)। |
## उदाहरण