最后战役X,获取“飞天”选择框选中状态
为了避免读者浪费时间,提前声明:本文仅适用于《最后战役X》这款单机安卓手游。(64位)
搜0搜1也能找到选择框选中状态,但是既然当前已经得到了so的符号,肯定有更快更优雅的办法,
找选择框,最开始想的是搜checkbox,搜不到,那就翻代码,把看着像游戏作者写的函数,都大概浏览一下,比如uidm(猜测是“ui代码”)开头的函数,men开头的函数,诸如此类,
unity游戏,xxxxupdate函数很重要,会很频繁的被调用(比如unity中的update函数每帧都会调用一次),带有update的函数多看看,在men$$FixedUpdate函数能发现一个名字带有UI和toggle的函数,那么就可以积累了,下次再想找选择框,除了搜checkbox,还可以搜toggle,找组件,就搜UI。
之前这篇文章提到过,dump.cs可以直接看到偏移。上图那个注释部分就是根据这个文件写出来的。另外,men是类,FiexdUpdate是这个类的一个方法,通常这种情况,逆向视角看到的参数一,就表示调用这个方法的对象的地址,所以这里a1就是一个men类的实例,0x20的位置就是uidm对象,以此类推,v7是个Toggle对象,名字是rjbd,猜测是“人机不动”。
接下来,双击这个UnityEngine_UI_Toggle__get_isOn,发现获取状态很简单,这个状态就存储在Toggle对象地址的0xF8这个偏移的位置。
咱要找的不是“人机不动”,而是要找飞天的选择框,直接对着UnityEngine_UI_Toggle__get_isOn按X,
有个move的函数,看着就像是和飞天判断有点关系,过去看看:
那么这里就是游戏作者的飞天想法了,看看都做了啥:UnityEngine_Rigidbody__set_useGravity设置重力为0、然后设置了个啥属性,用了UnityEngine_Rigidbody__set_isKinematic这个函数,这个函数有啥功能,我不知道。不扯这些了,赶紧搞到飞天选择框选中状态的基址偏移。
接下来就差a1了,刚才说了,a1可能就是个uidm对象的地址,我没学过unity,但我感觉似乎每个类都有Start方法,百度搜了一下:当Update函数第一次被调用前会调用Start函数
那么作用就类似于构造函数吧,去uidm$$Start函数看看:
注意第91行,这是bss段的数据,libil2cpp.so+A8BDD0,然后93行,窝草,把uidm对象地址直接就放到了[[[libil2cpp.so+A8BDD0]+0xB8]],这种难度,我不禁想到了这个视频:
那么飞天选中状态的基址偏移就有了:[[[[libil2cpp.so+A8BDD0]+0xB8]]+0x68 ]+ 0xf8