open-ead/sead

GitHub: open-ead/sead

sead是任天堂第一方游戏标准C++库的反编译重建项目,帮助研究者和开发者理解游戏内部结构并开发相关工具。

Stars: 223 | Forks: 41

# sead 这是 sead 的反编译项目,sead 是任天堂第一方游戏的标准 C++ 库。 与本项目衍生的原始 [sead 反编译项目](https://github.com/aboood40091/sead)不同,本项目针对的是更新版本的 sead。 其目标是尽可能准确地重建标准库,以便最终通过添加对其他平台的支持以及简化与 sead 游戏交互的项目的创建来实现互操作性。 因为 sead 在游戏中(且仅在游戏中)是静态链接的,获取原始 sead 需要合法拥有至少一款最近的任天堂第一方游戏。强烈建议选择附带调试符号的游戏: * Super Mario Odyssey (版本 1.0.0)([在此购买](https://www.nintendo.com/games/detail/super-mario-odyssey-switch/)) * Splatoon 2 (版本 <= 3.1.0)([在此购买](https://www.nintendo.com/games/detail/splatoon-2-switch/)) * [Nintendo Labo](https://labo.nintendo.com/)(试点版本包含符号、文件名和断言) * 任何其他包含符号并使用 sead 的游戏 文件名、函数名和文件组织结构来源于上述所有游戏中的调试符号、断言和信息。 除任天堂外,没有人拥有 sead 的源代码,甚至是第三方开发者。 请注意,许多名称(尤其是内联和模板化函数的名称)仅仅是推测。 ## 模块 有关进度,请参阅 [GitHub 项目页面](https://github.com/zeldamods/sead/projects/1)。目前有几个模块无法在 Switch 上构建。 * **audio** - 音频 * **basis** - 类型、断言、分配运算符 * **codec** - Base64, CRC16, CRC32 * **container** - 模板容器类 * **controller** - 控制器 * **devenv** - 开发环境(调试工具) * **filedevice** - 文件 IO * **framework** - 框架(游戏框架、任务等) * **geom** - 几何 * **gfx** - 图形 * **heap** - 堆( arenas, disposers, 不同类型的 heaps) * **hostio** - 主机 IO(与 PC 通信) * **math** - 数学工具(向量、矩阵等) * **message** - libms 封装 * **mc** - 多核支持 * **prim** - 原语(字符串、枚举、RTTI 等) * **random** - 随机数生成器 * **resource** - 资源(加载、解压等) * **stream** - 流 IO * **thread** - 线程工具(线程、临界区、消息队列等) * **time** - 时间工具 ### 平台特定源码 平台特定的文件通常放置在以下子目录中: * **cafe** 用于 Wii U * **ctr** 用于 3DS * **nin** 用于 nnSdk (Switch) ### 版本特定源码 sead 的不同功能可以根据库所用于的游戏来实现或省略: 将 `SEAD_VERSION` 设置为: - `SEAD_VERSION_BOTW` (1): The Legend of Zelda: Breath of the Wild - `SEAD_VERSION_SMO` (2): Super Mario Odyssey - `SEAD_VERSION_SPL3` (3): Splatoon 3 - `SEAD_VERSION_TOTK` (4): The Legend of Zelda: Tears of the Kingdom - `SEAD_VERSION_SMBW` (5): Super Mario Bros. Wonder - `SEAD_VERSION_CUSTOM` (0): 用于自定义功能集。所有功能宏必须设置为 1 或 0,详情请阅读 `seadVersion.h`。 如果需要,可以添加更多游戏的预设和功能。 ## 构建 构建此项目需要: - 一个部分支持 C++17 的编译器(如 >= Clang 3.9)。虽然 sead 的旧部分是用 C++03 编写的,但 sead 的新模块目标是 C++11(或更新版本),并且最近的 C++ 语言或库特性使编写 C++ 更加方便。并未利用 C++17 的所有特性,支持部分 C++1z 的编译器可能足以编译该项目。 - CMake 3.10+ ### 配置 sead 可以通过几个编译时定义进行配置: * `SEAD_DEBUG`: 启用断言和 HostIO 代码。 #### 平台 * `cafe`: Wii U * `NNSDK`: nnSdk (Switch 以及现代 nnSdk 支持的任何平台) 不支持其他平台(通用 Unix, iOS, Android, CTR)。 #### 匹配 Hack 本项目有时使用小的 hack 来强制编译器生成特定的代码。这些没有语义影响,但有助于匹配汇编代码,特别是当这些 hack 用于内联函数时。 * `MATCHING_HACK_NX_CLANG`: 使用 Clang 编译时的 Switch sead hack。 ### 非内联函数 在 **实现非内联函数** 时,请将汇编输出与原始函数进行比较,并使其与原始代码匹配。在这种规模下,这几乎是确保准确性和功能等效性的唯一可靠方法。 然而,鉴于函数数量庞大,当函数在其他方面等效时,某些类型的小差异可以忽略: * Regalloc 差异。 * 指令重排,当很明显该函数在语义上仍然等效时(例如,对完全不同的寄存器操作的两个 add/mov 指令被重新排序) 当忽略微小差异时,请添加 `// NOT_MATCHING: explanation` 注释并解释不匹配的内容。 ### 头文件工具或内联函数 对于 **仅头文件工具**(如容器类),使用试点/调试版本、断言消息和常识来尝试还原函数内联。例如,如果你看到许多函数中出现相同的断言且文件名是头文件,或者如果你在许多不同的地方看到相同的代码片段,很有可能你正在处理一个内联函数。在这种情况下,你应该将内联代码重构为其自己的函数。 另请注意,引入内联函数有时对于获得所需的代码生成是必要的。 如果一个函数是内联的,你应该尽最大努力使其完美匹配。对于内联函数,最好使用奇怪的代码或小的 hack 来强制匹配,否则差异会出现在每一个内联了非匹配代码的函数中,这会使其他函数的匹配变得极其复杂。如果使用了 hack,请将其包装在 `#ifdef MATCHING_HACK_{PLATFORM}` 中(有关定义列表,请参见上文)。
标签:Bash脚本, C++, ROM破解, sead, Switch, URL提取, 云安全监控, 云资产清单, 代码复现, 任天堂, 内存管理, 反编译, 图形渲染, 数据擦除, 文件系统, 标准库, 游戏安全, 游戏开发, 游戏模组制作, 调试符号, 逆向工程, 静态分析, 音频处理