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 已嵌入用于脚本)。 ![欢迎界面](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/978e42e293012149.png) ![反编译视图](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/05ba6fd012012151.png) ## 构建 需要一个 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安全, 编译器前端, 虚拟机, 逆向工程, 静态分析