内容参考于:易道云信息技术研究院VIP课
上一个内容:75.网游逆向分析与插件开发-背包的获取-背包结构与指针的逆向分析-CSDN博客
通过上一个内容,知道了背包的结构,它是一个指针数组,它里面还记录的背包有多少格。
然后打开x96dbg,来到上一个内容分析过的0x787022位置
然后ctrl+f9,再按f8,来到上一层
然后这个函数的一个参数与ecx的情况,ecx是0x217D6034,然后现在的代码位置是0x9518F0,这个位置是使用药品来的
然后ctrl+f9,再按f8来到上一层
是一个虚函数
然后这时使用药品没有 0x217D6034,所以0x217D6034这个值是被计算出来的,然后就只能一行一行的分析在执行到 0x9518F0 这一行之前的代码,然后按f7进入函数
然后进入到下图函数,一路f8,注意观察 0x217D6034 这个值第一次出现的位置
在下图位置第一次发现 0x217D6034 这个值,它是在0x950A88位置调用的函数的返回值
现在游戏因为长时间不动掉线了,所以后续图中的物品指针地址与上方图中的地址会不一样
然后因为记录的地址,所在在0x950A88位置开始分析,然后看下图红框里的四行代码,第一行mov ecx, dword ptr ds:[0x1256E3C],这个0x1256E3C之前在找弹框的时候找到过,然后接着调用了0x1256E3C类里的成员函数,也就是call sro_client.866140这个函数,然后 sro_client.866140 这个函数有返回值,为什么说它有返回值,因为它的下一行是mov ecx,eax,eax跟在一个call指令后面一般就是函数的返回值,这个是一个典型的返回值写法,然后下一行是call sro_client.7722C0函数,这几行代码的意思就是,从 0x1256E3C 成员函数 sro_client.866140 里得到一个对象,然后调用这个对象里的sro_client.7722C0成员函数,然后通过 sro_client.7722C0 函数得到了物品指针,所以sro_client.866140这个函数里有背包找物品的算法
然后sro_client.866140函数很短,如下图红框里的代码,有两个参数1和19,然后ecx+370这样的操作多半与继承有关,然后调用了sro_client.98F3A0函数
然后结合上一个内容中分析的,它物品里的偏移3A0位置是第一个物品指针,然后偏移加3A4位置是最后一个物品的指针,然后就可以认定下图的几行代码就是为了获取背包基址的
然后接下来看看,能根据背包基址得到些什么东西
现在的基址是,0x1941B294
首先说明一点,这里我是使用的游戏中背包里第一个物品,也就是使用的下图红框位置的物品,所以才说0x1941B294它是背包的基址
然后打开 Cheat Engine 分析数据,首先看看 0x1941B294 与金钱有没有关系
然后下图红框里的地址就很可疑,它与 0x1941B294 太相近了,很明显是一块内存地址,也就是一个结构体里的数据,然后算一下金钱的迁移 0x1941B60C - 0x1941B294 = 0x378
然后这里记入一下获取背包基址的关键点 0x950A88 地址
然后理一下分析过程,最早是通过鼠标放上去的字符串的方式去找物品地址,很麻烦然后就放弃了,这里可以看上一个内容里的分析记录,然后现在换一种思路,之前有分析到有物品的id也就是5912、5913等这个数字,然后它肯定会有访问它的,然后接下来通过它的id来找这个东西,看看好不好找,然后通过上方找到的背包基址得到物品id
这里游戏又掉线了,重新登录了,下方图中的地址变了
重新找物品id
然后查看有什么访问了它,有两个地方
大体看一眼代码
下图这个代码,相似是一个get函数
记录现在寄存器的数据,方便在x96dbg里做条件断点:ecx是 0x244870C8,然后地址分别是0x995800与0x995830
然后关闭 Cheat Engine 打开x96dbg,如果不关闭 Cheat Engine,x96dbg没法附加
然后先看 0x995830,它是一个长断的函数,需要做条件断点
然后看到下方有个390
然后在看上一个内容通过访问去找的分析记录,就能想到可能根据物品id的访问去找也没法玩
然后一直按ctrl+f9再按f8就会发现它会一直循环到下图中的代码里,所以通过访问去找还是很麻烦
所以有时候通过写入的方式比通过访问的方式去找要好,要容易许多,这种有涉及到ui访问的数据,然后还通过访问去找它的机制,会麻烦,ui的干扰性很大,而写入的干扰性就会小,但如果跟怪物共用的数据,还是去使用写入的方式,那就又会是一个很麻烦的东西