kassane/ghidra-demangle-scripts
GitHub: kassane/ghidra-demangle-scripts
基于 Ghidra 无头模式的多语言二进制反编译与符号还原工具,支持 C++23、D、Rust、Swift 四种编译语言的自动化分析。
Stars: 0 | Forks: 0
# Ghidra 无头逆向工程:C++23、D、Rust、Swift
无头 Ghidra 工具包 —— 解码符号、重命名函数并反编译四种语言的二进制文件,无需打开 GUI。
## 环境要求
| 工具 | 说明 |
|------|-------|
| Ghidra | `analyzeHeadless` 位于 `/opt/ghidra/support/` |
| g++ 13+ | 支持 `-std=c++23` |
| LDC2 | 包含 `ddemangle` |
| c++filt | GNU binutils,Linux 标配 |
| rustfilt | 通过 `cargo install rustfilt` 安装 |
| swift-demangle | Swift 工具链,必须存在于 `PATH` 中 |
## 目录布局
```
ghidra-demangle-scripts/
├── decompile.sh # build all samples + run all Ghidra passes
├── sample/
│ ├── target.cpp / target_cpp # C++23
│ ├── target.d / target_d # D (extern(D) + extern(C++, "ns"))
│ ├── target.rs / target_rust # Rust
│ └── target.swift / target_swift # Swift
├── ghidra_scripts/
│ ├── ExtractFunctions.java # C++23 feature tagging + xrefs + decompile
│ ├── DemangleD.java # _D* via ddemangle, _Z* via c++filt
│ ├── DemangleRust.java # _R* and _ZN*…hE via rustfilt
│ └── DemangleSwift.java # $s / _$s via swift-demangle
├── *_analysis_output.txt # generated: symbol + function reports
└── *_decompiled_output.c # generated: Ghidra decompiler output
```
## 构建示例并运行分析
```
bash decompile.sh
```
该脚本会构建所有四个示例二进制文件,并按顺序运行每个 Ghidra 无头处理阶段。输出文件将被写入到仓库根目录:
| 文件 | 脚本 |
|------|--------|
| `cpp_analysis_output.txt` | `ExtractFunctions.java` |
| `cpp_decompiled_output.c` | `ExtractFunctions.java` |
| `d_analysis_output.txt` | `DemangleD.java` |
| `d_decompiled_output.c` | `DemangleD.java` |
| `rust_analysis_output.txt` | `DemangleRust.java` |
| `rust_decompiled_output.c` | `DemangleRust.java` |
| `swift_analysis_output.txt` | `DemangleSwift.java` |
| `swift_decompiled_output.c` | `DemangleSwift.java` |
可以通过每个阶段的 `-scriptArgs "output.path=/tmp/out.txt decompile.path=/tmp/out.c"` 来覆盖输出路径。
所有四个示例共享相同的授权逻辑:长度 12,字节/标量和为 `0x4B2`,前缀为 `A`。
有效密钥示例:`Auffffffffff`。
## 脚本
### ExtractFunctions.java — C++23
为检测到 C++23 特性的函数打上标签,并将所有非 thunk 函数反编译到 `cpp_decompiled_output.c`。Ghidra 内置的解码器会在后置脚本运行之前剥离 `std::`,因此该脚本会扫描完整的签名字符串(名称 + 参数类型 + 返回类型)并匹配裸形式:
| 标签 | 匹配项 |
|-----|---------|
| `[C++23:expected]` | `expected<` |
| `[C++23:print]` | `println`, `vprint_*` |
| `[C++23:fold]` | `fold_left`, `fold_right` |
| `[C++23:deducing-this]` | 签名中的 `(this ` |
| `[C++23:flat]` | `flat_map`, `flat_set` |
| `[C++23:generator]` | `generator<` |
### DemangleD.java — D
- `_D*` → 通过 **stdin** 传入 `ddemangle`(作为 CLI 参数传递会导致 "Cannot open file")
- `_Z*` → `c++filt `
- 为每个符号报告 `[extern(D) ]` / `[extern(C++)]`
- 自动从 `PATH` 以及随后的 `~/.dlang/*/bin/` 发现 `ddemangle`
### DemangleRust.java — Rust
- `_R*` → v0 符号修饰
- `_ZN*17h[0-9a-f]{16}E` → 旧版符号修饰(哈希后缀用于区分 Rust 和 C++)
- 两者均通过 `rustfilt ` 处理;自动从 `PATH` 以及随后的 `~/.cargo/bin/` 发现
### DemangleSwift.java — Swift
- Linux 上为 `$s` 前缀,macOS 上为 `_$s`
- `swift-demangle ` 输出 `mangled ---> demangled`;脚本在 ` ---> ` 处进行拆分
- 自动从 `PATH` 以及随后的 `/usr/bin/swift-demangle` 发现
## D 命名空间注意事项
LDC2 的冒号形式 `extern(C++, "ns"):` 会累积命名空间上下文 —— 第二个代码块会嵌套在第一个内部。请改用**块形式**:
```
extern(C++, "security") { uint fnv1a(...) { ... } } // → security::fnv1a
extern(C++, "crackme") { class Validator { ... } } // → crackme::Validator
```
字符串字面量形式(`"ns"`)指定的是绝对命名空间路径;标识符形式(`ns`)则不是。
D 切片(`string`、`int[]`)没有 C++ ABI —— 在 `extern(C++)` 方法中应使用 `const(char)*` + `size_t`,并通过 `@trusted` 函数桥接回 D 逻辑。
## 注意事项
| | |
|---|---|
| `ldc2 -of=~/...` | `~` 不会被展开;请使用 `$HOME` 或绝对路径 |
| `ddemangle` | 仅支持 stdin —— 不支持 CLI 参数 |
| `c++filt` / `rustfilt` | 仅支持 CLI 参数 —— 不支持 stdin |
| `--edition=` | 有效值:2023, 2024, 2025 |
| `-preview=safer` | 禁止对切片使用 `.ptr`;请使用 `&arr[0]` |
| `grep '$s'` | 请使用 `-F` 标志;`$s` 不是 shell 变量 |
## 参考资料
- [Ghidra 脚本 API](https://ghidra.re/online-docs/api/ghidra/app/script/GhidraScript.html)
- [DecompInterface API](https://ghidra.re/online-docs/api/ghidra/app/decompiler/DecompInterface.html)
- [D extern(C++) 互操作](https://dlang.org/spec/cpp_interface.html)
- [Rust 符号修饰 v0](https://doc.rust-lang.org/rustc/symbol-mangling/v0.html)
- [Swift ABI 符号修饰](https://github.com/apple/swift/blob/main/docs/ABI/Mangling.rst)
- [Itanium C++ ABI](https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling)
标签:C++23, CTF工具, DAST, DNS 反向解析, DNS 解析, D语言, Ghidra, Java脚本, JS文件枚举, Rust, Swift, URL提取, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 反混淆, 反编译, 可视化界面, 域名枚举, 应用安全, 恶意软件分析, 无头模式, 漏洞搜索, 符号还原, 编译器, 网络流量审计, 自动化分析, 跨站脚本, 软件开发, 逆向工程, 静态分析