SamboyCoding/Cpp2IL
GitHub: SamboyCoding/Cpp2IL
将Unity IL2CPP编译产物逆向还原为托管DLL的工具,帮助分析和理解受保护的Unity应用程序内部结构。
Stars: 2307 | Forks: 294
# Cpp2IL
[](https://www.nuget.org/packages/Samboy063.Cpp2IL.Core/)
[](https://coveralls.io/github/SamboyCoding/Cpp2IL?branch=development)
### 需要帮助?加入 [Discord](https://discord.gg/XdggT7XZXm)!
这是一个将 Unity 的 IL2CPP 构建过程逆向回原始托管 DLL 的开发中工具。
以下信息几乎完全适用于 GitHub releases 上提供的 CLI 应用程序。有关在你自己的项目中使用“core”模块(CLI 只是它的封装)的文档,请参阅 [README_CORE.md](Cpp2IL.Core/README_CORE.md)
该工具使用 [LibCpp2IL](LibCpp2IL) 进行元数据结构的初始解析和加载。如果你想做与 IL2CPP 元数据相关的事情,可以从构建产物中获取 LibCpp2IL,它是在 MIT 许可证下发布的。上面的链接将带你到 LibCpp2IL 的文档。
### 开发分支说明
Cpp2IL 目前正在进行大规模重写。该分支代表正在进行的工作,可能会发生变化。
开发者可以从 [我的 Nuget Feed](https://nuget.samboy.dev/) 获取 CI 构建。
命令行界面已被简化,从大量的命令行选项转变为输出格式和处理层的概念。但是,许多格式和层尚未实现,因此与之前发布的版本相比,功能有限。
#### 明显的变化:
许多选项,例如 `--analysis-level`、`--skip-analysis` 等,已被移除。暂且不提分析功能尚未实现的事实,这些选项也不会再回来了。
分析将默认关闭,并将通过使用处理层来启用。
同样,像 `--supress-attributes` 这样以前用来抑制 Cpp2ILInjected 属性的选项,已被替换为一个处理层 —— 这个实际上已经实现了,名为 `attributeinjector`。你可以使用 `--use-processor` 选项启用此层,并可以使用 `--list-processors` 列出其他选项。
元数据转储和方法转储也将成为它们自己的输出格式,而不是像以前那样默认开启并通过专用选项控制。目前这意味着如果你想要两种转储,你需要运行 Cpp2IL 多次,尽管如果我们将来添加同时输出到多种格式的支持,这种情况可能会改变。与处理层一样,输出格式可以通过 `--list-output-formats` 选项列出,并通过 `--output-as` 选项进行选择。
#### 不太明显的变化:
在底层,应用程序几乎已被完全重写。这主要是必要的,因为 Cpp2IL 对 Mono.Cecil 库的依赖程度很高,而该库有一些局限性。当我们考虑切换时,我们意识到了我们对这个库的依赖程度有多高。现在情况不再如此 —— 该应用程序是围绕 LibCpp2IL 类型和新 Analysis Context 对象编写的,并且不再使用 Mono.Cecil 库,取而代之的是 AsmResolver.DotNet。
最重要的是,我们目前正在基于称为 ISIL (Instruction-Set-Independent Language) 的中间表示重新实现分析,这将允许更容易地支持新的指令集。然后,ISIL 被转换为控制流图,这可以比原始反汇编更智能地进行分析。
我们还在开发一个插件系统,该系统将允许第三方开发者编写插件以支持自定义指令集、二进制格式,并最终加载混淆或加密的元数据或二进制文件。
## 命令行选项
### 基本用法
此应用程序最简单的用法是针对 Windows x86 或 x64 Unity 游戏。在这种情况下,你只需运行 `Cpp2IL-Win.exe --game-path=C:\Path\To\Your\Game`
Cpp2IL 将检测你的 Unity 版本,定位它需要的文件,并将输出转储到你运行命令的位置处的 cpp2il_out 文件夹中。
假设你有一个单独的 APK 文件(不是 APKM 或 XAPK),并且正在运行至少 cpp2il 2021.4.0 版本,你可以使用与上述相同的参数,但传入 APK 的路径,cpp2il 将从 APK 中提取它需要的文件。
### 支持的命令行选项列表
| 选项 | 参数示例 | 描述 |
|:---------------------:|:-----------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| --game-path | C:\Path\To\Game | 指定游戏文件夹的路径。必需。 |
| --exe-name | TestGame | 指定游戏的 exe 文件名,以防自动检测失败(因为游戏目录中还有其他 exe 文件) |
| --verbose | <None> | 记录更多关于我们正在做什么的信息 |
| --list-processors | <None> | 列出可用的处理层,然后退出。 |
| --use-processor | attributeinjector | 选择要使用的处理层,它可以在输出之前更改原始数据。此选项可以出现多次。 |
| --processor-config | key=value | 为选定的处理层提供配置选项。这些将由添加处理层的插件记录。 |
| --list-output-formats | <None> | 列出可用的输出格式,然后退出。 |
| --output-as | dummydll | 指定你希望使用的输出格式。 |
| --output-to | cpp2il_out | 输出的根目录。此路径将传递给选定的输出格式,然后该格式可能会在此位置内创建子目录等。 |
| --wasm-framework-file | C:\Path\To\webgl.framework.js | 仅与 WASM 二进制文件结合使用。其中一些具有混淆的导出,但可以通过 framework.js 文件恢复,你可以使用此参数提供该文件的路径。 |
## 发布结构
每一个提交都会使用 Github Actions 构建为 CI 构建 —— 如果你希望自己重现构建,可以在 .github 文件夹中找到 action 文件。请注意,这些可能不是最稳定的 —— 虽然有测试来确保与一系列游戏的兼容性,但有时确实会出问题!这些版本是根据构建它们的提交进行版本控制的。
如果你已登录 GitHub,可以从 Actions 选项卡下载发布文件,或者你可以使用以下链接,这些链接始终指向最新的成功 CI 构建。请注意,提供 .NET Framework 构建是为了与 wine/proton 兼容。
- [Windows 原生构建](https://nightly.link/SamboyCoding/Cpp2IL/workflows/dotnet-core/development/Cpp2IL-net9-win-x64.zip)
- [Linux 原生构建](https://nightly.link/SamboyCoding/Cpp2IL/workflows/dotnet-core/development/Cpp2IL-net9-linux-x64.zip)
- [Mac 原生构建](https://nightly.link/SamboyCoding/Cpp2IL/workflows/dotnet-core/development/Cpp2IL-net9-osx-x64.zip)
- [.NET Framework 4.7.2 Windows 构建](https://nightly.link/SamboyCoding/Cpp2IL/workflows/dotnet-core/development/Cpp2IL-Netframework472-Windows.zip)
除此之外,每当我认为完成了一组主要改进时,我会手动发布“里程碑”构建版本。这些在 github 上**未**标记为预发布,并且(至少在理论上)应该是稳定的,并且适合在多种游戏上使用。
## 终端颜色和调试日志
从第一个里程碑构建 2021.0 开始,Cpp2IL 现在向控制台输出结构更严谨的数据。这包括日志级别(VERB、INFO、WARN、FAIL)和相关颜色(VERB 为灰色,INFO 为蓝色,WARN 为黄色,FAIL 为红色)。
从里程碑 2021.1 开始,如果 Cpp2IL 能够检测到你在 Wine/Proton 中运行,这些 ANSI 颜色代码将被禁用,因为 wine 不支持它们,而且看起来很糟糕。
只有在启动 Cpp2IL 时带有 `--verbose` 选项,才会记录 VERB 消息,如果你能启用此标志报告问题,将非常有帮助。对于正常操作,除非你很好奇,否则不需要它们。
如果你不希望输出带有颜色,请设置环境变量 `NO_COLOR=true`。
我要感谢 Audica Modding 社区和 Discord 为这个项目提供的最初灵感、早期的鼎力支持以及如今的功能请求。
最后,看看其他与这个项目相关联的很酷的项目。当然,我在上面提到了 [Il2CppInterop](https://github.com/BepInEx/Il2CppInterop/),但也请看看 [MelonLoader](https://github.com/LavaGang/MelonLoader/),它使用 Cpp2IL 生成 Dummy DLL。
标签:DLL还原, HTTP 参数枚举, IL2CPP, LibCpp2IL, TLS抓取, Unity, Unity逆向, URL提取, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 元数据解析, 反编译, 多人体追踪, 工具, 开源, 游戏修改, 游戏安全, 调试插件, 软件安全, 逆向工程, 静态分析