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, 资产管理工具