CatAnnaDev/hysteria

GitHub: CatAnnaDev/hysteria

为《Alice: Madness Returns》打造的从零开始的完整 modding 技术栈,包含运行时反射框架、多语言 mod 开发 API 和跨平台资产编辑工具。

Stars: 0 | Forks: 0

# Hysteria 一个为 **Alice: Madness Returns** (Unreal Engine 3, D3D9) 从零开始打造的 modding 技术栈。 零硬编码地址,零重型依赖——一切均在运行时动态发现。 它原生运行于 Windows,并可通过 CrossOver/Wine 运行于 macOS。 包含三个部分: - **`hysteria/`** — 框架:一个 `dinput8.dll` 代理,挂接到运行中的游戏,暴露其完整的 UnrealScript 对象模型,并加载 mod。 - **`mods/`** — mod 是基于该框架 API 构建的微型 DLL(支持 C、C++ 或 Rust)。 - **`studio/`** — Hysteria Studio:一个跨平台桌面应用(Rust + egui),用于打开、检查、编辑、预览和导出游戏的 `.upk` 资产(纹理、声音、属性)。 ## 功能 - 通过名称并遍历类层级结构,读取和写入**任何**活动对象上的**任何**属性。 - 拦截、修改、阻止或覆盖游戏中约 8000 个**任意**函数的返回值。 - 调用任何函数,生成/销毁 actor,运行控制台命令,绘制游戏内覆盖层。 - 完善的**键盘 + 鼠标修复**(Alice 最初是为手柄设计的——见下文)。 - 一个独立的资产工具,可加载所有约 1700 个已打包的 package 并允许你对其进行编辑。 完整的游戏接口面——1861 个类、约 13900 个属性、8272 个函数——已被映射到 `hysteria_reference.txt`(自动生成)中。没有什么遥不可及。 ## 鼠标修复 Alice: Madness Returns 是手柄优先的游戏;其键盘+鼠标瞄准带有加速、平滑处理以及会吞噬微小移动的死区。`input` mod 以**最纯粹的方式**修复了这个问题——它保留了游戏原生的相机系统,仅中和了那些糟糕的部分:它将相机输入加速计时器(`aTurnElapsedTime` / `aLookUpElapsedTime`)强制保持平齐,并禁用了 `bEnableMouseSmoothing`。 没有输入绕过,没有相机冲突,菜单依然正常工作。 ## 目录结构 ``` hysteria/ the framework (compiles to the injected dinput8.dll) proxy.c dll proxy + D3D9 EndScene/Reset hooks + raw-input plumbing + logmsg mem.c GNames/GObjects discovery, name/class/property reflection props.c runtime offset calibration (UProperty tables) mod_hook.c ProcessEvent finder + inline detour + dispatch + per-frame ticks mod_api.c the HysteriaAPI implementation + mod loader hysteria_api.h the PUBLIC header mods compile against hysteria.hpp C++ wrapper (lambdas, std::string, HYSTERIA_MOD macro) hysteria_sdk.h GENERATED typed offset accessors (tools/gen_sdk.py) — not committed console.c in-game log console; ui.c Nuklear overlay camera.c render.c entities.c dump.c built-in overlay tools (freecam/ESP/actors/dump) frame.c per-frame orchestrator; build.sh cross-compile + deploy mods/ trainer/ god / fly / noclip / freeze / teleport / savestates / world / heal alice/ Alice abilities, hysteria, shrink-sense input/ the keyboard+mouse fix examples/ reference mods in C, C++ and Rust (+ older demos) build.sh builds every top-level mod -> Win32/Mods/.dll studio/ Hysteria Studio (Rust + egui) — the asset tool tools/ gen_sdk.py, gen_reference.py, gen_ccmds.py, upk.py, lzo1x.py ``` ## 构建与运行 ``` hysteria/build.sh # build the framework, auto-deploy dinput8.dll to the game folder mods/build.sh # build the mods, deploy to Win32/Mods/ bash play.command # launch windowed (RES=1920x1080 bash play.command to resize) ``` 工具链:`i686-w64-mingw32-gcc/g++` (Homebrew `mingw-w64`);Rust mod 需要 nightly + `rustup target add i686-pc-windows-gnu` + `rustup component add rust-src`。在 macOS 上,游戏通过 `cxstart` 从 CrossOver bottle 中运行。 游戏中:`` ` `` 切换覆盖层。ProcessEvent hook 会自动安装;mod 从 `Mods/` 加载(在 Modding 标签页中点击 "Reload mods" 即可热重载)。 ## 编写 mod **C** — `mods//.c`: ``` #include #include "hysteria_api.h" static HysteriaAPI *A; static void on_damage(AEvent *e){ if(e->self == A->player_pawn()) e->block = 1; } // godmode __declspec(dllexport) void ModMain(HysteriaAPI *api){ A = api; api->log("my mod loaded"); api->on("TakeDamage", on_damage); api->set_bool(A->player_pawn(), "bCanFly", 1); } ``` **C++** (`hysteria.hpp` — lambdas + std::string): ``` #include "hysteria.hpp" using namespace hysteria; HYSTERIA_MOD() { log("my mod loaded"); on("TakeDamage", [](Event &e){ if (e.self() == player_pawn()) e.block(); }); on_tick([]{ if (key_pressed(VK_F11)) console("God"); }); } ``` **Rust** (closures, no unsafe in your mod): ``` mod hysteria_api; mod hysteria; use hysteria::*; #[no_mangle] pub extern "C" fn ModMain(api: *const hysteria_api::HysteriaAPI) { hysteria::init(api); on("TakeDamage", |e| if e.this() == player_pawn() { e.block(); }); on_tick(|| if key_pressed(0x7A) { console("God"); }); } ``` 完整指南请参阅 **MODDING.md**。API (`hysteria_api.h`,版本 7) 涵盖:反射、类型化属性获取/设置(int/float/bool/byte/vector/rotator)、带参数和返回值编辑的 event hook、通用的类型化调用构建器(`call_begin → call_arg_* → call_invoke → call_out_*`)、生成/销毁/控制台、逐帧的 `on_tick` + `key_down`/`key_pressed`、覆盖层面板(`ui_panel` + widgets)、`world_info()`、原始内存访问以及原始鼠标数据。 ## Hysteria Studio 一个独立的跨平台(Windows/macOS/Linux)资产工具——无需游戏本体。 ``` cd studio && cargo run --release ``` 它内置了完全从零开始编写的 LZO1X 解压缩器、UE3 package 解析器和 DXT (BC1/BC3) 编解码器。它可以加载每一个已打包的 `.upk`,浏览对象,就地编辑 int/float/bool/byte 属性,预览并将纹理导出为 PNG(从 `.tfc` 读取流式 mip),从 PNG 替换纹理,导出并替换声音(OGG/WAV),最后将可被游戏加载的 package 写回磁盘。 ## 备注 - 一切均在运行时动态发现——GNames/GObjects,属性/位掩码/父类偏移量,ProcessEvent vtable 索引。没有硬编码任何特定于构建版本的地址。 - `tools/gen_sdk.py` 将游戏内的 F2 dump 转换为类型化偏移访问器;`gen_reference.py` 将其转换为可浏览的 `hysteria_reference.txt` API 映射图。
标签:C++, Gophish, Rust, 动态链接库代理, 可视化界面, 客户端加密, 数据擦除, 游戏Mod开发, 游戏逆向工程, 网络流量审计, 虚幻引擎3, 资产管理工具