
Glass - एक तेज़ और मुफ़्त IDA Pro विकल्प
अर्थात पारदर्शी और चिकना
एक तेज़, नेटिव, मोबाइल-ऐप प्रथम इंटरैक्टिव डिसअसेंबलर। Android / iOS रिवर्स इंजीनियरिंग वर्कफ़्लो के लिए IDA Pro का आध्यात्मिक उत्तराधिकारी, जो इनके चारों ओर निर्मित है:
smali APK / DEX / smali हैंडलिंग के लिएarmv8-encode AArch64 और ARMv7 (A32 / Thumb) के लिए — नेटिव .so, iOS Mach-Ogpui (Zed) GPU-एक्सेलरेटेड नेटिव UI के लिएredb कंटेंट-एड्रेस्ड पर्सिस्टेंस के लिएrquickjs स्क्रिप्टेबल प्लगइन्स के लिए (योजनाबद्ध)लाइसेंस: GPL-3.0-only (smali से प्राप्त)।
हम सभी ने IDA Pro का उपयोग किया है — यह रिवर्सिंग के लिए उद्योग मानक है और इसके पीछे वर्षों के प्लगइन्स हैं, लेकिन यह धीमा, महंगा और पुराना है। Glass 100% Rust नेटिव है जिसमें सहज इंटरैक्शन के लिए GPU-एक्सेलरेटेड UI है। यह 100% मुफ्त और ओपन सोर्स भी है — कृपया योगदान करें।
arm64-v8a और armeabi-v7a दोनों कॉपियाँ एक ही क्वेरी में खोजी जाती हैं)। मास्किंग + गैप्स के साथ बाइट-पैटर्न ग्रामर; AArch64 और ARMv7 के लिए टाइप्ड-असेंबली ग्रामर, ISA-अवेयर ऑटोकंप्लीट ड्रॉपडाउन के साथ।मुख्य व्यूज़ की एक सैर — किसी भी थंबनेल पर क्लिक करके इसे पूर्ण आकार में देखें।
GUI में 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)**।
इसका मतलब है कि आप सामान्य कार्यों को स्क्रिप्ट और स्वचालित कर सकते हैं।
## Skills और 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` और हर अन्य क्रिया को कॉल कर सकता है, जिस पर आप इसे इंगित करते हैं। टूल परिणाम उसी JSON envelope में वापस आते हैं जो आपको CLI से मिलता है।
## खोज
तीन पूरक इंजन, सभी GUI में एक ही ⌘F पैलेट से और CLI / MCP क्रियाओं के रूप में उपलब्ध हैं।
### पूर्ण-पाठ खोज
बंडल-व्यापी फ़ज़ी मिलान, जो नेटिव प्रतीकों, DEX कक्षाओं / विधियों / फ़ील्ड्स, और कोड तथा डेटा अनुभागों में स्ट्रिंग लिटरल्स पर लागू होता है। टाइप करते ही लाइव-फ़िल्टर होता है; परिणाम सही दृश्य पर भेजे जाते हैं (नेटिव पतों के लिए listing, DEX लक्ष्यों के लिए smali व्यूअर, डेटा हिट्स के लिए hex दृश्य)। लोड होने के बाद इंडेक्स पृष्ठभूमि थ्रेड पर बनते हैं — प्रगति चिप उस दौरान दिखाई देती है।```sh
glass search ./app.apk onCreate # all things named like "onCreate"
glass search ./libfoo.so init --limit 20
CLI संदर्भ: search क्रिया docs/cli-api.md में.
बाइट-स्तरीय पैटर्न इंजन। प्रत्येक अणु 2-वर्णों वाला हेक्स मास्क (c0, e?, ?f, ??) या एक गैप (* = 0..=32 बाइट्स, स्पष्ट सीमाओं के लिए *(min..max)) होता है। मिलान सेक्शनों के बीच विस्तारित नहीं होते। GUI पैलेट में, ⌘2 बाइनरी मोड पर स्विच करता है; Code only चेकबॉक्स (डिफ़ॉल्ट रूप से चालू) स्कैन को टेक्स्ट सेक्शनों तक सीमित करता है, ताकि इंस्ट्रक्शन शेप खोजते समय आप डेटा हिट्स में न डूबें।```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).
### निर्देश खोज
असेम्बली लिखें, 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)। कोई भी वाइल्डकार्ड बाइट इंजन के काम संभालने से पहले ऑपरेंड-बिट मास्क में अनुवादित किए जाते हैं। स्कैन वैश्विक है — बंडल में हर नेटिव आर्टिफैक्ट को सही ISA के एटम प्राप्त होते हैं (जिन Android ऐप्स में `arm64-v8a` और `armeabi-v7a` दोनों लाइब्रेरी होती हैं, उन्हें एक ही क्वेरी में खोजा जाता है)।
GUI में Binary मोड के भीतर, ⌘B **Bytes** और **Asm** व्याकरणों के बीच टॉगल करता है; एक ISA-जागरूक ऑटोकम्प्लीट ड्रॉपडाउन उन वेरिएंट्स को दिखाता है जो आपके टाइप किए गए से अब भी मेल खाते हैं — `r1` AArch64 उम्मीदवारों को फ़िल्टर करता है, `w0` ARMv7 वालों को।
वाइल्डकार्ड:
| टोकन | अर्थ |
|---|---|
| `*` | कोई भी ऑपरेंड (प्रकार चुने गए ऑपकोड से अनुमानित किया जाता है) |
| `#*` | कोई भी इमीडिएट (ऑपकोड पिकर को संकेत देता है) |
| `x`, `w` | कोई भी AArch64 X- या W-श्रेणी का रजिस्टर |
| `r` | कोई भी ARMv7 GPR (`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 होता है जो संकलित मास्क दिखाता है (जैसे adrp x1, * के लिए 01/1f ?? ?? 90/9f) ताकि आप देख सकें कि कौन-से बिट पिन हैं बनाम वाइल्डकार्ड। कैप्चर (<name:kind> पैटर्न में बाद में उसी ऑपरेंड को क्रॉस-रेफर करते हुए) डिज़ाइन किए गए हैं लेकिन अभी लागू नहीं किए गए हैं।
पूर्ण डिज़ाइन + चरणबद्धता: docs/InsnPattern.md। CLI/MCP संदर्भ: insn-search में docs/cli-api.md।
Glass आज Android (APK / DEX / नेटिव .so) और iOS (IPA / Mach-O) ऐप्स को रिवर्स करने के लिए उपयोग योग्य है, जो AArch64 और 32-bit ARMv7 (armeabi-v7a लाइब्रेरी, A32 + Thumb) को लक्षित करते हैं।
फ़ाइल लोडिंग
.apk, .aab), iOS बंडल (.ipa), या किसी भी स्टैंडअलोन ELF / Mach-O बाइनरी (.so, .dylib, रॉ एक्ज़ीक्यूटेबल) को सीधे खोलें — Glass फ़ॉर्मेट का स्वतः पता लगाता है।arm64e को प्राथमिकता दी जाती है, सादा arm64 फ़ॉलबैक है। यह बंडल और स्टैंडअलोन फ़ाइलों दोनों पर काम करता है (जैसे glass gui /usr/lib/dyld)।libfoo.so (या दो IPA में समान libswiftCore.dylib) विश्लेषण स्थिति साझा करती है।smali के माध्यम से डिकोड किया गया)।iOS — IPA / Mach-O
Payload/*.app/ ढूँढें, Info.plist पार्स करें, और अंदर किसी भी फ़ैट बाइनरी से arm64 / arm64e स्लाइस चुनें।Frameworks/*.framework + *.dylib अपने स्वयं के नेटिव आर्टिफैक्ट के रूप में लोड होता है, साथ ही वही Overview + प्रति-सेक्शन डिसअसेम्बली व्यू जो Android .so फ़ाइलों के लिए उपयोग होते हैं।__objc_classlist से स्रोतित Objective-C क्लास ब्राउज़र — क्लास, कैटेगरी, मेथड, ivars, प्रॉपर्टी — डिमैंगल किए गए नामों के साथ (लीगेसी _TtC... Swift मैंगलिंग सहित) और मेथड पतों से लिस्टिंग में क्लिक करने योग्य जंप।__swift5_types से स्रोतित Swift टाइप ब्राउज़र — क्लास, स्ट्रक्चर, एनम उनके फ़ील्ड्स के साथ और (क्लास के लिए) vtables, लिस्टिंग में क्लिक करने योग्य भी।Android — APK / DEX / नेटिव
lib/<abi>/ के अंतर्गत नेटिव .so फ़ाइलें प्रति ABI लोड होती हैं; AArch64 (arm64-v8a) और ARMv7 (armeabi-v7a) दोनों को पूर्ण डिसअसेम्बली व्यू मिलते हैं। अन्य ABI (x86 / x86_64) डिकोडर आने तक हेक्स व्यू में चले जाते हैं।संपादन
r1 टाइप करने पर केवल ARMv7 वेरिएंट दिखते हैं; w0 केवल AArch64 दिखाता है।AArch64 नेटिव (ELF + thin Mach-O)
.eh_frame FDEs, और संश्लेषित <name>@plt प्रविष्टियों से मर्ज किया गया। C++/Rust/Swift डिमैंगलिंग symbolic-demangle के माध्यम से।adrp + add/ldr जोड़े डेटा लक्ष्यों पर हल किए जाते हैं, जिनमें कमेंट के रूप में इनलाइन दिखाए गए स्ट्रिंग लिटरल भी शामिल हैं।ARMv7 नेटिव (ELF)
00 00 पैडिंग नहीं), 32-bit Thumb-2 और A32 4 दिखाते हैं।.eh_frame, और संश्लेषित <name>@plt प्रविष्टियाँ (12-बाइट स्टब)।movw + movt फ्यूज़न: movw R, #lo16 ; movt R, #hi16 निर्देश जोड़ों के बीच पहचाना जाता है और हल किया गया 32-bit कॉन्स्टेंट movt पंक्ति पर ; "..." rodata-स्ट्रिंग कमेंट पाता है।ldr Rt, [pc, #imm] लिटरल-पूल लोड rodata में एक स्तर डीरेफ़रेंस करते हैं, उसी तरह के इनलाइन स्ट्रिंग कमेंट के लिए जो AArch64 का ADRP+ADD पथ उत्पन्न करता है।यूआई
change me changeMessage और change_me_count ढूँढती है लेकिन dispatchMenuVisibilityChanged नहीं)।arm64-v8a + armeabi-v7a वाले Android ऐप्स को प्रति मैच आर्टिफैक्ट + सेक्शन लेबल के साथ एकीकृत परिणाम मिलते हैं।redb में संग्रहीत होती है; पुनः लॉन्च करने पर वहीं खुलता है जहाँ आपने छोड़ा था।embedded.mobileprovision पार्सिंग।resources.arsc पार्सिंग की आवश्यकता होगी)।r0, lsl #2) और प्री/पोस्ट-इंडेक्स मेमोरी ([rN, #imm]!, [rN], #imm) पार्स होते हैं लेकिन केवल ठोस रूप से — ब्रैकेट के अंदर कोई वाइल्डकार्ड नहीं।Glass macOS 13+ (प्राथमिक लक्ष्य, Metal के माध्यम से GPU-त्वरित — किसी अतिरिक्त SDK की आवश्यकता नहीं, Metal फ्रेमवर्क OS के साथ आता है), Linux (X11 या Wayland gpui_linux के माध्यम से, Vulkan-समर्थित), और Windows 10/11 (Direct3D-समर्थित gpui के माध्यम से, MSVC टूलचेन के साथ निर्मित) पर चलता है।
Releases के अंतर्गत macOS के लिए एक रिलीज़ प्रीबिल्ट बाइनरी है, लेकिन यदि आपको स्रोत से बिल्ड करने की आवश्यकता है: अच्छी खबर: यह दो कमांड हैं।
यह 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
The build fails early in a dependency build script (`fontconfig was not found in the pkg-config search path`) if `libfontconfig-dev` is missing, and later at link time for the X11/Wayland/Vulkan libraries. `libglib2.0-dev` is needed because the Frida driver links GLib dynamically on Linux (on macOS the Frida devkit bundles it statically) — without it the link fails with `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 की ओर इंगित करें (इसे System → Environment Variables के माध्यम से स्थायी रूप से सेट करें, या प्रति-शेल): ```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
हमेशा रिलीज़ बिल्ड का उपयोग करें — डीबग बिल्ड डिसअसेंबली में कई गुना धीमे होते हैं।
.app बंडल की पैकेजिंगरिलीज़ बाइनरी को Glass.app बंडल में लपेटने के लिए ताकि Finder से डबल-क्लिक लॉन्च किया जा सके:```sh cargo build --release -p glass-cli ./packaging/make-app.sh open dist/Glass.app
बंडल ad-hoc साइन किया गया है (Developer-ID साइन या नोटराइज़ किया हुआ नहीं), इसलिए पहली बार लॉन्च करने पर macOS इसे खोलने से मना कर देगा; Gatekeeper को एक बार बायपास करने के लिए राइट-क्लिक करें → **Open**।
बिना लोकल बिल्ड किए प्रीबिल्ट zip पाने के दो तरीके:
- **नवीनतम `main`** — हर push एक `Glass-app-<sha>.zip` को 14-दिवसीय workflow artifact के रूप में अपलोड करता है। इसे [Actions tab](https://github.com/azw413/Glass/actions) से प्राप्त करें।
- **टैग किया गया release** — एक `v*` टैग (जैसे `v0.1.0`) push करने से वही workflow चालू होता है और इसके अतिरिक्त स्वतः-जनित release notes के साथ एक `Glass-<tag>-macOS.zip` [Releases page](https://github.com/azw413/Glass/releases) पर प्रकाशित किया जाता है।
## कार्यक्षेत्र
| Crate | उद्देश्य |
|------------------|------------------------------------------------------------------|
| `glass-core` | साझा प्रकार (`CodeKind`, IDs) |
| `glass-arch-arm` | AArch64 + ARMv7 डिसअसेंबली, symbol map, PLT synthesis, demangling |
| `glass-arch-dex` | `smali` के ऊपर DEX / smali facade |
| `glass-mobile` | APK + IPA बंडल लोडिंग, native-lib निष्कर्षण, manifest |
| `glass-db` | Content-addressed persistence (redb): बंडल, टैब, सेटिंग्स |
| `glass-device` | Android (adb) + iOS (usbmux) डिवाइस डिस्कवरी |
| `glass-api` | CLI + MCP + GUI द्वारा साझा किए गए analysis verbs (search, xrefs, CFG, edits) |
| `glass-ui` | `gpui` फ्रंट-एंड: tree, listing, hex, manifest, palette |
| `glass-cli` | हेडलेस इंस्पेक्टर + GUI लॉन्चर |
| `glass-mcp` | हर CLI verb को एक tool के रूप में उजागर करने वाला MCP सर्वर |
| `glass-script` | QuickJS plugin runtime (स्थानधारक) |
## रोडमैप
- **iOS गहराई** — Entitlements और `embedded.mobileprovision` पार्सिंग। (ObjC `__objc_classlist` और Swift `__swift5_types` मेटाडेटा पास आ चुके हैं — `glass types` / `glass type` देखें।)
- **x86 / x86_64** — Android `.so` फ़ाइलों के emulator-builds के लिए डिसअसेंबली।
- **आंतरिक स्क्रिप्टिंग** — analysis passes के लिए स्थिर API वाला QuickJS plugin host।
- **उन्नत** — Signed APK पुनर्निर्माण, ARMv7 इन-प्लेस संपादनों पर downstream-shift (ताकि 2→4-बाइट वृद्धियाँ मना करने के बजाय आसन्न कोड से आगे splice कर सकें)।