Deaththegrim/aincrad-mod-loader

GitHub: Deaththegrim/aincrad-mod-loader

面向UE5游戏《Echoes of Aincrad》的跨平台mod加载器与管理器,统筹UE4SS注入、pak解包打包与部署流程,同时记录了对该游戏休眠联机系统的逆向工程研究。

Stars: 3 | Forks: 1

# aincrad-mod-loader (`aml`) 一个跨平台(Linux/Proton + Windows)的 mod 加载器/管理器,专为单机 Unreal Engine 5 游戏 **Echoes of Aincrad** 打造。它负责*统筹编排*成熟的 UE5 mod 体系,而不是重复造轮子: - **UE4SS** — Lua/C++ 脚本支持,蓝图 mod 加载(注入层)。 - **`~mods` pak 加载** — 在基础内容之后挂载的松散 `.pak` 包。 - **repak / retoc** — 解包/重新打包 `.pak` 和 IoStore(`.utoc`/`.ucas`)。 由于这是一款**没有反作弊**的单机游戏,无需进行任何对抗——这几乎是一个理想的 mod 修改目标(类似于 Elden-Ring 模式:没有官方支持,但极具可修改性)。EoA 内置了 **Denuvo Anti-Tamper** (DRM),这是针对 exe 的防盗版机制,**不会**阻止代理 DLL 注入或 pak mod。 关于 DRM 与反作弊的区别,以及各游戏实际使用的技术: [`research/drm-anticheat.md`](research/drm-anticheat.md)。 ## 架构 纯核心 + 窄边界分层设计(参见 `rust-workspace` 约定): | Crate | 角色 | I/O? | |-------|------|------| | `aml-core` | manifest schema,确定性加载顺序解析器,部署**规划器** | 无 — 纯粹,单元测试覆盖 | | `aml-host` | Steam/安装检测,UE4SS 注入策略,启动,计划**执行器** | 文件系统/进程 | | `aml-paks` | 通过 `repak`/`retoc` 读写 `.pak`/IoStore | 调用外部命令(在 `native-repak` feature 之后的原生 crate) | | `aml-cli` | `aml` 二进制文件 | — | `core` 决定做*什么*(由文件操作构成的 `DeployPlan`);`host` 负责执行。 这种拆分使得核心逻辑能够在零 I/O 的前提下进行测试,并自然支持 `--dry-run` 功能。 ## 研究与合作联机 — 寻求帮助 本仓库还记录了对 Echoes of Aincrad **休眠多人游戏系统**的深度逆向工程。TL;DR:这款游戏本质上是一个被打包成单机发布的完整在线合作游戏——包含复制的战斗/敌人/玩家系统(293 个 RPC)、完整的在线后端客户端(身份验证、大厅、匹配)以及 EOS。但是,**权威游戏服务器 (RODServer) 从未发布**,而且无法强制客户端进行托管(测试了所有途径——监听服务器、`OpenLevel`、`-server`、开发者调试会话钩子)。详见: - **[`research/coop-recruiting.md`](research/coop-recruiting.md)** — 从这里开始:导读 / 招募简介(包含什么内容、我们拥有什么、遇到的瓶颈、需要构建什么,以及具体的初步步骤)。 - **[`research/online-architecture.md`](research/online-architecture.md)** — 从解密的 SDK 映射出的完整在线技术栈:REST API + 大厅/聊天 WebSocket 协议(操作码 + 结构体)+ SCRAM/JWT 身份验证 + Redis 房间 + **Agones** 专用服务器编排 + EOS + 293 个 RPC 的游戏逻辑层 + 开发者调试钩子。 - **[`research/coop-feasibility.md`](research/coop-feasibility.md)** — 尝试过的所有合作联机方案以及它们失败的原因;具体遇到的瓶颈。 **悬而未决的问题:** 可玩的合作模式需要构建服务器(一个实现 ROD 游戏逻辑 + WorldServer 后端的 UE 专用服务器——此处的协议已完全解析)。如果你能构建它,客户端的那一半已经为你准备好了。**欢迎提交 PR / issue。** ## 内容修改(资产/数据 mod) 有了存储好的 pak AES 密钥(`aml key set `),操作流程如下: ``` aml unpack --out extracted # get originals # …编辑 asset/data(使用 UAssetGUI / FModel,或对于 .ini/data 使用纯文本)… aml pack ./mymod ./mymod.pak # ./mymod mirrors the game's Content path aml add ./mymod.pak && aml deploy --apply # lands in ~mods, overrides the base asset ``` Mod pak 文件是未加密的;游戏会将松散的 `~mods` pak 覆盖挂载到加密的基础内容上。从正在运行的游戏中提取 AES 密钥正是 `crates/aeskey` 所做的工作。 要寻找*需要修改的内容*——从游戏附带的 DataTables 和本地化文件中枚举游戏的武器/物品/怪物目录——请参阅 [`research/data-mining.md`](research/data-mining.md)(使用 `retoc to-legacy --filter` 提取 `DT_*` 表,然后使用 `tools/locres.py` 将 name-keys 解析为显示 名称)。完整示例:统计游戏中每一种镰刀的数量。 ## GUI / 启动器 桌面应用程序(`aml-gui`,基于 egui)为非技术用户封装了相同的核心功能: 游戏/UE4SS 状态,支持启用/禁用 + 重新排序的 mod 列表,以及一键 部署 / 清理 / 校验 / 启动 / 安装 UE4SS / 添加 mod(文件选择器)。 ``` cargo run -p aml-gui # or the prebuilt aml-gui(.exe) ``` ### 便携模式(免安装) aml 可以**安装**运行(状态保存在操作系统的配置/数据目录中),也可以**便携**运行(所有数据都在可执行文件旁的一个 `aml-data/` 文件夹中——不会向系统目录写入任何内容,因此你可以将其放在 U 盘或游戏文件夹中)。当 exe 旁边满足以下任何条件时,将自动开启便携模式: - 存在 `aml-data/` 文件夹(因此解压后的程序包在首次运行时即为便携版), - 存在 `aml-portable.txt` 标记文件,或者 - 设置了 `AML_PORTABLE` 环境变量。 `aml doctor` 和 GUI 标题栏都会显示当前的活动模式 + 状态数据的保存位置。 使用以下命令构建可直接发布的便携包(Linux + Windows): ``` scripts/package-portable.sh # -> dist/aml-portable-{linux,windows}-x86_64.zip ``` 每个 zip 压缩包都包含 CLI + GUI、`aml-portable.txt` 标记文件以及一个空的 `aml-data/`——解压到任意位置并运行 `aml-gui` 即可。 ## 命令 (CLI) ``` aml detect # locate the install, print layout + runtime (Proton/native) aml doctor # diagnose: install, injection, UE4SS + tool availability aml add [--id X] # import a .pak / .zip / mod folder into the library aml remove # remove a staged mod aml enable|disable # toggle a mod (persisted; deploy respects it) aml new-mod # scaffold a UE4SS Lua mod (scripts/main.lua + mod.json) aml priority # set load-order priority (lower = earlier); --clear to reset aml mods # list staged mods in resolved load order aml conflicts # report mods that would deploy to the same target aml ue4ss status # is UE4SS installed? aml ue4ss install # stage a UE4SS release into the game (--dry-run) aml deploy [--apply] # plan (default dry-run) / apply the mod set (idempotent + reconciling) aml purge [--apply] # remove ALL aml-deployed mods (staging kept) aml verify # check every deployed file still exists aml launch [--direct] # launch via Steam (default) or the exe directly aml key set # store the pak AES key (then unpack/extract "just works") aml unpack # extract .pak (repak) or IoStore .utoc (retoc); uses stored key aml pack # build an (unencrypted) mod pak from a folder → drop in ~mods ``` Mod 按照“每个 mod 一个文件夹”的方式暂存在 `/aml/mods//` 下,每个文件夹都包含一个 `mod.json` manifest + payload(`.pak`,或 UE4SS Lua/C++ 文件夹)。 ### `mod.json` ``` { "id": "author.better-swords", "name": "Better Swords", "version": "1.0.0", "kind": "pak", "priority": 100, "requires": [] } ``` `kind`:`pak` | `lua` | `cpp`。`priority` 数值越低加载越早;`requires` 用于强制排序。Pak mod 会被复制到 `~mods` 中,并添加零填充的顺序前缀,以便 UE 按照解析出的顺序挂载它们。 ## 跨平台注入 - **Windows:** 放置在 `Binaries/Win64` 下的 UE4SS 代理 `dwmapi.dll` 会自动加载。 - **Proton/Linux:** 内置的 `dwmapi` 会通过 `WINEDLLOVERRIDES="dwmapi=n,b"` 进行覆盖,该参数可通过 Steam 启动选项应用(或通过 `aml launch`)。`aml doctor` 会打印出确切的启动选项字符串。 ## 构建 ``` cargo test # 45 tests, all green cargo run -p aml-cli -- doctor # Windows binary(用于 Nexus / 原生 Windows 使用),从 Linux 交叉编译: # apt install gcc-mingw-w64-x86-64 cargo build --release -p aml-cli --target x86_64-pc-windows-gnu ``` 查看 [`docs/COMPARISON.md`](docs/COMPARISON.md) 了解 aml 与 Vortex / MO2 / JORMM 的对比情况,以及发布适配 Nexus 的版本(GUI + Windows 构建)的路线图。 ## 法律 / 范围 针对你拥有的游戏进行单人、个人的 mod 修改。不触及任何在线/多人游戏层面;不绕过任何存档完整性或反作弊机制(本来就不存在)。请勿提交游戏资产、解包的 pak 文件或任何恢复的 AES 密钥——`.gitignore` 已将其屏蔽。
标签:rizin, Rust, 云资产清单, 可视化界面, 搜索引擎查询, 游戏Mod, 网络流量审计, 虚幻引擎, 逆向工程, 通知系统