azw413/Glass

GitHub: azw413/Glass

Glass 是一个快速、免费的交互式反汇编工具,作为 IDA Pro 的替代品,专注于移动应用逆向工程,解决了传统工具速度慢和成本高的问题。

Stars: 107 | Forks: 8

# Glass *意为透明且流畅* 一个快速、原生、**移动应用优先**的交互式反汇编工具。它是 Android / iOS 逆向工程工作流中 IDA Pro 的精神继承者,基于以下技术构建: - `smali` 用于处理 APK / DEX / smali - `armv8-encode` 用于处理 AArch64(原生 `.so`,iOS Mach-O) - `gpui` (Zed) 用于 GPU 加速的原生 UI - `redb` 用于内容寻址的持久化存储 - `rquickjs` 用于脚本化插件(计划中) 许可证:GPL-3.0-only(继承自 `smali`)。 ## 为什么? 我们都用过 IDA Pro——它是逆向工程的行业标准,拥有多年积累的插件,但它速度慢、价格昂贵且界面陈旧。Glass 是 100% 的 Rust 原生应用,拥有 GPU 加速的 UI,交互流畅。它还是 100% 免费开源的——欢迎贡献力量。 ## 功能特性 * 流畅的 120fps GPU 加速渲染 * 闪电般的分析速度:对于大多数较大的二进制文件,耗时仅需 1-2 秒,而 IDA Pro 需要数分钟 * 完全链接和标注的反汇编结果,包含控制流线、注释中的数据字面量、指向其他函数的可点击链接。所有内容都配有颜色以便于查看 * 显示基本块和指向其他函数的可点击链接的控制流图 * 在整个 DEX、代码段和数据段中进行符号或字符串字面量的全项目搜索 * 带区段数据的原生二进制布局概览 * 调用者、数据引用的 Xref 搜索 * 在代码和数据段中进行带掩码和间隙的字节序列二进制搜索 * 在所有区段中搜索汇编指令或指令模式 * 为任意行(代码或数据)添加颜色和/或注释,以便日后轻松查找 * 原地编辑指令和数据(双击项目),重新构建应用以导出 * Glass 主题以及每个工作区可选择的背景颜色 ## 截图 主要视图导览——点击任何缩略图可查看大图。
AArch64 disassembly listing with arrow gutter, resolved string literals, clickable symbol references
Disassembly listing
colour-coded operands, control-flow arrows, resolved string literals inline
Control flow graph for a native function showing basic blocks, conditional and unconditional edges
Control flow graph
per-function CFG with dotted conditional edges and routed multi-rank lanes
DEX method call graph rooted at a smali method; hover-expandable callee nodes
DEX call graph
hover-to-expand callees, click to jump to the method's smali
Section-map overview of a native binary with coloured proportional bar and per-section detail
Section-map overview
proportional bar by section size, click to jump to listing / hex view
## 脚本 Glass 在 GUI 中执行的每个分析操作也都作为 CLI 命令公开,并输出结构化 JSON。同一个 `glass` 二进制文件就是自动化入口——选择一个子命令,你就能得到一个一次性的、可脚本化的结果,非常适合 `jq` 管道和 CI。 ``` # What classes ship in this APK? glass classes ./app.apk --package com.example. --text # Who calls glass::main, by address? glass callers ./libfoo.so --artifact libfoo.so --symbol "glass::main" # Every `onCreate` across DEX, machine-readable: glass search ./app.apk onCreate | jq '.data.hits[] | select(.kind=="method")' ``` 传递 `--text` 以获得人类可读的输出,省略则输出 JSON。 完整参考:**[docs/cli-api.md](docs/cli-api.md)**。 这意味着你可以对常见操作进行脚本化和自动化。 ## 技能与 MCP 每个 CLI 命令也都通过内置的 MCP (模型上下文协议) 服务器作为工具暴露出来,因此任何支持 MCP 的宿主——Claude Desktop、Cursor、Zed 或你自己的客户端——都可以直接驱动 Glass 来辅助逆向任务。 ``` # 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 ``` ``` { "mcpServers": { "glass": { "command": "/usr/local/bin/glass", "args": ["mcp"] } } } ``` 然后模型就可以在你指向的任何包上调用 `inspect`、`symbols`、`disasm`、`cfg-of`、`dex-callers`、`search` 以及所有其他命令。工具结果返回的 JSON 信封格式与你从 CLI 获得的相同。 ## 搜索 三个互补的搜索引擎,均可在 GUI 的同一 ⌘F 调色板中使用,也可作为 CLI / MCP 命令使用。 ### 全文搜索 在整个包内进行模糊匹配,范围涵盖原生符号、DEX 类 / 方法 / 字段以及代码段和数据段中的字符串字面量。输入时实时过滤;结果会分派到正确的视图(原生地址转到列表视图,DEX 目标转到 smali 查看器,数据命中转到十六进制视图)。索引在加载后于后台线程构建——构建时会显示一个进度提示。 ``` glass search ./app.apk onCreate # all things named like "onCreate" glass search ./libfoo.so init --limit 20 ``` CLI 参考:[`docs/cli-api.md` 中的 `search` 命令](docs/cli-api.md#search--path-p---query-q---limit-n)。 ### 二进制搜索 字节级模式引擎。每个原子是一个 2 字符的十六进制掩码(`c0`、`e?`、`?f`、`??`)或一个间隙(`*` = 0..=32 字节,`*(min..max)` 用于显式边界)。匹配不会跨越区段。在 GUI 调色板中,⌘2 切换到二进制模式;**仅代码** 复选框(默认开启)将扫描限制在文本段,这样在寻找指令形状时就不会淹没在数据命中中。 ``` # returning-true stub finder — `mov w0, #1 ; ret` glass bin-search ./libfoo.so --artifact libfoo.so --pattern '20 00 80 52 c0 03 5f d6' # any ADRP+ADD pair with no intervening bytes glass bin-search ./libfoo.so --artifact libfoo.so --pattern '?? ?? ?? 9? ?? ?? 4? 91' # raw data: find embedded magic glass bin-search ./libfoo.so --artifact libfoo.so --pattern 'de ad be ef' ``` 完整语法和示例:[`docs/BinSearch.md`](docs/BinSearch.md)。 ### 指令搜索 编写汇编代码,Glass 会将其编译为字节。一个用 `;` 分隔的 AArch64 序列通过 [armv8-encode](https://github.com/azw413/armv8-encode) 进行编码,任何通配符在字节引擎接管之前都会被转换为操作数位掩码。在 GUI 的二进制模式中,⌘B 可在 **字节** 和 **汇编** 语法之间切换;一个自动完成下拉菜单会显示仍与你已输入内容匹配的变体。 通配符: | 标记 | 含义 | |---|---| | `*` | 任意操作数(类型根据所选操作码推断) | | `#*` | 任意立即数(提示操作码选择器) | | `x`、`w` | 任意 X 或 W 类寄存器 | | `<*>`、``、``、`` | 括号形式的等效项,便于嵌套在其他语法中(`[x, #*]`) | ``` # every `mov w0, #N` (any N) glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'mov w0, #*' # 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, #*' # every `ret x30` — concrete, no wildcards glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'ret' ``` 响应中包含 `bytes_hex` 字段,显示编译后的掩码(例如,对于 `adrp x1, *` 是 `01/1f ?? ?? 90/9f`),这样你就可以清楚地看到哪些位是固定的,哪些是通配的。捕获(`` 用于在模式中后续交叉引用同一操作数)已设计但尚未实现。 完整设计和分阶段说明:[`docs/InsnPattern.md`](docs/InsnPattern.md)。CLI/MCP 参考:[`docs/cli-api.md` 中的 `insn-search`](docs/cli-api.md#insn-search--path-p---artifact-a---pattern----section-s---limit-n)。 ## 当前状态 Glass 目前可用于逆向分析针对 AArch64 的 Android(APK / DEX / 原生 `.so`)和 iOS(IPA / Mach-O)应用。32 位 ARM 在路线图上。 ### 已实现功能 **文件加载** - 直接打开 Android 包(`.apk`、`.aab`)、iOS 包(`.ipa`)或任何独立的 ELF / Mach-O 二进制文件(`.so`、`.dylib`、原始可执行文件)——Glass 会自动检测格式。 - Fat / 通用 Mach-O 处理透明:优先选择 `arm64e`,`arm64` 作为备选。适用于包和独立文件(例如 `glass gui /usr/lib/dyld`)。 - 加载器管线会报告进度(读取存档 → 解析 DEX / 反汇编原生代码 → 构建符号)。 - 每个构件具有内容寻址 ID(使用 blake3,大型库使用 rayon 并行)。注释跟随构件而非容器——同一个 `libfoo.so` 在两个 APK 中发布(或同一个 `libswiftCore.dylib` 在两个 IPA 中),会共享分析状态。 - AndroidManifest 查看器(二进制 XML 通过 `smali` 解码)。 - iOS 包的 Info.plist 查看器——显示包 ID、可执行文件名、版本、最低操作系统要求,以及其余 plist 以颜色编码的 XML 呈现。 **iOS — IPA / Mach-O** - 解压 IPA,定位 `Payload/*.app/`,解析 `Info.plist`,并从任何 fat 二进制文件中选取 arm64 / arm64e 切片。 - 主可执行文件和每个 `Frameworks/*.framework` + `*.dylib` 都作为其自身的原生构件加载,具有与 Android `.so` 文件相同的概览 + 按区段反汇编视图。 **Android — APK / DEX / 原生** - 跨 APK 中所有 DEX 文件的类树。 - 每个类的 smali 列表,带语法高亮(指令、类型、方法名、字符串字面量等)。 - 方法交叉引用解析到正确的类 + 行。 - `lib//` 下的原生 `.so` 文件按 ABI 加载;AArch64 进行反汇编,其他 ABI 转到十六进制视图。 **AArch64 原生(ELF + 瘦 Mach-O)** - 使用虚拟化渲染的线性扫描反汇编——大型库在几秒内即可打开,而非数分钟。 - 从 ELF 符号表、动态符号表、DWARF、`.eh_frame` FDE 和合成的 `@plt` 条目合并符号映射。通过 `symbolic-demangle` 支持 C++/Rust/Swift 名称解构。 - 分支操作数渲染为可点击的符号引用;`adrp` + `add`/`ldr` 对解析为数据目标,包括字符串字面量内联显示为注释。 - 按区段视图(代码段获得反汇编;数据段获得十六进制视图)。 **用户界面** - 标签页式右窗格,带溢出安全下拉菜单、关闭按钮、点击激活。 - 列表、十六进制和清单视图上的水平 + 垂直滚动条。 - Cmd-F 符号调色板带模糊过滤。 - 在每个视图中右键点击交叉引用:列表、十六进制和 CFG 中的 **引用地址** / **函数的调用者**;smali 中的 **方法的调用者** / **字段的引用**。结果显示在带有范围芯片的调色板中;按 Esc 键将清除范围回到整个包搜索。索引在加载后于后台线程构建——构建时会显示一个进度提示。 - Cmd-O 打开,Cmd-N 新建窗口。macOS 应用菜单带有 **文件 → 打开最近使用的项目**(最近 10 个包)。 - 每个包的窗口边界 + 打开的标签页 + 树展开状态都持久化在 `redb` 中;重新启动时会从上次离开的地方恢复。 ### 缺失功能 - armv7 / x86 反汇编(非 AArch64 代码段当前路由到十六进制视图)。 - iOS 权限和 `embedded.mobileprovision` 解析。 - Swift 元数据处理——没有它,Swift Mach-O 符号桩是稀疏的。 - ObjC `__objc_classlist` 提取。 - 用于重命名 / 注释 / 颜色的 GUI 编辑器(写入已通过 `glass set-rename` / `set-comment` / `set-colour` 和 MCP 工作——列表只是尚未渲染它们)。 - 通过 JNI 签名进行 DEX ↔ 原生的交叉引用。 - QuickJS 脚本宿主。 - 滚动条拖拽滚动(目前仅视觉效果——使用触控板 / 鼠标滚轮)。 - 清单中的资源 ID 解码(需要 `resources.arsc` 解析)。 ## 构建 Glass 运行在 **macOS 13+**(主要目标平台,通过 Metal 进行 GPU 加速——无需额外 SDK,Metal 框架随操作系统提供)和 **Linux**(通过 `gpui_linux` 支持 X11 或 Wayland,使用 Vulkan 后端)。Windows 移植在路线图上。 Releases 下有一个为 macOS 预编译的发布二进制文件,但如果你需要从源代码构建:好消息是,只需两条命令。 1. **安装 Rust**(如果你还没有): curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 2. **仅限 Linux — 安装 gpui 的原生依赖项。** 最简单的方法是运行 Zed 的设置脚本,它知道如何处理 apt / dnf / pacman 等: curl -sSL https://raw.githubusercontent.com/zed-industries/zed/main/script/linux | bash 这将拉取 `libxkbcommon-dev`、Wayland 和 XCB 头文件、Vulkan、ALSA 以及 `gpui_linux` 链接所需的其余工具链。没有这些,构建会在链接时失败,提示缺少 `xkbcommon` / `wayland-client` 符号。 3. **克隆并构建**: git clone https://github.com/azw413/Glass.git cd glass cargo build --release -p glass-cli cp target/release/glass <放到你 PATH 中的某个地方> 首次构建将编译 `gpui` 等依赖,需要几分钟时间。后续构建会很快。 4. **运行**: # 在 Android APK 或 iOS IPA 上打开 GUI——无需子命令。 glass ~/path/to/app.apk glass ~/path/to/app.ipa # 或者针对独立二进制文件——ELF .so、Mach-O .dylib 或原始可执行文件。 # Fat / 通用 Mach-O 会自动切片处理。 glass ~/path/to/libfoo.so glass ~/path/to/libBar.dylib glass /usr/lib/dyld # 无参数 → 打开一个空的 Glass 窗口;使用 文件 → 打开。 glass # 无头包检查 glass bundle ~/path/to/app.apk # 检查包的持久化状态 glass db-dump ~/path/to/app.apk 始终使用 release 构建——debug 构建的反汇编速度会慢几个数量级。 ### 打包 `.app` 包 将 release 二进制文件包装成一个 Glass.app 包,以便从 Finder 双击启动: ``` cargo build --release -p glass-cli ./packaging/make-app.sh open dist/Glass.app ``` 两种无需本地构建即可获取预编译 zip 包的方法: ## 工作区 | Crate | 用途 | |--------------------|---------------------------------------------------------------| | `glass-core` | 共享类型(`CodeKind`、ID) | | `glass-arch-arm64` | AArch64 反汇编、符号映射、PLT 合成、名称解构 | | `glass-arch-dex` | 对 `smali` 的 DEX / smali 封装 | | `glass-mobile` | APK + IPA 包加载、原生库提取、清单 | | `glass-db` | 内容寻址持久化(redb):包、标签页、设置 | | `glass-ui` | `gpui` 前端:树、列表、十六进制、清单、调色板 | | `glass-cli` | 无头检查器 + GUI 启动器 | | `glass-script` | QuickJS 插件运行时(占位符) | ## 路线图 - **iOS 深化** — 权限、`embedded.mobileprovision`、ObjC `__objc_classlist`、Swift 元数据处理。 - **armv7** — 针对旧版 `.so` 变体的 32 位 ARM 反汇编。 - **内置脚本** — 带有稳定 API 的 QuickJS 插件宿主,用于分析流程。 - **高级功能** — 签名 APK 重建。
标签:120fps渲染, AArch64, Android逆向, GPL-3.0, IDA Pro替代, iOS逆向, Linux 内核安全, Mach-O, redb, rquickjs, Rust编程语言, smali, TLS抓取, Zed, 主题自定义, 二进制分析, 二进制发布, 二进制编辑, 云安全运维, 云资产清单, 交互式反汇编, 代码分析, 免费软件, 凭证管理, 原生应用, 反汇编器, 可视化界面, 字节序列搜索, 开源工具, 快速分析, 指令模式搜索, 控制流图, 搜索功能, 数据持久化, 注释工具, 目录枚举, 移动安全, 移动应用, 符号搜索, 脚本插件, 软件安全, 逆向工程, 通知系统, 项目管理