Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/junelegency/dexfinder
أمان أندرويدالتحليل الثابتتحليل الثغرات الأمنيةتحليل الكودالهندسة العكسيةجمع المعلوماتDevSecOpsأمن الجوالتحليل الملفات الثنائية
GitHubjunelegency/dexfinder

dexfinder

أداة بحث عبر الأنظمة الأساسية عن الطرق (methods) في ملفات APK/DEX مع تتبع سلسلة الاستدعاءات، وإزالة تشويش ProGuard، واكتشاف الواجهات البرمجية المخفية.

9210منذ 4 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
عرض المستودع

dexfinder

English | 中文 | الموقع الإلكتروني عرض توضيحي لـ dexfinder


الموقع الإلكتروني: junelegency.github.io/dexfinder

أداة عبر الأنظمة الأساسية للبحث عن مراجع الدوال والحقول في APK/DEX مع تتبع سلاسل الاستدعاء، وإزالة التعتيم ProGuard/R8، واكتشاف واجهات برمجة التطبيقات المخفية في Android.

مستوحاة من أداة veridex الخاصة بـ Android، وأُعيد تنفيذها بلغة Go مع قدرات محسّنة: كشف الانعكاس بشكل أسرع، تتبع سلسلة الاستدعاءات (veridex يُظهر مستوى واحدًا فقط)، وتنسيقات إخراج مرنة.

الميزات

  • مسح APK/DEX/JAR — تحليل كود DEX البايت، استخراج جميع مراجع الدوال/الحقول/السلاسل النصية
  • استعلام متعدد التنسيقات — البحث باسم Java، أو توقيع DEX/JNI، أو كلمة مفتاحية بسيطة
  • تتبع سلسلة الاستدعاءات — تتبع المستدعين حتى N من المستويات، شجرة مدمجة أو قائمة مسطحة، مع اكتشاف الدورات
  • إزالة تعتيم ProGuard/R8 — تحميل mapping.txt، عرض الأسماء الأصلية بجانب المُعتمة
  • كشف واجهات API المخفية — تحميل hiddenapi-flags.csv، كشف واجهات API المحظورة/غير المدعومة
  • كشف الانعكاس — مطابقة الفئات مع السلاسل النصية للعثور على استخدام واجهات API المخفية القائمة على الانعكاس
  • إخراج مرن — نص / json / model / html / sarif، تخطيط شجرة / قائمة، نمط اسم java / dex — كلها متعامدة
  • إخراج طرفية ملونة — ألوان ANSI مكتشفة تلقائيًا للعلامات، وموصلات الشجرة، ومستويات API
  • فرق APK — مقارنة إصدارين من APK/DEX، كشف مراجع API المضافة/المحذوفة/المتغيرة
  • تقارير HTML — HTML تفاعلي قائم بذاته مع أشجار قابلة للطي، بحث، وسمة داكنة
  • إخراج SARIF — SARIF 2.1.0 لفحص الكود في GitHub وVS Code وخطوط CI
  • تكامل 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:~
