chaoticgd/ccc
GitHub: chaoticgd/ccc
一套用于解析 PS2 游戏 STABS 调试符号并生成结构化数据或伪源码的 C++ 工具集。
Stars: 97 | Forks: 10
# Chaos Compiler Collection
一个用于从 PS2 游戏中解析调试符号的库和命令行工具集。1.x 系列版本专注于 .mdebug 节中的 STABS 符号,而 2.x 系列版本也可以解析标准 ELF 符号和 SNDLL 链接器符号。DWARF 支持正在开发中。
- [版本发布](https://github.com/chaoticgd/ccc/releases)
- [不稳定构建](https://github.com/chaoticgd/ccc/releases/tag/unstable)
## 工具
### demangle
C++ 符号反修饰器,支持新的 Itanium C++ ABI (GCC 3+) 修饰方案和旧的 GCC 2 方案。
### objdump
半成品的 EE 核心 MIPS 反汇编器。可能不太有趣。
### stdump
符号表解析器和转储器。它可以提取以下信息:
- 数据类型(结构体、联合体、枚举等)
- 函数(名称、返回类型、参数和局部变量)
- 全局变量
支持以下输出格式:
- C++
- JSON
旨在与 [ghidra-emotionengine-reloaded](https://github.com/chaoticgd/ghidra-emotionengine-reloaded)(>= 2.1.0 或不稳定构建之一)配合使用,以将所有这些信息导入 [Ghidra](https://ghidra-sre.org/)。请注意,尽管有这个名字,STABS 分析器应该适用于 R3000 (IOP),也可能适用于其他 MIPS 处理器。
### uncc
这类似于 stdump,不同之处在于它将其输出组织成单独的源文件,并具有许多额外功能,旨在尝试使所述输出更接近有效的源代码。必须在输出目录中提供一个 `SOURCES.txt` 文件,该文件可以使用 `stdump files` 命令生成(您应该手动修正路径,使它们相对于输出目录,并删除地址)。此外,不以 `// STATUS: NOT STARTED` 开头的非空文件将不会被覆盖。
如果在输出目录中提供了 `FUNCTIONS.txt` 文件(可以使用包含的 `CCCDecompileAllFunctions.java` Ghidra 脚本生成),则该文件中的代码将用于填充输出中的函数体。在这种情况下, emitted 的第一组局部变量声明将是那些从符号中恢复的,第二组将来自函数文件中提供的代码。函数名称会被反修饰。
全局变量数据将根据其数据类型以结构化方式打印。
数据类型将被分类到相应的文件中。由于此信息不存储在符号表中,uncc 使用启发式方法将类型映射到文件。当类型仅出现在单个翻译单元中时,类型将被放入 `.c` 或 `.cpp` 文件中;当有多个翻译单元时(因此必须使用启发式方法来确定放置位置),则放入 `.h` 文件中。
建议对输出使用代码格式化工具,如 `clang-format` 或 `astyle`。
## 构建
```
cmake -B bin/
cmake --build bin/
```
## 文档
### Chaos Compiler Collection
- [库概述](docs/LibraryOverview.md)
- [编译器 Bug](docs/CompilerBugs.md)
- [错误处理](docs/ErrorHandling.md)
- [JSON 格式](docs/JsonFormat.md)
- [项目结构](docs/ProjectStructure.md)
- [符号数据库](docs/SymbolDatabase.md)
### DWARF (.debug) 节
- [DWARF 调试信息格式](https://dwarfstd.org/doc/dwarf_1_1_0.pdf) / [仓库内镜像](docs/mirror/dwarf_1_1_0.pdf) / [archive.org 镜像](https://web.archive.org/web/20230702091554/https://dwarfstd.org/doc/dwarf_1_1_0.pdf)
### MIPS ABI
- [MIPS EABI](https://sourceware.org/legacy-ml/binutils/2003-06/msg00436.html) / [仓库内镜像](docs/mirror/mips_eabi.txt) / [archive.org 镜像](https://web.archive.org/web/20231222053837/https://sourceware.org/legacy-ml/binutils/2003-06/msg00436.html)
- [System V 应用程序二进制接口 MIPS RISC 处理器补充](https://refspecs.linuxfoundation.org/elf/mipsabi.pdf) / [仓库内镜像](docs/mirror/mipsabi.pdf) / [archive.org 镜像](https://web.archive.org/web/20240724010702/https://refspecs.linuxfoundation.org/elf/mipsabi.pdf)
### MIPS 调试 (.mdebug) 节
- [Third Eye Software 和 MIPS 符号表 (Peter Rowell)](http://datahedron.com/mips.html) / [仓库内镜像](docs/mirror/ThirdEyeSoftware.html) / [archive.org 镜像](https://web.archive.org/web/20230605005654/http://datahedron.com/mips.html)
- [MIPS Mdebug 调试信息 (David Anderson, 1996)](https://www.prevanders.net/Mdebug.ps) / [仓库内镜像](docs/mirror/Mdebug.ps) / [archive.org 镜像](https://web.archive.org/web/20170305060746/https://www.prevanders.net/Mdebug.ps)
- MIPS 汇编语言程序员指南,符号表章节 (Silicon Graphics, 1992) / [仓库内镜像](docs/mirror/MIPSProgrammingGuide.pdf)
- Tru64 UNIX 目标文件和符号表格式规范,符号表章节
- 版本 5.1 (Compaq Computer Corporation, 2000) / [仓库内镜像](docs/mirror/tru64coff.pdf)
- 版本 5.0 (Compaq Computer Corporation, 1999) / [仓库内镜像](docs/mirror/OBJSPEC.PDF)
- 来自 gdb 的 `mdebugread.c` (读取)
- 来自 gas 的 `ecoff.c` (写入)
- 来自 binutils 的 `include/coff/sym.h` (头文件)
### STABS
- [调试信息的 "stabs" 表示 (Julia Menapace, Jim Kingdon, 和 David MacKenzie, 1992-???)](https://sourceware.org/gdb/onlinedocs/stabs.html) / 仓库内镜像 ([HTML](docs/mirror/stabs.html), [PDF](docs/mirror/stabs.pdf)) / [archive.org 镜像](https://web.archive.org/web/20230328114854/https://sourceware.org/gdb/onlinedocs/stabs.html/)
- 来自 binutils 的 `stabs.c` (读取)
- 来自 gdb 的 `stabsread.c` (读取)
- 来自 gdb 的 `dbxread.c` (读取)
- 来自 gcc 的 `dbxout.c` (写入)
- 来自 gcc 的 `stab.def` (符号代码)
## 许可证
CCC 库及相关命令行工具的源代码在 MIT 许可证下发布。
使用了 GNU 反修饰器,其中包含在 GPL 和 LGPL 下许可的源文件。RapidJSON 在 MIT 许可证下使用。GoogleTest 库由测试套件在 3-Clause BSD 许可证下使用。
标签:Bash脚本, C++符号修饰, DWARF, ELF, Emotion Engine, Ghidra, Homebrew安装, Itanium ABI, JSON导出, .mdebug, MIPS, PlayStation 2, PS2, STABS, URL提取, Wayback Machine, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码复原, 反汇编, 反编译, 游戏逆向, 符号表提取, 编译器工具链, 调试符号解析, 逆向工程, 静态分析