ant4g0nist/pyre
GitHub: ant4g0nist/pyre
将 Ghidra C++ 反编译器编译为 WebAssembly 在浏览器中运行,支持 ELF、Mach-O、PE 和 WebAssembly 二进制文件的纯客户端反编译与导航分析。
Stars: 90 | Forks: 4
# Pyre
在浏览器中运行的 Ghidra C++ 反编译器。
拖入 ELF、Mach-O、PE 或 `.wasm` 文件。Pyre 会解析二进制文件,延迟加载适用于其架构的 SLEIGH 规范,并按需反编译函数。
通过函数列表进行导航,在 Monaco 中 Cmd 点击调用点以在新标签页中跟踪调用,并在侧边面板中阅读交叉引用。
所有操作均在客户端运行。二进制文件永远不会离开浏览器;没有服务器,没有上传,没有遥测。
## 状态
Alpha 阶段。核心流水线(二进制解析 → wasm 反编译 → Monaco 渲染 → 导航)支持在 x86 (32/64)、AArch64 和 WebAssembly 模块上运行。
Ghidra 支持的其他架构可以正常编译,但尚未包含在默认的规范集中 — 请参阅 [路线图](#roadmap)。
## 快速开始
你需要:
- Node 20+
- 位于你的 `PATH` 中的 [emsdk](https://emscripten.org/docs/getting_started/downloads.html)(或通过 `emsdk_env.sh` 激活)
- 一组预置的 SLEIGH 规范 — 针对一个或多个架构的预构建 `.sla` 文件(参见第 2 步)
```
# 1. 构建 wasm 模块 (~30 s 完整构建, ~5 s 增量构建)
./decompiler-wasm/build.sh
# → decompiler-wasm/dist/pyre_decompiler.{js,wasm}
# 2. 从按以下结构排列的目录中暂存 SLEIGH specs
# Ghidra/Processors//data/languages/...
./specs/stage-specs.sh /path/to/your/Ghidra/source/tree
# → specs/dist//data/languages/*.{sla,ldefs,cspec,pspec}
# → specs/dist/manifest.json
# 3. 运行 web 前端
cd web
npm install
npm run dev # http://localhost:5173
```
`web/public/decompiler` 和 `web/public/specs` 符号链接指向第 1 步和第 2 步的构建输出。
## Docker
如果你不想在本地安装 emsdk + Node:
```
docker build -t pyre-dev -f docker/Dockerfile .
docker run --rm -it -v "$PWD":/work -w /work -p 5173:5173 pyre-dev
# 在容器内:
./decompiler-wasm/build.sh
./specs/stage-specs.sh /path/to/Ghidra
cd web && npm install && npm run dev -- --host 0.0.0.0
```
## 目录结构
```
decompiler-wasm/ C++ → wasm. Vendored Ghidra decompiler tree, multi-region
LoadImage, SleighArchitecture subclass, extern "C" bridge,
emscripten unity build.
specs/ SLEIGH .sla / .ldefs / .cspec staging + manifest pipeline.
web/ React + Vite + TypeScript + Tailwind frontend, Monaco editor.
docker/ Dev image: emsdk + Node + JDK + gradle.
```
## 工作原理
```
┌──────────────────── browser ────────────────────┐
│ │
│ React UI ──► Zustand store ──► DecompilerClient │
│ │ │
│ postMessage ▼ │
│ ┌─────────────┐ │
│ │ Web Worker │ │
│ │ ┌────────┐ │ │
│ │ │ wasm │ │ │
│ │ │ Ghidra │ │ │
│ │ │ decomp │ │ │
│ │ └────────┘ │ │
│ │ FS lazy- │ │
│ │ mount │ │
│ │ /spec/... │ │
│ └─────────────┘ │
└──────────────────────────────────────────────────┘
```
有三个值得指出的设计选择:
- **为什么使用 Web Worker(硬性要求)**。Emscripten 的 `FS.createLazyFile` 在首次访问字节时使用*同步* XHR。该 API 在主线程上是非法的,但在 worker 中运行正常。规范文件(涵盖 Ghidra 支持的所有架构约 30 MB)作为延迟加载项被挂载;只有用户实际打开的架构才会产生开销。
- **多区域 `LoadImage`**。Mach-O 段位于不连续的虚拟内存地址,甚至 ELF 二进制文件的入口点也可能离第一个 PT_LOAD 页很远。单一缓冲区的平坦映射会悄无声息地导致错误的字节混叠。Pyre 的 `WebLoadImage` 包含一组以 VMA 为键的任意区域,并对反编译器询问的任何间隙进行零填充。
- **延迟加载的 libc 原型目录**。Ghidra 的 `parse_C` *按名称*将原型绑定到符号,因此只有在 JS 调用者注册了二进制文件的符号*之后*导入目录,`printf` / `puts` / `malloc` 才能在反编译输出中呈现为它们的命名形式。Bridge 将此导入推迟到第一次 `decompile()` 调用时进行。
## 路线图
- [ ] 在 `specs/` 中的 `sleighc` 构建步骤 — 编译 `Ghidra/Processors/` 下的每一个 `.slaspec`,以便我们开箱即用 Ghidra 支持的所有架构(RISC-V、MIPS、PowerPC、SPARC 等)
- [ ] 浏览器内变量重命名 — 通过 worker 往返传递名称编辑并重新反编译
- [ ] 持久化工作区 (IndexedDB),这样刷新页面就不会丢失打开的标签页
- [ ] 反汇编侧边面板(Monaco 旁边的 Capstone-wasm)
- [ ] WASM 模块反编译优化 — 字符串/数据段解析,更好的入口点检测
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。`decompiler-wasm/third_party/` 下引入的 Ghidra 反编译器源代码保留其原始的 Apache 2.0 许可证;完整归属说明请参阅 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
标签:AI工具, C++, ELF, Emscripten, Ghidra, Mach-O, Monaco Editor, PE, TLS抓取, WebAssembly, 二进制分析, 云安全运维, 云资产清单, 代码导航, 前端, 反编译器, 客户端处理, 数据擦除, 本地分析, 浏览器端, 自动化攻击, 请求拦截, 软件安全, 逆向工程, 零上传