shellcell/exex
GitHub: shellcell/exex
exex 是一款快速终端 UI 工具,用于在只读模式下浏览和探索 ELF、Mach-O、PE 二进制文件的结构、反汇编与源代码映射。
Stars: 0 | Forks: 0
# exex
一个用于探索 **ELF、Mach-O 和 PE** 二进制文件的快速终端 UI —— 在一个键盘和鼠标驱动的界面中查看 header、sections、segments、symbols、反汇编、hex/raw 字节、strings、libraries、relocations、syscall 站点和 DWARF 源代码映射。
其突出特点是:当二进制文件具有调试信息(DWARF 或 Mach-O 的 `.dSYM`)时,exex 会将**原始源代码与其映射的确切反汇编并排显示** —— 支持双向导航,并且完全**静态**:无需 debugger,没有运行中的进程,也不依赖 decompiler。
```
exex [-debug PATH] [-s STRING] [-o [VIEW]] [goto]
```

## 特性亮点
- **一个浏览器支持三种格式:** ELF、Mach-O、PE 以及 universal/fat Mach-O 切片。
- **源代码 ↔ 反汇编:** 从 DWARF 或 `.dSYM` 获取机器代码旁的原始源代码。
- **快速预览:** 只读,无项目数据库,无需 debugger 会话。
- **多种视图:** symbols、sections、segments、strings、relocations、libraries、syscall 站点、CPU 特性、hex/raw 字节和反汇编。
- **可脚本化:** `-o` 输出纯文本,便于管道传输和自动化。
- **也支持文本脚本:** shell/Python 等脚本会在关联的文本查看器中打开,而不会因为“不是二进制文件”而报错。
请参阅 [exex 与其他工具的对比](#how-exex-compares-to-other-tools),了解它与 binutils、debugger 和 RE 平台之间的权衡。
## 安装说明
### Homebrew (macOS / Linux)
```
brew install shellcell/tap/exex
```
### Linux 软件包
启用 shellcell 仓库(仅需一次)—— 设置说明见
—— 然后执行:
```
sudo apt install exex # Debian / Ubuntu
sudo dnf install exex # Fedora / RHEL
sudo apk add exex # Alpine
```
### Go
```
go install github.com/shellcell/exex@latest
```
### 预编译二进制文件
从 [Releases](../../releases) 下载适合您操作系统/架构的资产:
```
tar -xzf exex---.tar.gz
chmod +x exex && sudo mv exex /usr/local/bin/
shasum -a 256 -c checksums.txt # optional
```
### 从源码构建
```
make build # -> ./exex
make test # go test
make test-cross # cross-compile and parse/disassemble readable targets; needs Go + Zig
```
### Man page 和补全
Man page (`docs/exex.1`) 和 bash/zsh/fish 补全 (`completions/`) 随源代码和发布压缩包一起提供。补全涵盖了各种 flag、`-o` 视图名称以及 `` 参数 —— 包括 `$PATH` 上的文件和命令,因此 `exex ls` 可以正常工作。
```
make install-man # -> $MANPREFIX/man1/exex.1 (sudo for a system prefix)
make install-completions # -> bash/zsh/fish completion dirs (override *COMPDIR vars)
```
手动安装其一:`source completions/exex.bash`;将 `completions/_exex` 复制到您的 zsh `$fpath` 中(在 `compinit` 之前);或将 `completions/exex.fish` 复制到 `~/.config/fish/completions/`。
## 用法
```
exex [flags] [goto]
```
- `` —— 一个 ELF/Mach-O/PE 文件,或是 `$PATH` 上的命令名(`exex ls` 将打开 `/bin/ls`)。
- `goto` —— 打开时要跳转到的可选地址 (`0x401000`) 或 symbol。唯一的 symbol 会直接跳转过去;有歧义的 symbol 会打开按其过滤后的 Symbols 视图。
flag 可以在任意位置使用:
| Flag | 描述 |
|------|-------------|
| `-s STRING` | 搜索可打印字符串;在 Hex 中打开匹配项,如果匹配到多个则在 Strings 中进行过滤 |
| `-debug PATH` / `-d PATH` | 外部调试符号(ELF `.debug` 伴随文件,或 Mach-O `.dSYM` bundle/文件) |
| `-arch NAME` | 指定要打开的 universal (fat) Mach-O 切片(例如 `x86_64`、`arm64`);默认为主机架构。Info 会列出所有切片;按 `t` 进行切换 |
| `-o VIEW` | 将视图打印到 stdout 并退出:`info`、`sections`、`segments`、`symbols`、`strings`、`libs`、`sources`、`relocs`、`syscalls`、`syscalls-all`、`syscalls-full`、`disasm`、`disasm-all` |
| `-o` (裸命令) | 打印 `goto` symbol/address 的函数反汇编并退出 |
### 使用 `-o` 进行脚本化
`exex -o symbols ./bin`, `exex -o disasm ./bin | less`, `exex -o ./bin main`(单个函数)。`disasm` 涵盖可执行的 sections(类似于 `objdump -d`),`disasm-all` 涵盖所有 sections(类似于 `objdump -D`)。输出采用流式处理,因此即使在大型二进制文件上,`| head` 也会立即返回。`relocs` 打印 relocation 表(类似于 `readelf -r`)。
syscall 视图会查找每一条 kernel-entry 指令(`syscall`/`svc`/`int 0x80`/`ecall`),并尽可能从加载到 syscall-number 寄存器中的立即数恢复调用**编号**,以及对 vDSO 辅助函数(`__vdso_*`)的调用:
- `syscalls` —— 二进制文件发出的**去重后**调用。
- `syscalls-all` —— 每一个站点及其地址。
- `syscalls-full` —— 还会扫描直接链接的库(一个动态链接的程序通常不会发出*直接的* syscall —— 它们位于 libc 中),为每个调用标记其原始目标 object,并列出无法解析的库。
### 按键
| 按键 | 操作 |
|-----|--------|
| `1`–`9` / `0` | 切换视图(Info、Sections、Symbols、Disasm、Hex、Raw、Strings、Libs、Sources · `0` Relocations) |
| `⇧h` / `⇧f` / `,` / `^o` | 原始 header 叠加层 · CPU 特性扫描 · 设置 · 返回上一个文件 |
| `↑/↓` `j/k`, `PgUp/PgDn`, `Home/End` | 移动 / 翻页(在 macOS 上也可用 `⌘↑`/`⌘↓`, `^A`/`^E`) |
| `/` | 过滤 / 搜索当前视图 |
| `Enter` | 打开 / 跟随 / 跳转 |
| `g` | 跳转到地址或 symbol |
| `[` / `]` | 在列表视图中向上 / 向下翻页;上一个 / 下一个 section (Hex/Raw) 或 symbol (Disasm) |
| `⇧[` / `⇧]` | 上一个 / 下一个非零字节 (Hex/Raw) |
| `d` / `h` / `m` | 在 Disasm / Hex / Raw 视图中跳转到光标所在地址 |
| `s` / `r` | 循环切换排序字段 · 反向排序(Sections、Symbols、Strings、Sources、Relocations;`r` 按名称反向排序 Libs) |
| `x` / `y` | Disasm:查找引用(xrefs) · 列出系统调用(范围限定在函数 / 整个二进制文件 / 去重后) |
| `^t` / `^s` / `^b` / `^f` / `^p` | 列过滤器 —— Symbols:类型 / 作用域 / bind · Sections:类型 (`^t`) / 标志 (`^f`) · Strings:section (`^s`) · Relocations:类型 (`^t`) / section (`^s`) · Libs/Sources:可用性 (`^p`) |
| `t` (或 `Tab`) | 切换视图模式 —— Symbols/Sources:**树形** ↔ 平铺列表;Sections:sections ↔ segments;Libs:平铺 ↔ 树形;Hex/Raw:ascii ↔ 指针解码;Info:fat-Mach-O 架构切片(`Tab` 在 Disasm 中为源代码面板) |
| `←`/`→` · `Enter` · `+`/`−` | 树形结构:折叠 / 展开组(在叶节点上按 `←` 可折叠其分支) · 展开/折叠下方所有节点 · 全部 |
| `e` / `.` | 将过长的 `(…)`/`<…>` 参数和模板列表折叠为 `...` —— `e` 全部折叠(也可在 Disasm/Hex/Raw 中使用),`.` 折叠当前 Symbols 行 |
| `⇧a` / `⇧s` / `⇧p` / `⇧c` | 复制地址 / 名称 / 指针 (Hex/Raw) / 函数反汇编 (Disasm) |
| `⇧l` | 复制整行(所有列) |
| `w` | 切换长行换行 |
| `Tab` / `⇧Tab` | 显示/隐藏 / 交换反汇编源代码面板 |
| `?` | 完整按键参考 · `q` 退出 |
按键支持重新绑定。鼠标滚轮可滚动,单击可选择,双击可在反汇编视图中进行跟随跳转。
## 配置说明
配置文件为位于 `$XDG_CONFIG_HOME/exex/config.yaml` 的可选 YAML 文件(如果未设置 `XDG_CONFIG_HOME`,则位于 `$HOME/.config/exex/config.yaml`)。每个字段都是可选的 —— 未设置的条目保持其默认值。您可以:
- 选择一个内置的**主题**:`theme: nord | dark | solarized-dark | solarized-light`,
- 在 `colors:` 下覆盖单个**颜色**(指令类、地址链接、表格、源代码/asm 高亮、hex 字节渐变、路径等)—— 使用 `#RRGGBB` 字符串或 ANSI-256 索引(例如 `"203"`),
- 重新绑定顶层**按键**,
- 设置**行为**:默认视图、默认换行、反汇编落地目标、解码窗口大小。
[`docs/config.example.yaml`](docs/config.example.yaml) 包含完整的带注释 schema。
## exex 与其他工具的对比
exex 有意与经典的二进制工具产生重叠:它将通常需要多个一次性命令才能获得的功能整合到了一个交互式的、多格式 TUI 中 —— 并且仍然可以通过 `-o` 为脚本输出这些工具的纯文本。
### 经典 CLI 工具
| 工具 | 功能 | 在 exex 中 |
|------|--------------|---------|
| `readelf` | 导出 header、sections、program headers、symbols、动态信息和 DWARF | Info / Sections / Segments / Symbols / Libs 视图;`-o info\|sections\|segments\|symbols\|libs`。(`readelf` 仅适用于 ELF;exex 还能读取 Mach-O 和 PE) |
| `objdump -d` / `-D` | 反汇编可执行的(或所有)sections | Disasm 视图(导航、xrefs、源代码映射);使用 `-o disasm` / `-o disasm-all` 获取 objdump 风格的列表 |
| `nm` | 列出 symbols | Symbols 视图(过滤、按名称/地址/大小/作用域/类型/bind 排序);`-o symbols` |
| `c++filt` | 还原被修饰的名称(demangle) | 全局内联还原(内置支持 C++/Rust,Swift 通过 `swift-demangle`) |
| `strings` | 可打印字符串 | Strings 视图(映射到地址和 section);`-o strings` 或 `-s` |
| `hexdump` / `xxd` / `od` | hex + ASCII 导出 | Hex 视图(虚拟地址、感知 section、指针解码、数据检查器)和 Raw 视图(文件偏移) |
| `addr2line` | 通过 DWARF 实现 地址 → 源代码 `file:line` | 源代码面板和 Sources 视图 —— 地址 ↔ 源代码双向映射 |
| `size` | section/segment 大小 | Info、Sections 和 Segments 视图 |
| `otool` (macOS) / `dumpbin` (Windows) | 上述工具在 Mach-O / PE 中的对应物 | 一个工具同时支持 ELF、Mach-O 和 PE |
| `dyld_info` (macOS) | Mach-O 的 dyld 元数据:bind/rebase 和 chained fixups、dylibs、exports | Relocations 视图将 bind/rebase 操作码和 chained fixups 解码到同一个表中(`-o relocs`);Libs 视图列出依赖的 dylibs,包括 re-export/weak/upward 变体 |
| `dyld_shared_cache_util` (macOS) | 从 dyld 共享缓存中列出 / 提取 dylibs | 直接从 Libs 中打开缓存的系统 dylib(`o`),将其非共享化为可浏览的 Mach-O —— 无需单独提取 |
| `dyld_usage` (macOS) | 实时跟踪进程的 dyld / 共享缓存活动 | exex **静态地**缓存跟踪二进制文件的导入(例如 libSystem → libsystem_kernel),以发现传递的 syscall 面(`-o syscalls-full`)—— 无需运行程序 |
这些工具每一个都只能回答一个问题,打印后即退出。exex 在一个地方回答所有问题,并让您在它们之间进行**导航** —— 在反汇编中跟踪调用,从 symbol 跳转到其 hex 代码,将地址映射到其源代码行,列出函数的 xrefs —— 并且在需要管道传输时仍然可以像它们一样打印输出。
### 逆向工程平台
**Binary Ninja, IDA Pro, Ghidra** 是完整的 RE/反编译套件:递归分析、decompiler、类型系统、持久化数据库、脚本、patching。它们功能强大且十分庞大。**exex 处于另一端**:一个微型的、只读的、即时的终端浏览器,没有项目、没有数据库、也没有 decompiler。需要深度分析时使用它们;需要在几秒钟内*查看*二进制文件时,请使用 exex。
**radare2 / rizin** 在理念上最为接近 —— 基于终端、可脚本化、多格式 —— 但它们是广泛的框架(分析、patching、调试、仿真),具有陡峭的命令语言。exex 在目的上要狭窄得多:它是一个可被轻易发现的、即指即看的浏览器,而不是分析或 patching 框架。
### 源代码 ↔ 反汇编
exex 在映射到的反汇编代码旁显示原始源代码,支持双向导航,并通过插入符号标记源代码行的哪些列映射到哪些指令。其他工具也会结合源代码和汇编,但方式不同:
| 工具 | 方式 | 对比 exex |
|------|-----|---------|
| `objdump -S` / `-dl` | 将 DWARF 源代码行交错插入到列表中 | 数据相同,但属于平铺式的一次性导出 —— 没有面板、没有导航、没有列映射 |
| `gdb` (`layout split`), `lldb`, IDE 反汇编窗口 | 交互式源代码 + 汇编并排显示 | 需要**调试会话**(一个启动/附加的进程);exex 仅需要磁盘上的文件 |
| IDA Pro, Ghidra, Binary Ninja, Hopper, Cutter | 反汇编旁边显示 **decompiler 伪代码** | 重建的 C 代码,而不是您的原始源代码;DWARF 主要用于获取名称/类型 |
| Compiler Explorer (godbolt.org) | 颜色链接的源代码 ↔ 汇编 | *编译* 源代码,而不是读取现有二进制文件的调试信息 |
所以 exex 并不试图取代 binutils 套件或反汇编平台 —— 它是快速的第一眼预览:打开任何 ELF/Mach-O/PE,读取其布局和代码,交互式地跟随引用和源代码映射,并在需要编写脚本时输出纯文本。
## 架构
对于贡献者,[`docs/architecture.md`](docs/architecture.md) 描述了包的分层(核心 `binfile`/`disasm`、领域服务、两个前端)、TUI 的视图契约(`view.Context` / `view.Host`)以及渲染和性能约定,并附带图表。
## License
exex 基于 MIT License 发布 —— 请参阅 [LICENSE](LICENSE)。
标签:DWARF, ELF, EVTX分析, Mach-O, PE, Wayback Machine, 二进制分析, 云安全运维, 云资产清单, 反汇编, 日志审计, 终端UI, 逆向工程