teozocchi/mh-stories-re
GitHub: teozocchi/mh-stories-re
通过对 2024 年 PC 版《怪物猎人物语》进行逆向工程,解码 Capcom MT Framework 私有二进制格式并修改骨骼缩放参数,实现了系列首个随行兽体型还原模组。
Stars: 0 | Forks: 0
# 怪物猎人物语 — 随行兽体型模组(逆向工程)
对 2024 年 PC 移植版《怪物猎人物语》进行逆向工程,以实现社区八年来
认为不可能做到的事情:让你孵化出的随行兽以其完整的、未缩小的
原始尺寸进行渲染——无论是在大世界**还是**战斗中。
其成果是系列中已知的首个可用的体型修改方案。此仓库包含**工具集和完整的技术文档**;
它有意不提供**任何游戏资产**(参见[法律声明](#legal))。一切都可以从你
自己的游戏副本中重现。
## 问题所在
孵化出的随行兽在渲染时,与同种野生怪物相比,呈现出缩小的“Q版”比例。
社区八年来的共识认为这是游戏底层固有且不可改变的——一个“被废弃的成长机制”。
事实并非如此。它是数据。
## 成果
- 将六种同伴种族缩放至 1.5 倍(恐暴龙、海龙、象牙海龙、
冰麒麟、千刃龙,以及剧情同伴 Ratha),实时应用且无需
重启,在战斗和跨会话中均保持有效。
- 一个 GUI 修改器,允许任何人选择任何种族并设置特定种族的
乘数,并由重构的“种族 → 资源 ID”映射表提供支持。
## 难点所在(可迁移的经验)
这个项目实际上是一个在不确定性下进行**二进制逆向工程**的案例研究。
真正推动项目进展的技术包括:
- **静态分析 (Ghidra):** 从 RTTI/反射元数据中恢复字段名;通过搜索*指令模式*
(DIVSS → MULSS×3) 而不是某个具体数值来定位成长比率写入器。
- **动态调试 (x64dbg):** 条件断点和硬件断点,通过缓冲区寄存器读取
函数的字符串输出,以及通过 TLS 回调进行启动时进程
埋伏,以捕获仅限加载时发生的事件。
- **穷举证伪:** 对整个进程进行签名扫描
(在数 GB 的地址空间上使用 `VirtualQueryEx`)来*证明某个假设是死胡同*,
而不是假设它成立——这是本项目中最具决定性的工具。
- **格式逆向工程(皇冠上的明珠):** 从头开始解码两种未公开的
Capcom MT Framework 二进制格式 ——
- **ARCC** 归档文件:Blowfish-ECB(带有一个前/后 4 字节字节序交换的
特性)+ 每条目 zlib + 哈希扩展名 → [`tools/arcc.py`](tools/arcc.py)
- **XFS** 参数表:一种反射式、类定义的序列化格式,
对其进行解码最终生成了正确的种族映射 →
[`tools/xfs.py`](tools/xfs.py)
- **数据考古学击败了整个运行时战役:** 答案竟然存在于一个 2.6 MB 的
参数表 (`table.arc`) 中,而它一直以来都摆在明面上。
解码出的一张电子表格胜过了数周的内存搜寻。
## 仓库结构
```
tools/
arcc.py ARCC/ARC archive codec (list / find / extract)
xfs.py MT Framework XFS parameter-table parser
lmt.py LMT bone-scale parser + patcher (rank / scale)
census.py sweep every archive -> monster resource-ID map
species_data.py reconstructed species database
scale_trainer_gui.py tkinter trainer: pick a team, set multipliers, apply
data/
species_map.md derived species -> scale-folder / battleScale table
THE_JOURNEY.md full technical post-mortem (~12 sessions)
```
## 快速开始
```
pip install pycryptodome # for the ARCC codec
# 检查 archive 里面的内容
python tools/arcc.py list "/nativeDX11x64/archive/table.arc" buddyPath
# 按物种被缩小的程度对其进行排序
python tools/lmt.py rank "/nativeDX11x64/mod/scale/mo"
# 将某个物种的 model 缩放至 x1.5(编辑会被游戏实时捕获)
python tools/lmt.py scale "/.../mod/scale/mo/mo346/mo346_body.lmt" 1.5
# 或者直接运行 GUI(首次使用时会对你的 vanilla 文件进行快照)
python tools/scale_trainer_gui.py
```
## 一段落简述模组工作原理
每个随行兽种族都有一个松散的 `mod\scale\mo\mo###\mo###_body.lmt` 文件,其中包含
一个静态的**单骨骼缩放**通道(这就是 Q版比例的来源)。
将该通道的数值统一放大即可在所有位置放大渲染出的模型,
并且正在运行的游戏会热重载该文件。唯一真正困难的部分是
识别*哪个* `mo###` 文件对应*哪个*屏幕上的种族——
这些 ID 不是怪物图鉴中的编号,亚种有它们自己的 ID,而且
存在多个重叠的 ID 命名空间。该映射表是通过解码
`table.arc` 恢复出来的(参见 [`data/species_map.md`](data/species_map.md))。
## 法律声明
本仓库仅包含原创工具和文档。它不提供**任何
游戏文件、资产或提取的数据**——这些工具作用于你自己合法
获取的游戏副本。《怪物猎人物语》版权归 © Capcom 所有;这是一个
无隶属关系的非商业研究与模组项目。风险自负;
请备份你的文件。
## 许可协议
代码和文档在 [MIT 许可证](LICENSE) 下发布。
标签:C++, 二进制分析, 云安全运维, 云资产清单, 内存修改, 数据擦除, 游戏Mod, 自定义密码套件, 逆向工具, 逆向工程