> For AI agents: the complete documentation index is available at https://renmori.mewbaka.cn/llms.txt, the full documentation bundle is available at https://renmori.mewbaka.cn/llms-full.txt.

# M4：多态、启动器、平台与 Steam

M4 涵盖逐构建分化、跨平台启动与 Steam 支持。按照本项目自身的开放核心拆分，**多态引擎与原生启动器属于闭源组件**，而 Steam、Proton、Windows 与 Linux 需要相应的硬件环境才能实际验证。本页准确说明开源基线在此交付并验证了哪些内容，以及哪些内容属于闭源组件或尚待硬件验证。

## 逐构建分化（基线，已可用）

“破解一款游戏的成果无法迁移到下一款”这一特性从基线层面即已开始：每一次 `protect` 运行都会产出一个在密码学上相互独立的构建。

- 一个随机的 16 字节 `container_id` 作为全部密钥派生（HKDF）的盐，此外还有随机的逐文件 ID 与密钥，以及逐分块的 nonce
- 因此，同一款游戏保护两次，会得到不同的 `container_id`、不同的逐文件密钥与不同的容器，一个构建的密钥无法读取另一个构建；这一点已由 `tests/test_cli.py::test_two_builds_are_cryptographically_independent` 证明
- 脚本密钥独立于容器密钥，见 [脚本层与引擎锁定](https://renmori.mewbaka.cn/technical/script-layer.md)

基线**不会**随机化的部分：容器的字节布局与字段顺序，以及脚本 AST 的类名均保持标准形式（仅重新加密）。

### 闭源升级：多态引擎

闭源二进制插件会逐构建随机&#x5316;_&#x7ED3;构_，即容器布局与已编译脚本的编码方式，使攻击者即使握有密钥，也无法编写通用的读取器或反编译器。它通过稳定且有文档的进程接口接入 `renmori protect`（见 [架构](https://renmori.mewbaka.cn/technical/architecture.md) 与 [插件接口](https://renmori.mewbaka.cn/technical/plugin-interface.md)）；开源 CLI 是集成点，在没有插件时运行基线格式。其机制与实现属于专有内容，位于私有仓库 `MewBaka/RenMori-core`。

## 启动器与平台

基线通过 Ren'Py 的**扩展机制**（`game/renmori.rpe`）加载，在正常启动过程中运行于 Ren'Py 自带的 Python 之内。该机制与平台无关：同一个 `.rpe` 可在 Windows、macOS、Linux 与 Steam Deck 上工作，因为它只依赖 Ren'Py 的 Python 与 `ctypes`，而不依赖任何特定操作系统的启动器二进制。

各平台的 AES-GCM 后端（统一接口位于 `container/crypto.py`）：

| 平台                  | 后端                                   | 状态                                                     |
| ------------------- | ------------------------------------ | ------------------------------------------------------ |
| macOS（arm64/x86_64） | `librenpython.dylib` 导出的 OpenSSL EVP | **已在此验证**（往返测试与引擎内测试，基于 Ren'Py 8.5.2）                  |
| Linux / Steam Deck  | `librenpython.so` 导出的 OpenSSL EVP    | 已通过 `nm` 确认 EVP 符号导出；与 macOS 使用同一代码路径；完整运行待 Linux 硬件验证 |
| Windows             | 操作系统 CNG（`bcrypt.dll`），硬件 AES        | 代码已完成；运行待 Windows 环境验证                                 |

该库在 Python 可执行文件所在目录中查找（`runtime_lib_candidates`，有单元测试覆盖），从不通过 `CDLL(None)` 加载。

### 原生启动器（闭源，后续交付）

分平台的原生启动器从容器引导内嵌的 Python，并执行**运行时密钥派生**（使 `autorun.py` 中不再留有密钥）；它属于闭源加固措施，不是开源交付物。在 macOS 上，它会在构建时自动完成 ad-hoc 签名（免费，Apple Silicon 上必需），并保留以 Developer ID 重新签名的能力。**基线不分发任何新的可执行文件**，因此与原始的 Ren'Py 构建相比，不会增加任何签名负担。

## Steam

- **Steam 叠加层（Overlay）在结构上即可安全使用**：Steam 叠加层会向游戏进程注入一个 DLL，而 RenMori 只挂钩 Ren'Py &#x7684;_&#x6587;件加载_，从不进行进程或 DLL 注入，也不在热路径上执行反篡改，因此不会阻断叠加层
- **在 `renpy.loader` 之外读取的文件保留在磁盘上**：Steam SDK 直接读取 `steam_appid.txt`（不经过加载器），因此该文件默认保持不加密（`DEFAULT_KEEP_ON_DISK`）；其他此类文件可通过 `renmori.toml` 中的 `keep_on_disk` 添加；这一点已由 `tests/test_cli.py::test_steam_appid_kept_on_disk` 证明
- **成就与云存档**经由 Ren'Py 的 Python API 实现，未被改动；`.rmc` 是静态文件，因此 Steam 的文件校验与更新均正常工作
- **不要与 Steam DRM 双重包装**：Steam DRM 会改写可执行文件，可能与原生启动器的自校验冲突，且其本身防护较弱

完整的 Steam、Proton 与 Steam Deck 实机运行尚待相应硬件；上述特性均基于结构分析（钩子与文件放置方式），并未在此进行实机测试。

面向开发者的发布流程（构建、保护、SteamPipe 上传，各文件对应的 depot，以及启动选项）见 [Steam 发行指南](https://renmori.mewbaka.cn/integration/steam-release.md)。

## M4 的其他内容

- `renpy.exists()`（原本仅检查磁盘）现在也会查询容器，因此使用它探测文件的游戏能够看到已封入容器的文件（`_install_exists_fallback`）

## 当前状态

开源基线（已在 macOS / Ren'Py 8.5.2 上验证）：逐构建分化、跨平台的 `.rpe` 加载路径、Steam 文件放置与结构上的叠加层安全性，以及 `renpy.exists` 回退。闭源或待硬件验证：多态引擎、执行密钥派生的原生启动器，以及 Windows、Linux 与 Steam 上的实机运行。
