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 主题以及每个工作区可选择的背景颜色
## 截图
主要视图导览——点击任何缩略图可查看大图。
`、``、`` | 括号形式的等效项,便于嵌套在其他语法中(`[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, 主题自定义, 二进制分析, 二进制发布, 二进制编辑, 云安全运维, 云资产清单, 交互式反汇编, 代码分析, 免费软件, 凭证管理, 原生应用, 反汇编器, 可视化界面, 字节序列搜索, 开源工具, 快速分析, 指令模式搜索, 控制流图, 搜索功能, 数据持久化, 注释工具, 目录枚举, 移动安全, 移动应用, 符号搜索, 脚本插件, 软件安全, 逆向工程, 通知系统, 项目管理