【干货】如何开发一款游戏修改器?10:分析技能快捷栏数组
文摘
游戏
2025-01-02 00:11
广西
本期教程我们要一起来分析一下技能的这个快捷栏的数组,它与背包的数组分析应该是相似的。我们先来看一下这个游戏。在虚拟机启动的时候,我们先来说一下思路。他的思路的话与前面那期背包数组的相关分析类似。那么我们可以通过移动或者是交换来实现,第一个也可以,第二个也可以,交换它的对象,让他相应的格子的这个对象发生改变。然后我们可以搜变动的数值,如果是相应的那一格移开,他为空时我们可以搜数字零。像这种方法适用于大部分的游戏,但是极少数的游戏呢,它移开的时候会以一或者是其他的数值来表示,那个空格是为空的,但是这种情况极少,基本上99%都是与我们今天看到的就是我们今天这个游戏类似它的技能栏或者是背包的话,因为这种一般是一个固定大小的数组,所以说它不会用二叉树或者是容器这种比较复杂的数据结构,而是用的就是普通的一个数组。那么所以说呢我们一般就是某一个,一般是以第一个为例,它为空的时候我们收数值零,如果不为空,那么我们就收一个大于零或者是非零的数值就可以了。有的是存放id这类的,但存放id的话,它移开了,它一般也是为零的,存放id的那种游戏也比较多。那我们来看一下启动好没有,应该是启动好吧。试一下。先把这个360卫士退了,不然老是提示这样那样的。好,然后我们可以看到下边这个F1到F8的,它就是那个技能的快捷栏。那么这个快捷栏的话,他也分了很多格,你看这里有个上下键,有个上下限,它可以有多高,这一类的好。一般情况下我们只显示了第一个,其他的格子呢,他应该也是类似的,只要我们能够找到第一格的话,其他的应该都是挨着的。所以说我们只需要在这里选中某一格来做这个定位就行了。比如说我们选第二个是吧,现在它是为空的,那么我们打开C1就收零就可以了。我们先打开cad工具,好,然后我们先X32debug了,也打开,附加到我们的游戏。然后呢我们一般来说的话,用第一格来作为定位比较常见哈,那么我们先把第一个让他置空,这个时候我们收零,搜一下数值的零。这样说出来的话非常的多,几千万上亿个任意的移动一个技能对象到上上边。那么这个时候无论它是id还是对象,那么这个数字呢肯定都是不为零的数字,所以这个时候呢我们可以搜变动的,也可以收增加的,减少的都可以,但是不要收零就可以了,我们在这里呢收值大于零,比零大的数值再搜索好。然后,这个时候我们的数值还是没有变动。继续过滤的话,我们可以搜未变动的数值,这个可以收多次。那么经过这样的搜索的话,这个时候大概还有19万接近20万个数据可以多次收未变动的数字,而且我们可以把这个移开之后再搜一下精确的数值零,这样也可以过滤很多。这个时候只有8万多个好,我们可以移动一下其他的技能或者去动一下背包这一类的进行一下其他的一些操作。然后第一个依然是为零的,我们再继续收零就行,这个可以收很多次,是很多次啊。移动到上边去,我再移开啊,它依然是为零的。然后移动一个对象上去,然后我们再搜一下值大于零的,因为第一个上边放了一个对象,这个时候它的值是大于零的。这个时候就只有888个了,然后我们再把它移开,再搜一下精确数值零。这样你看,经过一个反复的一个过滤,这个时候我们的这个数字,反正就是重复1到3这个步骤,然后最终这个备选列表的数量小于100的时候,我们就可以到x debug里面去,一次一个地址一个地址的看,看哪一个地址,它符合我们数组的这个特征。比如说我们现在的一个特征的话,他就是第一个是为零,第二个为空,第三个是零,第四个非零,567894个零是第九个不为零啊,第十个为零。如果符合这个特征的话,它就是我们技能栏的这个数组,就是这个数组。所以我们接下来最好就用我们的x debug来查看啊,附加进去进去之后,现在你看第一个它依然是为零的,第一个依然为零,那么现在它有几个数值不为零了,变化了。我们可以在过滤搜索一下。我们把这十个添加到我们备选列表里面,一个一个的查看,一个一个的查看。然后我们到x debug里面,看一下。你看这一片的话,它都为零,那肯定就不是了是吧。因为我们现在的这个如果用布尔值来表示的话,那么它是什么呢,他大概就是零。这个一的话我们表示非零啊,这里他大概大概就是这样的123456。大概就是这样的一个表示。当然我们这个一呢它不是表示数值的一,它是表示相应的那一格呢有一个对象啊。现在啊,所以说第一个数字的话明显不是的,不是的。我们标记一下,然后去找第二个地址。那么第二个地址呢,你看这个进去的话,现在它变化了这几个。看到没有变化了的话,我们可以进一步的一个过滤,这些呢直接给删除掉,因为第一个它依然是为零的,所以这些呢它变化了之后,它不再符合我们第一个为零的那个特征了。我们再来看一下这个。这个的话看起来比较像。我们来看一下我的那个特征是多少,把它调整小一点,然后这个是非零的,零归零,然后接着是四空一狗。然后后边这样的话,这样来看的话,这个地址呢就是我们这个技能的对象的地址。我们可以调整一下它再来做对比。现在234是非零的,其他全部为零。我们看一下,你看234是吧?这是一吧?所以说我们再调整一下,把123个调整出来,调整为这样的一个特征,再来看一下。那么你看一下一二格为零啊,后边的话是间隔为零,那说明的话,这个地址就是我们背包的这个物品,后边的话应该都不会有符合这个特征的。我们到6×3那个选项卡来看一下,你看后边的话,这个肯定也不是的,不是的。我们都删掉,这个应该就是这个不是那个地址。它是地址啊,注意不是机制。那么你看这些都是一大片的,这个也不是的,后面这三个都不是,但是呢,它可能是相关的一些数据。那么所以说我们现在找到的,注意这个它只是地址,重启游戏后,这个地址它是会发生变化的。所以接下来呢我们要通过这个地址来找到它的这个物品。那么我们再改动一下它,123个我都给他放上对应的这个技能,然后切换到这里来,对这个地方我们下一个断点,防断好访问段之后,当然这个断点的地方哈,我们每个人下这个段之后,他可能断下的地方不一样,这是一个数组的一个标志啊,当然也可能是在其他地方,比如说这个地方是吧,他也是数组地方,他都有可能断在不同的地方。那么我们分析的步骤呢,他肯定也略有不同,但是目前来看的话,主要就是这两个地方啊。这两个地方我们任意的选一个来分析,看运气好不好,运气好的话,很快就能找到,而且我们之前有分析这个背包的,这个背包和这个快捷栏的话,他有可能有一些共同的这个机制,偏移的一些相关的数据,我们可以先把之前的这个背包的这个物品偏移先调出来,等会我们分析到有相同的一些那个数据,我们就可以直接用。那么我们先看一下。现在呢这两个地方都是数组,我们把它记录一下,目前有两个地方看到了。当然也可能还有更多的一个地方是吧,这里呢他也是访问了那个数组的。其他还有哪些地方呢,暂时不太清楚,我们就以这个地方为例分析吧。那么这个ex的话就是我们的下标了,背包数组下标。好那么这个东西是下标,那么这个E4X呢就是那个数组的那个对象的一个机子。那么这个机子呢也就是我们看到的这个3D40,在这里可以看到的是吧,就是这个3D40。我们先把这个3D40把它拷贝出来,那么这个3D40它来自于哪里呢?在这里的话,三第四话是从我们可以这样表示E4X,那么这个E4X它前面有一个E4X,后面也有一个。我们是指的后面这个它来源于E4X加C,那么这个E4X呢它是一个什么呢?E4X它是一个在这里应该是一个叫ZS指针,是一个对象的一个ZS指针,它来源于更上一层。我们就在这里下个断点,然后把这个访问硬件段先给删掉,删掉。那么我们先看一下断下来的这个E4X加C,取出来是不是这个233C3D四零,因为像这种的话哈,他可能其他的数值也会跟这里过,那么这个E4X就有可能是一个变动的一个对象,他如果很多的呃,那个比如说像我们背包,还有像我们技能的宿主,他比如说他都派森是同一个类同一个机位的话,那么他有可能是共用的,这个函数我们先看一下他是什么情况好,我们看看E4X的值,那么我们先把这个ex的值加上这个C来看一下,看一下里面存放的值是不是这个233C3D40。如果是的话,那么这个E4X呢就是我们要找到上一层的那个地址诶,那么我们进去看是吧,的确是23343D是零,那么如果不是的话,那么我们应该怎么办呢?如果不是的话,我们这个地方就需要下一个条件断点啊,要让它等于这个233C3D四零的时候断下,就需要下这个条件断点。但是现在呢他不用的是吧,现在他直接断下就是这个数值,所以我们不需要这个条件断点,我们直接返回到上一层就行了啊,我们把分析的数据啊弄到这里。这里呢我们也提到了一个条件断点,大家可以关注一下啊。好这里呢我们先返回上一层,那么返回上一层之后呢在这里我们要找的就是多少呢,就是E4X是吧,加C那么E4X加C等于1BX加C是吧,两个都是相同的,那么我们要找的话就是因为它的值来源于1BX,要找就找1BX向上走。当我们遇到EPX1PX时,我们不确定是否就是我们要找的值。我们先在这个位置设置一个断点,然后按下F9。在这个时候,我们用EEPX加零CAEBX来检查,但现在好像都是零。这显然不对。我们先CTRLA分析一下。我们注意到这个位置上有一个跳转,从这个跳转过来。我们按下F8继续向下执行一下,但好像被跳过了。再按下F9试试看。1BX在这个位置上始终为零。我们继续往前找找看,看还有没有其他的1BX。在这个地方,1BX的值似乎负值为零。那么我们需要找的值应该来源于什么地方呢?在这个地方下面有个断点,看看它是从哪里过来的。这个时候,1BX等于这个值,看看index加C加水这也是一个数组,但好像是背包的数组。我们再设置一个断点看看。这个应该是找到了一个循环里面。我们尝试从另一个方向来看看,看看是否容易一点。我们取消这两个断点,换个方向来看看。我们注意到EDI的值,EDI加C是我们刚才的背包数组。那么我们干脆就写成这种形式,知道他是EDA加C就行。再往前找,又到了上一层,看看现在的E4X,它又是变动的。这可能是背包的对象。但D78的话应该也是一个数组,可能是其他的某一个。因为还有仓库这类的。这样的情况下,我们就需要配合CAE来找,比较容易一些。我们先记下这个地址,然后用C1来找这个数字,先备注下技能栏的数组地址。用C1找到的话应该有一个地址指向他,我们让它继续运行,看看这个地址还在不在,然后重新找一下这个游戏看看断下来的情况。根据我们刚才的分析,直接用x debug来找可能会比较麻烦,因为可能会进入循环里面去。我们现在要重新开始搜索。我们先用CE跳过那些复杂的部分,重新定位一下。这一步我们就不详细说明了,直接开始搜索。我们先收集零值,然后收集大于零的数字。再把它移开,搜索精确数值。现在还有2000多个结果,我们继续移动一下。这时候依然是零值,我们继续收集。然后移动一个数值上去,搜索大于零的值。这个操作可以进行多次。凡是变红的肯定就不对了,前两个没有被过滤掉,我们手动删除它们,然后再移动开。再换一个数据上去看一下,大致上应该是这样。快速地看一下历程度上,我们也可以到C1里边来看一下。然后你看这里占了八个字节,就是前两个对象,这是第三个,第三个是为空的,这是第四个,那么从这里来看的话,应该就是第一个找到的这个地址,就是背包的地址。技能拿到地址的话,我们把前两格移空再来对比一下,你看前两格移空的话,就是八个字节的零,然后有有三个不为空的地址,三四十二个字节。这是第四个,这是第五个,第六个。但是在C里面看的话,它没有我们在那个插debug里面观察方便。我们移动一个数据上去,在这个地方我们下一个访问断点,这样来找。这个时候,我们先把它停止掉,重新附加一下。接下来,我们还是要用到插底bug,但是现在我们之前分析的地址好像是。但是现在我们可以来去分析这个我这个。我们可以说从一个不同的路径去分析,可能这样分析的话就会简单一点。我们尝试一下不同的路径,他的难度不一样。那么我们先试一下这个。这个因为是我们在移动的时候,他才会从这个地方来断下。我看一下。这个地方我们是刚才分析过了是吧。我们换一个,但是从这里来看的话,他都是414开头的C4D。再看一下这个地方是不是刚才的那个地方,这个地方是一个新的一个地址,你看平时他也不会断下,只有当我们移动的时候,它才会断下。这个的话应该比较好分析一点。我们先从第一个移到第二个试一下。那么这个时候EBX就是第一个嘛,他要清0EDI,所以说它的下标是为零的。我们要找的是这个EAX。那么现在的ESI等于多少,等于这个数值是吧,向前走一下,加四好。那么我们向前走1ESI,放大啊,然后找到这个地方,这个断点我们先去掉。那么这个也是上层的E4X,上层的E4X的话,我们直接按F8返回到上一层嗯。那么要找的是这个ESIESI的话,我们先把这段拷贝一下。我们向前看。那么在这里的话,它来源于这一个框里面,这个库的话,这里我猜测可能是下标,然后到这个框里面去取相应的那个呃对象,有可能是这样的,因为这个EX的话,他是上一个库库的一个,这个人可能就是我们取额,根据下标取技能栏对象的啊,有可能是这样的。我们先下个断点先试一下,比如说啊这个时候我们再移动一下,移到第一个,看一下是个什么情况,那么ex a ex这个时候他是不是下标而是一个字符串,它是什么呢,根据他的一个英文名字来描述的话,他是这个快捷快捷栏里边的什么10H杠一。这个看不太懂,应该是一个编号,然后呢他根据这个编号,然后取出来的是什么啊,取出来的这个ex看一下,跟我们刚哎你看就是我们要找的这个是吧,就是这个字啊,就是这个值,那么所以说我们现在的话,基本上也有办法取到这个数组的地址,就是调用这个库,然后传这个参数进去,那么在这种呢我们就可以不用机制偏移。