游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

上节我们讲解了基址与动态地址的概念,本节课我们就开始寻找植物大战僵尸的阳光基址。

打开游戏和搜索工具,并按之前的方法搜索出阳光值的地址:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

寻找地址成功,这个地址则是阳光值的动态地址,那么我们就开始寻找这个动态地址的来源。从上节课的代码来理解,我们也可以理解成我们要找Game_Info_PvZ这个实例指针变量的地址。我们选中地址,右键,选中查看写入这个地址的代码:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

(注:之前由于工具的原因,导致游戏崩溃了,所以重新打开游戏进行了操作,接下来看到的地址可能会有所不同,再次先进行说明)

我们看到,这个框里面空空的,什么都没有,我们去游戏里捡个阳光:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

此时,阳光加了五十,这里也多了一条指令,我们双击打开看看:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

这是一条加法指令,意思是把eax的值+5560(十六进制),把这个得数作为内存地址并取这个内存地址的值,然后把这个值和ecx的值相加,结果保存到这个内存地址里面去。如果听不懂我在讲什么的同学,可以去学习一哈X86处理器的汇编。这里,如果你对汇编语言熟悉的话,就不难得出eax+5560的地址就是阳光的值的内存地址。这是一种寄存器相对寻址的寻址方式。所以我们可以推断eax所存放的地址应该就是我们所要找的Game_Info_PvZ这个实例指针变量的值(这里听不懂的话我解释一下,结构体和类的成员地址是线性排列的,所以当我们要找某个成员地址的时候只需用这个结构体或者类的实例的首地址+相应偏移,就可以得到这个成员的地址,也就对应了eax+5560),我们这里用图来表示一下:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

接着,我们看eax的值,为1635FBC0,那么这就是我们要的基址了吗?答案是否定的。首先,我们并不知道这个游戏的源码,所有的这些过程都是我们自己根据已有的知识进行猜测的,而且,这里Game_Info_PvZ不一定就是一个全局变量,它可能在其它类的实例里。所以,这里我们需要做的是,继续搜索,看看这个值/地址是怎么得来的。

我们扫描1635FBC0这个值,看看结果(记得勾选Hex这个选项):

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

这里我们得到很多结果,我们从前面开始,一个个进行测试,看看是否能找到指向这个值属于哪个类或者结构体。先拖下第一个地址,选中,右键,点击查看访问这个地址的代码(这里的值就不是阳光值了,而是其的上一层,所以应该是访问形式)。

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

这里我们看到不少代码,但我们选中第一个:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

这是一条传送指令,意思是把edi的值加上768(十六进制),把这个值作为内存地址并取出这个地址的值,赋值给esi。edi+768所得的值,就是1635FBC0这个值的地址。到这里,我们再画一个图,方便理解:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

接着,我们继续搜索esi的值:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

在结果中,我们看到了有些结果是绿色的,这些就是一些全局变量了。找到这里,我们也终于找到了我们需要的全局数据区的地址了。然而,上面绿色的结果有四个,我们应该取哪一个呢?其实,这里我们选哪个都可以,因为它们的值都一样,我们也可以先选一个,进行测试,看看是否可以每次都得到阳光的动态地址,这里我们选第一个006a9ec0作为我们的基址,对于我们找的地址来说,前面所找的这些地址都是会变化的,只有基址006a9ec0是不变的,我们这里再画一张图方便我们理解:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

这样,我们就可以通过基址得到我们的阳光动态地址:阳光值= [[[006a9ec0]+768]+5560](中括号,表示里面的数值 为地址,取这个地址的值),我们点击添加地址,勾选加指针选项,再点击一下地址指针,添加两个偏移量,填入我们的偏移量:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

点击Ok,可以看到,所得到的地址已经指向阳光值了:

游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址

这样我们就可以利用这个公式,无论我们怎么重新启动游戏,都能准确得到阳光的动态地址。

最后,我们再总结一下寻找基址的步骤:

        1.找到动态地址

        2.查找这个动态地址的来源(查找访问这个地址的代码或者查找写入这个地址的代码)

        3.不断重复第二步,直到找到基址

动态地址 = [[[[基址]+一级偏移]+二级偏移]+三级偏移]+...