
Glass - بديل سريع ومجاني لـ IDA Pro
بمعنى شفاف وسلس
مفكِّك تفاعلي سريع وأصلي، يعطي أولوية لتطبيقات الجوال، وهو الخليفة الروحي لـ IDA Pro في سير عمل الهندسة العكسية لنظامي Android / iOS، مبني حول:
smali للتعامل مع APK / DEX / smaliarmv8-encode لـ AArch64 و ARMv7 (A32 / Thumb) — ملفات .so الأصلية و iOS Mach-Ogpui (Zed) لواجهة مستخدم أصلية متسارعة عبر GPUredb للتخزين الدائم المعنون بالمحتوىrquickjs لإضافات قابلة للبرمجة (مخطط لها)الترخيص: GPL-3.0-only (موروث من smali).
لقد استخدمنا جميعًا IDA Pro — إنه المعيار الصناعي للهندسة العكسية ولديه سنوات من الإضافات خلفه، لكنه بطيء ومكلف وقديم. Glass مبني بنسبة 100% على Rust الأصلي مع واجهة مستخدم متسارعة عبر GPU لتفاعل سلس. كما أنه مجاني ومفتوح المصدر بالكامل — ساهم معنا من فضلك.
arm64-v8a و armeabi-v7a من مكتبة في استعلام واحد). قواعد نحوية لأنماط البايت مع إخفاء + فجوات؛ وقواعد نحوية للتجميع المكتوب لـ AArch64 و ARMv7، مع قائمة إكمال تلقائي تدرك بنية التعليمات ISA.جولة سريعة عبر العروض الرئيسية — انقر على أي صورة مصغرة لرؤيتها بالحجم الكامل.
كل تحليل يقوم به Glass في الواجهة الرسومية يُكشف عنه أيضًا كأمر CLI يُخرج JSON منظمًا. نفس الملف التنفيذي glass هو نقطة الدخول إلى الأتمتة — اختر أمرًا فرعيًا وستحصل على نتيجة لمرة واحدة قابلة للبرمجة النصية، مثالية لخطوط أنابيب jq والتكامل المستمر CI.```sh
glass classes ./app.apk --package com.example. --text
glass callers ./libfoo.so --artifact libfoo.so --symbol "glass::main"
onCreate across DEX, machine-readable:glass search ./app.apk onCreate | jq '.data.hits[] | select(.kind=="method")'
glass types ./app.ipa --kind swift-class --text
glass type ./app.ipa --artifact app --name blackjack.ContentView
مرر `--text` للحصول على عرض قابل للقراءة البشرية، واحذفه للحصول على JSON.
المرجع الكامل: **[docs/cli-api.md](https://github.com/azw413/glass/blob/HEAD/docs/cli-api.md)**.
هذا يعني أنه يمكنك كتابة سكربتات وأتمتة العمليات الشائعة.
## المهارات وMCP
كل أمر من أوامر CLI يتم كشفه أيضًا كأداة عبر خادم MCP (Model Context Protocol) مدمج، بحيث يمكن لأي مضيف يدعم MCP — Claude Desktop أو Cursor أو Zed أو عميلك الخاص — التحكم في Glass مباشرة للمساعدة في مهام الهندسة العكسية.```sh
# Print the machine-readable skill catalog (one JSON object listing
# every verb with its schema and an example invocation).
glass skills
# Run as an MCP stdio server. Plug into any MCP host's tool list.
glass mcp
للتسجيل مع Claude Desktop، أضف Glass إلى ~/Library/Application Support/Claude/claude_desktop_config.json:```json
{
"mcpServers": {
"glass": { "command": "/usr/local/bin/glass", "args": ["mcp"] }
}
}
يمكن للنموذج بعد ذلك استدعاء `inspect` و`symbols` و`disasm` و`cfg-of` و`dex-callers` و`search` وأي فعل آخر على أي حزمة (bundle) تشير إليها. تعود نتائج الأدوات في نفس غلاف JSON الذي ستحصل عليه من سطر الأوامر.
## البحث
ثلاثة محركات متكاملة، كلها متاحة من نفس لوحة ⌘F في الواجهة الرسومية وكأفعال CLI / MCP.
### البحث النصي الكامل
مطابقة ضبابية عبر الحزمة بالكامل للرموز الأصلية (native symbols) وفئات / طرق / حقول DEX والسلاسل النصية الحرفية في أقسام الكود والبيانات. تتم التصفية المباشرة أثناء الكتابة؛ وتُوجَّه النتائج إلى العرض الصحيح (قائمة العناوين الأصلية، عارض smali لأهداف DEX، عرض سداسي عشري لإصابات البيانات). تُبنى الفهارس في خيط خلفي بعد التحميل — تظهر شريحة تقدم أثناء ذلك.```sh
glass search ./app.apk onCreate # all things named like "onCreate"
glass search ./libfoo.so init --limit 20
مرجع سطر الأوامر: فعل search في docs/cli-api.md.
محرك أنماط على مستوى البايت. كل ذرة عبارة عن قناع سداسي عشري من حرفين (c0, e?, ?f, ??) أو فجوة (* = 0..=32 بايت، *(min..max) للحدود الصريحة). المطابقات لا تمتد عبر الأقسام. في لوحة الواجهة الرسومية، يبدّل ⌘2 إلى الوضع الثنائي؛ خانة اختيار الرمز فقط (مفعّلة افتراضيًا) تقيّد الفحص على أقسام النص حتى لا تغرق في نتائج البيانات عند البحث عن شكل تعليمة.```sh
mov w0, #1 ; retglass bin-search ./libfoo.so --artifact libfoo.so --pattern '20 00 80 52 c0 03 5f d6'
glass bin-search ./libfoo.so --artifact libfoo.so --pattern '?? ?? ?? 9? ?? ?? 4? 91'
glass bin-search ./libfoo.so --artifact libfoo.so --pattern 'de ad be ef'
القواعد الكاملة + أمثلة عملية: [`docs/BinSearch.md`](https://github.com/azw413/glass/blob/HEAD/docs/BinSearch.md).
### البحث في التعليمات
اكتب التجميع (assembly)، ويقوم Glass بترجمته إلى بايتات. يتم ترميز تسلسل مفصول بفاصلة منقوطة `;` عبر [armv8-encode](https://github.com/azw413/armv8-encode) — **AArch64** (`mov w0, #1`, `adrp x1, *`) و**ARMv7** في كلا الوضعين (Thumb `mov r1, r7` / `bxeq lr` / `push {r4-r7, lr}` وA32). تُترجم أي أحرف بدل إلى أقنعة بتات للمعاملات قبل أن يتولى محرك البايتات الأمر. الفحص شامل — كل قطعة أصلية (native artifact) في الحزمة تحصل على ذرات بنية التعليمات الصحيحة (تطبيقات Android التي تحتوي على مكتبات `arm64-v8a` و`armeabi-v7a` معًا يتم البحث فيها باستعلام واحد).
داخل وضع Binary في الواجهة الرسومية، يبدّل ⌘B بين قاعدتي **Bytes** و**Asm**؛ تعرض قائمة إكمال تلقائي مدركة لبنية التعليمات المتغيرات التي ما تزال مطابقة لما كتبته — `r1` يستبعد مرشحي AArch64، و`w0` يستبعد مرشحي ARMv7.
أحرف البدل:
| الرمز | المعنى |
|---|---|
| `*` | أي معامل (يُستدل على نوعه من الـ opcode المختار) |
| `#*` | أي قيمة فورية (تعطي تلميحًا لمنتقي الـ opcode) |
| `x`, `w` | أي سجل من فئة X أو W في AArch64 |
| `r` | أي سجل GPR في ARMv7 (`r0..r15`, `sp`, `lr`, `pc`) |
| `<*>`, `<X>`, `<W>`, `<R>`, `<imm>` | مكافئات بين قوسين، مفيدة عند تداخلها في صيغ أخرى (`[x, #*]`, `[r, #*]`) |```sh
# AArch64 — every `mov w0, #N` (any N)
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'mov w0, #*'
# AArch64 — any ADRP into x1 followed immediately by ADD into the same reg
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'adrp x1, * ; add x1, x1, #*'
# ARMv7 (Thumb) — `mov r1, r*` followed by a return
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'mov r1, r* ; bx lr'
# ARMv7 (any cond) — conditional bx in literal-pool callers
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'bxeq lr'
# every `ret x30` — concrete, no wildcards
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'ret'
الاستجابة تحمل bytes_hex تعرض القناع المجمّع (مثل 01/1f ?? ?? 90/9f لـ adrp x1, *) حتى تتمكن من رؤية الأجزاء المثبتة بدقة مقابل الأجزاء البدل. عمليات الالتقاط (<name:kind> التي تشير إلى نفس المعامل لاحقًا في النمط) مصممة ولكنها غير منفّذة بعد.
التصميم الكامل + المراحل: docs/InsnPattern.md. مرجع CLI/MCP: insn-search في docs/cli-api.md.
Glass قابل للاستخدام اليوم لعكس هندسة تطبيقات Android (APK / DEX / .so أصلي) وتطبيقات iOS (IPA / Mach-O) التي تستهدف AArch64 و ARMv7 32-بت (armeabi-v7a للمكتبات، A32 + Thumb).
تحميل الملفات
.apk, .aab)، حزم iOS (.ipa)، أو أي ملف ELF / Mach-O مستقل (.so, .dylib, ملفات تنفيذية خام) مباشرة — يكتشف Glass التنسيق تلقائيًا.arm64e، ويكون arm64 العادي هو الخيار الاحتياطي. يعمل على الحزم وعلى الملفات المستقلة على حد سواء (مثل glass gui /usr/lib/dyld).libfoo.so المُرسل في ملفي APK (أو نفس libswiftCore.dylib عبر ملفي IPA) يتشارك حالة التحليل.smali).iOS — IPA / Mach-O
Payload/*.app/، تحليل Info.plist، واختيار شريحة arm64 / arm64e من أي ملف سمين بداخله.Frameworks/*.framework + *.dylib يُحمَّل كقطعة أثرية أصلية خاصة به، مع نفس عروض النظرة العامة + التفكيك لكل قسم المستخدمة لملفات .so في Android.__objc_classlist — الفئات، التصنيفات، الدوال، متغيرات الحالة، الخصائص — مع أسماء مطرودة (تشمل أسماء Swift المائلة القديمة _TtC...) وقفزات قابلة للنقر من عناوين الدوال إلى القائمة.__swift5_types — الفئات، البنيات، التعدادات مع حقولها و(للفئات) جداول vtables، كما أنها قابلة للنقر داخل القائمة.Android — APK / DEX / أصلي
.so الأصلية تحت lib/<abi>/ تُحمَّل لكل ABI؛ كل من AArch64 (arm64-v8a) و ARMv7 (armeabi-v7a) يحصلان على عروض تفكيك كاملة. ABIs الأخرى (x86 / x86_64) تُوجَّه إلى عرض hex حتى يتوفر مفكك.التحرير
r1 تعرض متغيرات ARMv7 فقط؛ w0 تعرض AArch64 فقط.AArch64 أصلي (ELF + Mach-O رفيع)
.eh_frame FDEs وإدخالات <name>@plt المُصنّعة. إزالة التشويش لـ C++/Rust/Swift عبر symbolic-demangle.adrp + add/ldr تُحل إلى أهداف بيانات، بما فيها حروف نصية معروضة كتعليقات داخلية.ARMv7 أصلي (ELF)
00 00 وهمي)، Thumb-2 و A32 ذات 32 بت تعرض 4..eh_frame وإدخالات <name>@plt المُصنّعة (وحدات بحجم 12 بايت).movw + movt: يتم اكتشاف movw R, #lo16 ; movt R, #hi16 عبر أزواج التعليمات، والثابت 32-بت المُحل يحصل على تعليق نصي ; "..." من rodata على صف movt.ldr Rt, [pc, #imm] من تجمعات الحروف الحرفية تتبع مستوى واحد في rodata لنفس نوع تعليق النص الداخلي الذي ينتجه مسار ADRP+ADD في AArch64.الواجهة
change me يجد changeMessage و change_me_count لكن ليس dispatchMenuVisibilityChanged).arm64-v8a + armeabi-v7a تحصل على نتائج موحدة مع تسمية القطعة الأثرية + القسم لكل تطابق.redb؛ إعادة الإطلاق تستأنف من حيث توقفت.embedded.mobileprovision.resources.arsc).r0, lsl #2) والذاكرة ذات الفهرسة القبلية/البعدية ([rN, #imm]!, [rN], #imm) تُحلّ نحويًا لكن بشكل ملموس فقط — لا توجد بدلات داخل الأقواس.يعمل Glass على macOS 13+ (الهدف الأساسي، مسرّع بوحدة معالجة الرسوميات عبر Metal — لا حاجة إلى SDK إضافي، إطار Metal مرفق مع نظام التشغيل)، Linux (X11 أو Wayland عبر gpui_linux، مدعوم بـ Vulkan)، و Windows 10/11 (مدعوم بـ Direct3D عبر gpui، مبني باستخدام سلسلة أدوات MSVC).
يوجد ملف ثنائي مُجمَّع مسبقًا لإصدار macOS ضمن Releases لكن إذا كنت بحاجة إلى البناء من المصدر: الخبر الجيد: إنه أمران.
يعمل هذا على جلب libxkbcommon-dev، وترويسات Wayland وXCB، وVulkan، وALSA، وبقية مجموعة الأدوات التي يحتاجها gpui_linux للربط. وبدون هذه الحزم، يفشل البناء في مرحلة الربط بسبب غياب رموز xkbcommon / wayland-client.
إذا كنت تفضّل عدم تشغيل البرنامج النصي، فإن الحزم المكافئة على Debian / Ubuntu (amd64) هي: ```sh
sudo apt-get update && sudo apt-get install -y
build-essential clang cmake pkg-config
libfontconfig-dev libfreetype-dev
libwayland-dev libxkbcommon-x11-dev
libasound2-dev libvulkan-dev
libzstd-dev libsqlite3-dev libssl-dev
libglib2.0-dev
يفشل البناء مبكرًا في سكربت بناء أحد التبعيات (`fontconfig was not found in the pkg-config search path`) إذا كان `libfontconfig-dev` مفقودًا، ولاحقًا في وقت الربط لمكتبات X11/Wayland/Vulkan. هناك حاجة إلى `libglib2.0-dev` لأن مشغّل Frida يربط GLib ديناميكيًا على Linux (أما على macOS فتضمّن حزمة تطوير Frida مكتبة GLib بشكل ثابت) — وبدونه يفشل الربط مع `undefined symbol: g_object_unref`.
**نظام Windows فقط — ثبّت سلسلة أدوات البناء الأصلية.** يتطلب `gpui` سلسلة أدوات MSVC (الهدف GNU/MinGW غير مدعوم). باستخدام [winget](https://learn.microsoft.com/windows/package-manager/winget/): ```powershell
# 1. MSVC compiler, linker, and Windows SDK (the "Desktop development with C++" workload).
winget install --id Microsoft.VisualStudio.2022.BuildTools `
--override "--quiet --wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"
# 2. CMake — tree-sitter (via the Zed `language` crates) builds wasmtime's C API with it.
winget install --id Kitware.CMake
# 3. LLVM/Clang — `bindgen` (frida-sys, gpui, media) needs libclang.dll.
winget install --id LLVM.LLVM
لا يضيف مثبّت LLVM نفسه إلى PATH، لذا وجّه bindgen إلى libclang.dll قبل البناء (اضبط ذلك بشكل دائم عبر النظام → متغيرات البيئة، أو لكل شلّ): ```powershell
$env:LIBCLANG_PATH = "C:\Program Files\LLVM\bin"
بدون هذه، تفشل عملية البناء في سكربتات بناء التبعيات: `linker 'link.exe' not found` (لا يوجد MSVC)، `failed to spawn 'cmake'` (لا يوجد CMake)، أو `Unable to find libclang` (لا يوجد `LIBCLANG_PATH`). يتم زيادة احتياطي المكدس للملف الثنائي `glass` تلقائيًا على MSVC (انظر `crates/glass-cli/build.rs`) بحيث لا يتجاوز CLI المكدس الافتراضي الصغير لمؤشر الترابط الرئيسي في Windows — لا حاجة لأي إجراء.
3. **استنساخ وبناء**: ```sh
git clone https://github.com/azw413/Glass.git
cd glass
cargo build --release -p glass-cli
cp target/release/glass <to somewhere on your PATH>
سيستغرق البناء الأول وقتًا لتجميع gpui وما يرتبط به، وقد يستغرق عدة دقائق. أما عمليات البناء اللاحقة فستكون سريعة.
شغّلها: ```sh
glass ~/path/to/app.apk glass ~/path/to/app.ipa
glass ~/path/to/libfoo.so glass ~/path/to/libBar.dylib glass /usr/lib/dyld
glass
glass bundle ~/path/to/app.apk
glass db-dump ~/path/to/app.apk
استخدم دائمًا الإصدار النهائي (release build) — فإصدارات التصحيح (debug builds) تفكّك أبطأ بمراتب عدة.
.appلتغليف الملف الثنائي للإصدار النهائي في حزمة Glass.app بحيث يمكن تشغيله بنقرة مزدوجة من Finder:```sh cargo build --release -p glass-cli ./packaging/make-app.sh open dist/Glass.app
الحزمة موقّعة بتوقيع مخصص (ad-hoc) وليست موقّعة بمعرّف المطوّر (Developer-ID) أو موثّقة (notarized)، لذا عند أول تشغيل سيرفض macOS فتحها؛ انقر بزر الماوس الأيمن ← **فتح** لتجاوز Gatekeeper مرة واحدة.
طريقتان للحصول على zip مُجمَّع مسبقًا دون البناء محليًا:
- **أحدث `main`** — كل عملية دفع (push) ترفع `Glass-app-<sha>.zip` كأثر لسير العمل (artifact) صالح لمدة 14 يومًا. اسحبه من [تبويب Actions](https://github.com/azw413/Glass/actions).
- **إصدار موسوم** — دفع وسم `v*` (مثل `v0.1.0`) يشغّل نفس سير العمل وينشر أيضًا `Glass-<tag>-macOS.zip` إلى [صفحة Releases](https://github.com/azw413/Glass/releases) مع ملاحظات إصدار مولّدة تلقائيًا.
## مساحة العمل
| Crate | الغرض |
|------------------|------------------------------------------------------------------|
| `glass-core` | أنواع مشتركة (`CodeKind`، المعرّفات) |
| `glass-arch-arm` | فك تجميع AArch64 + ARMv7، خريطة الرموز، توليف PLT، إزالة تشويه الأسماء |
| `glass-arch-dex` | واجهة DEX / smali فوق `smali` |
| `glass-mobile` | تحميل حزم APK + IPA، استخراج المكتبات الأصلية، manifest |
| `glass-db` | تخزين مستمر بعنونة المحتوى (redb): الحزم، التبويبات، الإعدادات |
| `glass-device` | اكتشاف أجهزة Android (adb) + iOS (usbmux) |
| `glass-api` | أفعال التحليل (البحث، المراجع المتقاطعة (xrefs)، CFG، التعديلات) مشتركة بين CLI + MCP + GUI |
| `glass-ui` | واجهة أمامية بـ `gpui`: الشجرة، القائمة، السداسي العشري، manifest، اللوحة |
| `glass-cli` | مفتّش بدون واجهة رسومية (headless) + مُشغِّل الواجهة الرسومية |
| `glass-mcp` | خادم MCP يعرض كل فعل من أفعال CLI كأداة |
| `glass-script` | بيئة تشغيل إضافات QuickJS (عنصر نائب) |
## خارطة الطريق
- **iOS أعمق** — تحليل Entitlements و `embedded.mobileprovision`. (تمريرات البيانات الوصفية ObjC `__objc_classlist` و Swift `__swift5_types` أصبحت متاحة — انظر `glass types` / `glass type`.)
- **x86 / x86_64** — فك التجميع لإصدارات المحاكي من ملفات Android `.so`.
- **البرمجة النصية الداخلية** — مضيف إضافات QuickJS بواجهة API مستقرة لتمريرات التحليل.
- **متقدم** — إعادة بناء APK الموقّع، الإزاحة اللاحقة (downstream-shift) في التعديلات الموضعية على ARMv7 (بحيث يمكن لنمو الحجم من 2 إلى 4 بايت أن يتجاوز الكود المجاور بدلاً من الرفض).