**البرنامج النصي** (يكتشف تلقائيًا نظام التشغيل/الهندسة):```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

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 (نطاق البحث)

يتحكم في نوع المراجع التي يطابقها الاستعلام. هذا أمر بالغ الأهمية لفهم النتائج.

فهم الفرق بين 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()

root@kitploit:~
`--scope=all` (الافتراضي) = `callee` + `string`. يتم استبعاد اتجاه `caller` عمدًا من الافتراضي لأنه يجيب على سؤال مختلف جوهريًا. استخدم `--scope=caller` أو `--scope=everything` صراحةً عندما تحتاج ذلك.

**فهم وسوم المخرجات:**

| الوسم | المعنى |
|---|---|
| `[METHOD]` | طريقة **يتم استدعاؤها** تطابق استعلامك (مطابقة المستدعى). الأسطر المسننة هي المستدعون. |
| `[FIELD]` | حقل **يتم الوصول إليه** يطابق استعلامك. الأسطر المسننة هي الوصولات. |
| `[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. تتبع سلاسل الاستدعاءات — عرض القائمة (نمط تعطل Java)```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, etc.)```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 لـ 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 مع --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، بخيط واحد:

مقارنةً بـ veridex (C++، وضع غير دقيق) على نفس APK بحجم ~300MB:

  • veridex دقيق: 27s (بدون انعكاس عبر Binder/AIDL)
  • veridex غير دقيق: >32 min (تم إنهاؤه، انفجار حاصل الضرب الديكارتي)
  • 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 ./...

License

Apache License 2.0


dexfinder

الموقع الرسمي: junelegency.github.io/dexfinder

أداة عبر الأنظمة الأساسية للبحث عن مراجع الطرق والحقول في ملفات APK/DEX، تدعم تتبع سلسلة الاستدعاء، إزالة التشويش من ProGuard/R8، والكشف عن واجهات برمجة التطبيقات المخفية في Android.

مبنية على مبدأ veridex من Android، مع إعادة التنفيذ والتحسين باستخدام Go: كشف أسرع للانعكاس، تتبع سلسلة استدعاء متعددة المستويات (veridex مستوى واحد فقط)، تنسيق إخراج مرن.

الميزات

  • مسح APK/DEX/JAR — تحليل كود DEX الثنائي، استخراج جميع مراجع الطرق/الحقول/السلاسل النصية
  • استعلام بتنسيقات متعددة — دعم أسماء فئات Java، توقيعات DEX/JNI، كلمات مفتاحية بسيطة
  • تتبع سلسلة الاستدعاء — تتبع المتصلين لأعلى N طبقة، دمج شجري أو قائمة موسعة، كشف الحلقات التكرارية تلقائيًا
  • إزالة التشويش من ProGuard/R8 — تحميل mapping.txt، عرض الأسماء الأصلية
  • الكشف عن واجهات برمجة التطبيقات المخفية — تحميل hiddenapi-flags.csv، الكشف عن الواجهات المحظورة/غير المدعومة
  • الكشف عن الانعكاس — مطابقة متقاطعة لأسماء الفئات مع السلاسل النصية، اكتشاف الواجهات المخفية المستدعاة عبر الانعكاس (متوافق مع veridex)
  • إخراج مرن — تنسيقات text / json / model / html / sarif، تخطيط tree / list، أسلوب تسمية java / dex — مجموعات متعامدة
  • إخراج طرفية ملون — كشف TTY تلقائيًا، تلوين التسميات، خطوط الاتصال الشجرية، مستويات واجهات البرمجة
  • مقارنة فروق APK — مقارنة إصدارين من APK، الكشف عن مراجع واجهات برمجة التطبيقات المضافة/المحذوفة/المتغيرة
  • تقرير HTML — HTML تفاعلي مكتفي ذاتيًا، شجرة قابلة للطي، بحث وتصفية، سمة داكنة
  • إخراج SARIF — تنسيق SARIF 2.1.0، يدعم فحص كود GitHub، VS Code
  • تكامل CI — --fail-on blocked عند اكتشاف واجهات برمجة تطبيقات مقيدة، يُرجع رمز خروج غير صفري
  • ملف التكوين — .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)

