FlavouredTux/Ember
GitHub: FlavouredTux/Ember
一个从零构建的轻量级逆向工具包,提供 ELF/Mach-O 的反汇编、IR 提升、SSA 与伪 C 输出,并内置脚本与 UI 支持。
Stars: 0 | Forks: 0
# Ember
一个从零开始的逆向工程工具包:ELF + Mach-O 加载器,x86-64
反汇编器、IR 提升器、SSA、清理通道、控制流结构化、
伪 C 发射器、QuickJS 脚本界面,以及 Electron UI。
不使用 Capstone。不使用 Zydis。不使用 Ghidra 反编译器。仅依赖标准库(QuickJS-NG 已嵌入用于脚本)。


## 构建
需要一个 C++23 编译器(GCC 15+ 或较新的 Clang)以及 CMake 3.28+。
```
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
./build/cli/ember --help
```
### UI
Electron UI 位于 `ui/` 目录中。它会调用 `ember` CLI 二进制文件。
```
cd ui
npm install
npm run dev
```
如果 CLI 不在 `../build/cli/ember` 路径,请设置 `EMBER_BIN`。
## CLI
```
ember [options]
-d, --disasm linear disassembly of a function
-c, --cfg control-flow graph of a function
-i, --ir lifted IR of a function
--ssa IR in SSA form (implies -i)
-O, --opt run cleanup passes (implies --ssa)
--struct structured regions (implies -O)
-p, --pseudo pseudo-C output (implies --struct)
-X, --xrefs emit full call graph (all fn -> call targets)
--strings dump printable strings (addr|text|xrefs)
--arities dump inferred SysV arity per function
-s, --symbol NAME target a specific symbol (default: main)
--annotations P read user renames / signatures from a project file
--project PATH project file scripts may read/write via project.*
--script PATH run a JS file against the loaded binary
-- ARG... pass remaining args to the script as argv
--cache-dir DIR override ~/.cache/ember
--no-cache bypass the on-disk cache
```
`--xrefs`、`--strings` 和 `--arities` 会缓存到 `~/.cache/ember/`
(键为路径 + 文件大小 + 修改时间)。首次运行较慢;对同一二进制文件的后续运行会完全跳过分析。
## 管道
```
ELF → decoder → CFG → IR lift → SSA →
cleanup passes → structurer (if/while/switch) → pseudo-C
```
仅支持 x86-64。ELF 和 Mach-O 格式。
## 脚本
`--script PATH` 会运行一个 JavaScript 文件,并通过 `binary`、`xrefs`、`strings` 和(使用 `--project` 时)`project` 暴露加载的二进制文件。
```
ember --script scripts/query.js -- [args...]
```
`samples/query.js` 是一个通用调度器,覆盖 `info`、`imports`、`sections`、`bytes`、`disasm`、`func`、`pseudo-c`、`xrefs-to`、`callers`、`callees`、`strings`、`string-xrefs`、`find-func`、`find-bytes` 等功能。
变更(`project.rename`、`setSignature`、`note`)会暂存到缓冲;`project.commit()` 将更改写回项目文件。每个变更器也接受 `{ dryRun: true }` 参数,以便在提交前预览变更。
## 布局
```
core/ C++23 library (everything except the CLI shim)
include/ember/ public headers
src/
binary/ ELF + Mach-O loaders
disasm/ x86-64 instruction decoder
analysis/ CFG builder, SysV arity inference, strings scanner
ir/ IR + x64 lifter + SSA builder + cleanup passes
structure/ region builder (if / while / switch)
decompile/ pseudo-C emitter
script/ QuickJS runtime + bindings
common/ annotations (project file), on-disk cache
cli/ command-line driver
scripts/ JS scripts that run against the CLI (query.js, etc.)
ui/ Electron + React + TypeScript frontend
tests/ golden-output CTest suite
third_party/ vendored deps (QuickJS-NG)
```
## 测试
```
cmake --build build -j
ctest --test-dir build
```
测试固件是在构建时编译的小型 C 程序;输出会与 `tests/golden/` 中的已检查金标准进行比对。
要接受有意的输出变更:
```
UPDATE_GOLDEN=1 ctest --test-dir build -V
```
## 状态
处于积极开发阶段。输出足以在阅读 x64 代码时胜过手工分析,但边缘情况仍较粗糙——特别是在间接调用、子寄存器算术边界情况,以及默认跳转目标超出表范围检查时。
## 许可证
MIT。参见 [LICENSE](LICENSE)。QuickJS-NG(嵌入在 `third_party/quickjs/`)也采用 MIT 许可。
标签:Bash脚本, C++23, CMake, Electron, ELF, Findomain, IR, Mach-O, QuickJS, SSA, URL提取, Wayback Machine, Waymore结果处理, x86-64, 二进制发布, 云安全监控, 云资产清单, 代码还原, 伪C, 反向工程, 反汇编, 反编译, 反编译工具, 反编译引擎, 反编译框架, 开源工具, 控制流图, 数据可视化, 生成式AI安全, 编译器前端, 虚拟机, 逆向工程, 静态分析