天空 Blond - Cheat Engine
type: channel
link: https://skyblond.info/tag/Cheat-Engine/
items: 【歪门邪道】怪物猎人崛起素材无中生有 & Cheat Engine初探

【歪门邪道】怪物猎人崛起素材无中生有 & Cheat Engine初探
type: item
date: 2022-01-19T14:09:00+08:00
description: 以前经常使用Cheat Engine的数值修改功能来修改单机游戏的金钱、素材数量。但对于怪猎这种需要重复刷素材的，这种方法只能修改已有的素材，对于尚未获得素材还是无能为力。并且这一作与上一作的世界/冰原不同，道具箱的内存地址不再连续，并且数据结构也变复杂了，每个物品占用96字节，但我只知道前8字节的意义，因此使用代码生成道具箱变得不太可能（我在世界/冰原中就是这样操作的）。经过一番搜索，终于能够使用Auto Assembler和Lua脚本进行自动化加物品了。本文记述其过程。关于Cheat Engine的介绍这里就不多赘述了，它是一个非常好用的内存修改器和注入器。在怪物猎人世界/冰原中，一开始通过搜索道具箱中素材的数量，发现这个数量的地址是有规律的。经过一番简单的搜索，配合GitHub上大神反解出来的物品数据结构，我可以轻易的生成我想要的道具箱，然后将其输出成16进制的内存地址，再使用CE覆盖进游戏内存，这样便实现了任意素材的无中生有。但是到了崛起，我发现道具箱的内存分布是不连续的，除非挂调试器找指针，否则很难迅速的定位内存地址。而卡普空虽然反作弊不行，可反调试器还挺在行，只要一挂载调试器，游戏就崩溃。所以通过内存无中生有大概就很困难了，只能曲线救国。无中生有经过一翻搜索，我搜到了simpson1029制作的Cheat Table，这个Cheat Table利用CE实现了任意物品的无中生有，但这个东西本身需要你加入某个Discord服务器，我对于这种捆绑销售一向很反感，遂抄起Notepad++看源码。最终找到了能够追加单一物品的核心代码（Auto Assembler）：// Origin: https://fearlessrevolution.com/viewtopic.php?t=18814 alloc(itemgib,256,MonsterHunterRise.exe) registersymbol(itemgib) registersymbol(quantity) registersymbol(itemid) label(s1) itemgib: sub rsp,28 mov rcx,[MonsterHunterRise.exe+C092DC0] mov rdx,FFFFFFFF call MonsterHunterRise.exe+2B7B8A0 mov rbx,rax //vtable mov rcx,rax mov rax,[MonsterHunterRise.exe+C097B80] mov rsi,[rax+78] //base item mov rdx,rsi mov eax,[itemid] lea rbp,[rax+4100000] cmp eax,4100000 cmovae ebp,eax mov r8,rbp //ID call MonsterHunterRise.exe+19BF690 test rax,rax jne s1 mov rcx,rbx mov rdx,rsi mov r8d,ebp call MonsterHunterRise.exe+19BF290 s1: //mov rcx,rbx, rcx not used in 7F0 mov rdx,rax mov r8d,ebp //ID mov r9d,[quantity]//quantity call MonsterHunterRise.exe+29577F0 add rsp,28 ret quantity: dd 3 itemid: dd 6 这里定义了两个4字节变量：quantity和itemid，分别代表待增加的物品数量与ID。其中这部分代码：mov eax,[itemid] lea rbp,[rax+4100000] cmp eax,4100000 cmovae ebp,eax mov r8,rbp //ID使得itemid既可以是Raw ID，也可以是Sub-Category Mask ID。例如恢复药的Raw ID是0x04100006，而其Sub-Category Mask ID是6。这里的Sub-Category一共有四个，分别是：0x04000000 I_Unclassified0x04100000 I_Normal0x04200000 I_EnviromentCreature0x04300000 I_Max目前游戏中可以放进道具箱的物品都位于I_Normal中，也就是0x04100000起的部分。至于这段脚本的原理，似乎是通过反编译看游戏中负责添加物品的代码，然后直接调用那部分代码来帮我们添加我们想要的物品，而不必考虑如何模仿游戏的内存。使用时仅需要使用Auto Assembler将这段代码注入到游戏进程中，然后创建…