植物大战僵尸自动收集阳光

一.自动收集阳光
大致思路,猜测有一个点击阳光的函数,当我们点击阳光后,会调用它,完成增加阳光的一系列操作。但是只有当我们点击的是阳光时,才会调用它,所以点击阳光应该是有一个判断的,判断点击的是否是阳光,找到这个判断应该是可以实现自动收集阳光的。
分析
我们可以通过找到点击阳光的函数,再去寻找判断来达到我们的目的。点击阳光后会增加阳光数量,那么我们就可以先去寻找存储阳光的地址。使用CE,寻找存储阳光的地址,附加游戏后,每当游戏中的阳光数值变化后,在CE中使用精确数值搜索,搜索当前阳光值,确定一个地址后,将其中的值修改为999,发现游戏中阳光数量也随之变化,那么这里就是存储阳光的地址 。

植物大战僵尸自动收集阳光

右键点击这个地址,选择find out what writes to this address,回到游戏中,等待一个掉落的阳光,点击增加阳光后,这个窗口出现了变化,记住这个地址0x43C0AF,使用OD搜索此地址进行分析(此时需要关闭CE,才能使用OD附加程序)。

植物大战僵尸自动收集阳光

使用OD进入此地址进行分析,在这里下断,每次增加阳光时都会断下来,阳光数值的变化是阳光本身的值加上ecx的值,看当前ecx的值是0x19(25)这正是一个大阳光的值。

植物大战僵尸自动收集阳光

执行返回到上一层,根据里面的代码分析,我们刚才出来的这个函数,就是当我们点击阳光后,增加阳光数量的函数。点击阳光的判断并不在这里,这个函数只是当阳光到达左上角时增加阳光数量而已。

植物大战僵尸自动收集阳光

继续执行出去,返回之后,在上面这个函数下断,回到游戏中,当我们点击阳光时就会断下来,F9后,回到游戏中点击继续游戏还是会断下来,但是发现阳光的位置发生了改变,不断的在向左上角移动,那么这就是点击阳光的函数了。

植物大战僵尸自动收集阳光

在点击函数的上面有许多的判断跳转,其中有一个关键的跳转决定是否进入此函数。猜测这里大概是一个标志的判断,判断我们点击的是什么,如果点击阳光的话,就进入这个函数,否则不会进入这个函数。我们可以去查看这个地址,是否符合我们的猜测。

植物大战僵尸自动收集阳光

找到与0x0比较的这个地址,下一个内存断点

植物大战僵尸自动收集阳光

回到游戏中,点击一个阳光,程序断了下来,可以看到给这个地址赋值1,与0作比较是会跳转的。

植物大战僵尸自动收集阳光

当我们点击一个植物时,程序断了下来,可以看到赋值0,JNZ是不会跳转的。这里应该就是一个点击标志的判断,只有当我们点击阳光的时候才会赋值1,调用函数。但是有一个问题是,有的时候点击植物的时候并不会断下来,在后续的调试中发现,这里并不是判断植物的,产生阳光的时候才会赋值0,这里后续会提到。

植物大战僵尸自动收集阳光

修改就很简单,只要让这里无条件跳转即可,改为JMP。

植物大战僵尸自动收集阳光

二.自动点击金币
有了阳光的经验,金币就好办多了,还是寻找金币的存储地址。但是没有通过精确搜索找到金币的存储地址,没办法只能用别的办法。

植物大战僵尸自动收集阳光

通过寻找当前减少的数值,来寻找。不断的寻找减少的数值和未改变的数值,寻找,最终筛选剩下4个,尝试修改其中一个,发现游戏中金币数值改变。看到实际中存储的数据,比游戏中显示的少了一个0,之后再搜索寻找,发现金币数值除以10即可精确的找到地址,金币的数值在内存中应该是少了一个0进行存储的。

植物大战僵尸自动收集阳光

还是老方法,右键,选择find out what writes to this address,增加一个金币之后,记下这个地址回到OD中搜索。收集一个金币,看到给地址中的数值加了1,但是一个小金币的数值应该是10,说明金币的存储在内存中是少一个0的。

植物大战僵尸自动收集阳光

执行出去,可以发现居然是刚才阳光的函数,说明点击增加阳光和金币是同一个函数,那么修改同一个条件就可以实现自动收集阳光和金币。

植物大战僵尸自动收集阳光

回到刚才增加金币的那里,向上查看就能看到阳光的增加函数。分析一下是如何判断金币和阳光的。看到是通过eax的值来判断的,动态调试看到,eax=4或5时,代表阳光的增加,1和2的时候代表金币的增加。eax=4的时候,代表的是大阳光,赋值0x19,eax=5的时候代表的是小阳光(夜晚关卡,小蘑菇产生的小阳光,一个增加15阳光值,43C09B处的eax+0xA,让ecx中值=0xF),赋值0xF

植物大战僵尸自动收集阳光

对于金币来讲eax=1时,代表小金币,eax=2时,代表大金币(43C109处,eax+0x3,让edx=5,大金币一个增加50),eax=3,代表钻石(43C116,43C117两处会让edx=0x64,一个钻石增加1000)。

植物大战僵尸自动收集阳光