Glass - 一款快速且免费的 IDA Pro 替代品
如其名,透明而顺滑
一款快速、原生、移动应用优先的交互式反汇编器。它是针对 Android / iOS 逆向工程工作流程的 IDA Pro 的精神继承者,围绕以下组件构建:
smali 用于处理 APK / DEX / smaliarmv8-encode 用于 AArch64 和 ARMv7(A32 / Thumb)——原生 .so、iOS Mach-Ogpui(Zed)用于 GPU 加速的原生 UIredb 用于内容寻址持久化rquickjs 用于脚本化插件(计划中)许可证:GPL-3.0-only(继承自 smali)。
我们都用过 IDA Pro —— 它是逆向工程行业的标杆,拥有多年的插件积累,但它速度慢、价格昂贵且过时。Glass 完全使用 Rust 原生编写,并采用 GPU 加速的 UI 实现流畅交互。它也是 100% 免费且开源的 —— 欢迎贡献。
arm64-v8a 和 armeabi-v7a 两个版本的库会在一次查询中被搜索到)。支持带掩码和间隔的字节模式语法;支持 AArch64 和 ARMv7 的类型化汇编语法,并带有 ISA 感知的自动补全下拉菜单主要视图一览 —— 点击缩略图查看完整尺寸。
反汇编列表 彩色操作数、控制流箭头、行内已解析的字符串字面量 |
控制流图 每个函数的 CFG,带有虚线条件边和路由的多层级通道 |
DEX 调用图 悬停展开被调用者,点击跳转到该方法的 smali |
节映射概览 按节大小比例显示条,点击跳转到列表/十六进制视图 |
Glass 在 GUI 中执行的每一次分析也会作为 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/main/docs/cli-api.md)**.
这意味着您可以编写脚本并自动化常见操作。
## 技能与 MCP
每个 CLI 动词也通过内置的 MCP(模型上下文协议)服务器作为工具公开,因此任何支持 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"] }
}
}
然后模型可以对任何你指定的包(bundle)调用`inspect`、`symbols`、`disasm`、`cfg-of`、`dex-callers`、`search`以及所有其他动词。工具结果以与CLI返回的相同JSON信封(envelope)格式返回。
## 搜索
三种互补的搜索引擎,均可在GUI的同一个⌘F面板中使用,也可作为CLI/MCP动词使用。
### 全文搜索
对整个包(bundle)进行模糊匹配,涵盖原生符号、DEX类/方法/字段以及代码和数据段中的字符串字面量。输入时实时过滤;结果将被分派到正确的视图(原生地址显示为列表,DEX目标显示为smali查看器,数据命中显示为十六进制视图)。索引在加载后在后台线程中构建——处理过程中会显示进度芯片。```sh
glass search ./app.apk onCreate # all things named like "onCreate"
glass search ./libfoo.so init --limit 20
CLI 参考:search verb in docs/cli-api.md
字节级模式引擎。每个原子是一个2字符十六进制掩码(c0,e?,?f,??)或一个间隔(* = 0..=32 字节,*(min..max) 用于显式范围)。匹配不会跨节。在 GUI 调色板中,⌘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/main/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 的原子(同时包含 `arm64-v8a` 和 `armeabi-v7a` 库的 Android 应用可以在一次查询中搜索)。
在 GUI 的二进制模式下,⌘B 会在 **Bytes** 和 **Asm** 语法之间切换;一个感知 ISA 的自动补全下拉菜单会显示仍然匹配你输入内容的变体——`r1` 过滤掉 AArch64 候选,`w0` 过滤掉 ARMv7 候选。
通配符:
| 标记 | 含义 |
|---|---|
| `*` | 任意操作数(类型由所选操作码推断) |
| `#*` | 任意立即数(提示操作码选择器) |
| `x`, `w` | 任意 AArch64 X 类或 W 类寄存器 |
| `r` | 任意 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 来显示编译后的掩码(例如 adrp x1, * 对应的 01/1f ?? ?? 90/9f),这样你可以精确地看到哪些位是固定的,哪些是通配的。捕获(<name:kind> 用于后续在模式中交叉引用同一操作数)已设计但尚未实现。
完整设计 + 阶段划分:docs/InsnPattern.md。CLI/MCP 参考:docs/cli-api.md 中的 insn-search。
Glass 现在可用于逆向分析针对 AArch64 以及 32 位 ARMv7(armeabi-v7a 库,A32 + Thumb)的 Android(APK / DEX / 原生 .so)和 iOS(IPA / Mach-O)应用。