目录

最后战役X(单机手游)飞天日记:改指令实现修复飞天(不含判断)

目录

最后战役X(单机手游)飞天日记:改指令实现修复飞天(不含判断)

赶码人

单机手游《最后战役X》(64位)飞天BUG修复日记

本系列文章正在连载:

最后战役X(单机手游)连跳飞天思路点击进入查看全文>文章 赶码人 174 14 5

最后战役X,获取“飞天”选择框选中状态点击进入查看全文文章 赶码人 50 5 1

(失败记录)单机手游《最后战役X》修复飞天BUG:尝试改汇编指令点击进入查看全文>文章 赶码人 39 5 1

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/02db465212d3c374a43c60fa2625cc1caeaab796-20220206102127355.png

上篇改指令实现修复飞天,没成功,今天有了一点新进展。

第一篇文章得到当前速度基址偏移:[[[libil2cpp.so + A8BDC8]+b8]]+58+14

如果在地面上,直接改这个值是不生效的,只有腾空之后,改这个值才能生效。当时我没注意到这个特点,可能因为当时用frida搞的太顺利了,一心想着按下跳跃才修改,所以没遇到这个问题。这里有一种可能性,人物在地面时,给这个地址写入值,没有生效的另一种可能性是有一个执行频率很高的函数,检测到人物在地面时,就给这个值写入其他值。(具体位置接下来会说)。

还有就是这个+b8之后得到的是啥对象,我也给忽略了,没想到这里。实际上[[[libil2cpp.so + A8BDC8]+b8]]是FirstPersonController,直接在dump.cs就能看到各个偏移实际的意义。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/3c0712132000afc3fb86cfa9c4abb11bf375c430.png@618w_150h_progressive.png

m_Jump,就是上一篇文章那个0x58,这个值锁定成1,那么人物就一直在跳。跳跃完成之后,这个值写入0。具体逻辑肯定在FirstPersonController的某个方法当中;0x6c就是m_MoveDir的y。

接下来就看FirstPersonController的各种update方法(函数)。找到跳跃的逻辑。

来到FixedUpdate,行数不多,去掉变量声明只有150行。可以很轻易的找到一个关于是否在地面的if:

https://i0.hdslb.com/bfs/article/121bdb1f4ee694217f7d97309410eb527faad48d.png@839w_149h_progressive.png

先是判断是否在地面,然后判断是否按过跳跃键

如果在地面上,那么开始执行185行,第186行这里给6C设置了一个值,是偏移2C的负数。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/9a869a2952fa79563317fd4d634b5f0b40eff82f.png@740w_51h_progressive.png

m_StickToGroundForce,看起来是“贴向地面的力”?不知道这一行有啥用,但可以肯定的是,在地面时这一行会频繁的向0x6c写入一个固定值,导致咱在地面上设置y方向速度时并不能生效(或者说咱设置的速度,在控制人物位置的相关指令读取到之前,就被改了)。那就给它nop掉把,这里直接给出偏移和写入的数值:libil2cpp.so+52B394写入1F 20 03 D5,经过尝试,毫无负面影响。

这时再向[[[libil2cpp.so + A8BDC8]+b8]]+58+14写入值,无论是否在地面,都会生效。

相较于上篇文章,这次换个地方改三条指令,就能实现和这个视频相同的效果了。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/658baa274a79f3dc4bdaaabfcdbe0baf5ff1c09c.png@942w_287h_progressive.png

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/69b3d9b342cb7899419aa067f4bbbd0581a93f43-20220206102127691.png

接下来就是找个合适的地方,看看哪里适合插入判断是否勾选飞天的指令

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/02db465212d3c374a43c60fa2625cc1caeaab796-20220206102127355.png

libil2cpp.so+52B394 写入 1F 20 03 D5

libil2cpp.so+71ffb4 写入 08 24 A8 52 88 6E 00 B9 1F 20 03 D5