时间:2022-11-19 07:31
爱夏的炼金工房目前已经推出DX加强版,游戏中如何更改时间?下面给大家分享一个爱夏的炼金工房DX CE修改教程
Part.1 你需要准备工具
(大名鼎鼎的CheatEngine,下文简称CE),官网在这里
注意,如果你不是在patreon上赞助过作者的话,直接下载的安装包会捆绑2个软件,安装的时候注意跳过安装推广软件。或者自行寻找其他安装包。
Part.2 定位时间地址
先吐槽一句,Gust的程序员脑洞十分之大。目前测试的A14。
A14工坊世界的的日历算法类似日本公司的财年。每年4月1日到本年3月30日为一年(是的,工坊世界先过4月,然后到12月,再到1月2月3月,3月30日后是第二年,非常反直觉),一年12个月,每个月固定30天。
但是年份在内存中的记录方式却是按照自然年开始记录的,并且包含了最开始并不能游玩的1月1日也就是第零年1月1日,它在内存中被记录第0天,第一年4月1日则是第90天。
虽然作为玩家,你根本不能游玩第0天到第89天的内容。
第一步:
在开启游戏的情况下打开CE,在CE中选择你的游戏进程
第二步:
根据我在吐槽中给出的信息,计算出当前日期在内存中实际储存的值。在CE中搜索该值,会有多个结果。
第三步:
睡一觉,改变日期值,再次搜索。实际上老手这时候已经能看出应该用哪个地址了。
第四步:
再一次筛选出3个地址,对于新手来说,最简便的办法就是试错法。在地址上双击,逐个更改这3个地址,看哪个地址能顺利变更游戏里的日期就行。
当然风险就是如果游戏内置检测(比如DOMO做的轩辕剑就会内置检测,你改错内存被抓到就会被DOOM工作室拒之门外)会被抓小辫子,就算不内置检测,改了错误的地址也可能会导致游戏意外跳出,所以务必存好档再改。
如果你不想手工试错,请接着往下看进阶处理办法:
右击地址,把筛选出的3个地址,全部附加监视器,看是什么改写了这个地址。
第五步:
可以看到可以看到036A3308这个地址,哪怕在游戏中不操作的情况下,依旧被改写到起飞。那么这多半不是存储日期信息的实际地址,而是一个用于显示日期信息的地址或者是暂存的地址。排除。
第六步:
保持监视开启,再睡一天。
睡完之后,左侧的监视器开始检测到内存被修改的情况,先看左下方的036A3310,因为036A3308已经被猜测为不可靠,所以附近的036A3310有没有可能就是真实地址呢?但是睡了一天就让036A3310被修改了3次,也有点悬。一般来说睡觉这种简单的日期+1动作,应该只变动1次。
双击036A3310的监视信息,查看详情。这里需要一点点汇编基础,没有基础也没事,直接百度/谷歌就行。我也不是学程序的,全靠搜索。
可以看到是2个mov指令,来,百度关键词:汇编 mov指令,[https://baike.baidu.com/item/MOV/56228441] 在这查到MOV指令的例子:[MOV EAX,#050aH ;将十六进制数050a 传送到通用寄存器eax中]
那红框部分的意思就是:
1402B56F8 - mov eax,[rdi+48]//把[rdi+48]地址里的数传递到eax寄存器。
1402B56FB - mov [rdi+50],eax//把eax寄存器里的数传递到[rdi+50],这就是我们检测到036A3310内存改动的地方。
那rdi是多少呢,看下面的表,RDI=036A32C0。所以[rdi+48]=36A 3308,[rdi+50]=36A 3310
那完犊子了,刚刚分析了36A3308很可能是个临时寄存,这下好了36A3310是从这个临时寄存传递来,所以36A3310这个地址,很可能也不是存放日期信息的原始地址。
排除036A3308和036A3310之后,那就只剩141B5CA00一棵独苗了。如果是单纯的想要调整日期,修改141B5CA00这个地址就可以了,但是都到这一步了,不继续往下学学吗?− 要在此止步炼金术的研修吗? ...
右击需要修改的地址,选择修改数值
输入92,即为调整到第一年4月2日
调整完成
第七步:
现在看141B5CA00的两条写入。可以看到这两条命令的位置非常接近,一个操作是1403610C0,一个操作是1403610CC,非常接近。双击这两条修改记录,看修改的详细信息。其实详细信息里基本就能看到,1403610C0往下走几条就是1403610CC了。
先看第一条[1403610C0 - add [rcx],edx],右击他,选择在在反汇编程序中显示地址。开启反汇编。画橙色框框的地方就是从1403610C0到1403610CC
来看看这堆指令大概的意思(我也是猜的,谁让我是个财务,并不懂计算机。)
Atelier_Ayesha.exe+3610C0 - 01 11 - add [rcx],edx 在[rcx]地址的数据上加上edx
Atelier_Ayesha.exe+3610C2 - BA 00000000 - mov edx,00000000 将edx改为0
Atelier_Ayesha.exe+3610C7 - 8B 01 - mov eax,[rcx] 在[rcx]地址的数据写入eax寄存器
Atelier_Ayesha.exe+3610C9 - 0F48 C2 - cmovs eax,edx 看不懂……
Atelier_Ayesha.exe+3610CC - 89 01 - mov [rcx],eax 在eax寄存器写入[rcx]地址
这里的[rcx]可以参考右边监视器中的数据,在指令执行的时候,这个[rcx]实际上就是我们正在监视的内存地址141B5CA00。
那么到这就可以猜测了,add命令很明显是游戏变动日期的操作,edx寄存器中很可能是选择的睡觉天数,如果睡1天,edx就是1,睡2天edx就是2。
那么,只要我们劫持[Atelier_Ayesha.exe+3610C0 - 01 11 - add [rcx],edx ]这条指令,把他替换成nop,就可以让日期永远不前进。
替换后的指令明细可以在这里查询
-----------------------完结的分割线-------------------------------
有的新同学可能要问了,哎我既然能找到地址,为什么要费尽去劫持替换程序的汇编码呢?
因为在大多数的游戏里,内存地址是动态分配的,每一次运行游戏,存储日期的内存地址都不一样。如果你只保存内存地址信息,下一次再想修改日期时,需要重新定位内存地址。
而汇编码是游戏程序的底层,只要游戏主程序不更新,汇编修改永远有效,你大可以把修改后的汇编导出,留待下一次需要的时候使用。
甚至你可以把汇编修改导出为脚本,做出一个小程序,CE本身就内置了一个导出脚本程序的功能。没错,你也可以当枫灵月影,做自己的修改器。