قائمة — كل سلسلة معروضة بشكل مستقل (نمط 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` | `--mapping --show-obf` |
|---|---|---|---|
| اسم مبهم `LJ7;` | ✓ إخراج مبهم | ✓ إخراج غير مبهم | ✓ كليهما جنبًا إلى جنب |
| اسم قصير أصلي `KotlinCases` | ✗ غير موجود | ✓ تحويل تلقائي + إخراج غير مبهم | ✓ تحويل تلقائي + كليهما جنبًا إلى جنب |
| اسم كامل أصلي `com.example...` | ✗ غير موجود | ✓ تحويل تلقائي + إخراج غير مبهم | ✓ تحويل تلقائي + كليهما جنبًا إلى جنب |

### Hidden API كشف```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++) على نفس APK ~300MB:
- veridex precise: **27s** (لا يمكنه تتبع انعكاس Binder/AIDL)
- veridex imprecise: **أكثر من 32 دقيقة** (انفجار حاصل ضرب ديكارتي، تم قتله)
- **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:~
## الترخيص
تنزيل الأداة
الصيغةمثالالسلوك
اسم بسيطgetDeviceIdمطابقة جزئية غير دقيقة عبر جميع واجهات API
كلاس Javaandroid.telephony.TelephonyManagerجميع دوال/حقول ذلك الكلاس
كلاس#دالة في Javaandroid.telephony.TelephonyManager#getDeviceIdجميع التحميلات الزائدة لتلك الدالة
التوقيع الكامل في Java...TelephonyManager#getDeviceId()مطابقة تامة مع الرجوع إلى التحميلات الزائدة
توقيع DEX/JNILandroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;مطابقة تامة فقط
القيمةالوصف
textإخراج نصي عادي مع وسوم ملونة (الافتراضي)
jsonJSON — نتائج المسح أو التتبع بتنسيق شجري/قائمة
modelJSON منظم مع أنواع MethodInfo/FieldInfo كاملة (لبيئات التطوير/التكامل المستمر)
htmlتقرير HTML مستقل مع أشجار قابلة للطي وبحث
sarifتنسيق تحليل ثابت SARIF 2.1.0 (GitHub / VS Code)
القيمةما يبحث عنهالسؤال الذي يجيب عليهالوسم الناتج
allواجهات برمجة التطبيقات المستدعاة + الحقول + سلاسل النص"من يستدعي هذه الواجهة البرمجية؟" (الافتراضي)[METHOD] [FIELD] [STRING]
calleeتوقيعات واجهة برمجة التطبيقات المستهدفة فقط في تعليمات invoke-* / get/put"من يستدعي هذه الطريقة/الحقل بالتحديد؟"[METHOD] [FIELD]
callerتوقيع الطريقة المستدعية فقط"ما الذي تستدعيه هذه الطريقة داخليًا؟"[CALLER→]
stringثوابت النص في تعليمات const-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
العلامةالوصفالافتراضي
--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
--outputكتابة الإخراج إلى ملف بدلاً من stdout—
--colorوضع الألوان: auto, always, neverauto
--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, everythingall
--diffالمقارنة مع APK/DEX آخر وعرض الاختلافات في API—
--fail-onإنهاء برمز غير صفري إذا تم العثور على APIs مخفية في هذا المستوى (بوابة CI)—
--statsعرض إحصائيات موجزة فقطfalse
--versionعرض الإصدارfalse
التنسيقمثالالسلوك
اسم بسيطgetDeviceIdمطابقة جزئية غير دقيقة
اسم فئة Javaandroid.telephony.TelephonyManagerمطابقة جميع طرق تلك الفئة
اسم فئة Java#الطريقة...TelephonyManager#getDeviceIdمطابقة جميع التحميلات الزائدة لتلك الطريقة
توقيع Java كامل...#getDeviceId()مطابقة دقيقة مع الرجوع إلى التحميلات الزائدة
توقيع DEX/JNILandroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;مطابقة دقيقة
القيمةالمحتوى المبحوثالسؤال الذي يجيب عليهالوسم الناتج
allاستدعاءات الـ API + الحقول + سلاسل النصوص البرمجية"من يستدعي هذه الطريقة؟" (افتراضي)[METHOD] [FIELD] [STRING]
calleeفقط التوقيعات المستهدفة في تعليمات invoke-* / get/put"من يستدعي هذه الطريقة/الحقل بالتحديد؟"[METHOD] [FIELD]
callerفقط توقيعات الطرق المستدعية"ما الذي تستدعيه هذه الطريقة داخلياً؟"[CALLER→]
stringالثوابت النصية في تعليمات const-string"أين يُستخدم هذا النص في الكود؟"[STRING]
string-tableسلاسل الكود + جدول السلاسل الكامل لـ DEX"هل هذا النص موجود في DEX؟" (يشمل التعليقات والكود الميت)[STRING] [STRING_TABLE]
everythingكل ما سبقعرض كاملجميع الوسوم