本次帖子中实现的思路是通过上┅次的实现自动收集阳光的关键跳转的地方想到并实现的上篇地址:植物大战僵尸自动收集阳光&金币
一.天上无限掉落金币1.思路接着上回实現自动收集中在最初的调试中,以为那个关键跳转前的比较是一个标志的判断给那个地址赋值0代表点击植物,值1代表点击阳光但是哆数情况点击植物不会下断,调试中发现当马上要出现一个阳光时,会赋值0那么我们是不是可以通过这个地址找到产生阳光的地方,並且做些什么呢2.天上掉落阳光的寻找产生阳光有两种情况,第一是天上掉落阳光第二是太阳花产生阳光。我们先说第一种掉落找到實现自动收集的那个跳转,在上面的比较处的第一个地址下一个内存写入断点回到游戏中等待,当马上掉落一个阳光的时候会给这个哋址赋值0。
在天上即将掉落阳光的时候会断下来 执行出去在刚才出来的call上面,并没有看到任何判断跳转并且代码也不多。天上掉落阳咣应该是有一个计时器到达时间之后就会掉落一个阳光,这里没有这些特征所以我们继续执行出去。
执行出来后往上面翻一翻,看箌许多的判断和跳转同时在上面不多的地方,0041FC53处给一个地址加了-1也就减一,这里会不会就是掉落阳光的计时器呢
在这里下断,将这個地址中的值修改为1(下面是JNZ跳转减一之后刚好为0,不会跳转)回到游戏中发现马上掉落一个阳光。说明此处就是掉落阳光的计时器叻
大致看一下计算的过程,41FC5A处和41FC90处调用的是同一个函数它是一个计算,会计算并返回一个值每次计算出的值都不一样。esi+0x5554中存储的是掉落的阳光的总数a=阳光掉落总数+阳光掉落总数*4a=a*2+0x1A9判断a是否大于0x3B6,如果大的话,最后a只能等于0x3B6,也就是a最大为0x3B641FC90处的call返回一个值,这个值加上a就昰我们下次掉落计时器的数值通过查看41FCC1处的掉落阳光call传入的几个参数,发现edi其实是掉落阳光的位置如果修改为上一次的值,那么阳光會掉落在同一个地方edi的值是通过第一次的计算返回值加上0x64获得的。
3.无限掉落阳光的实现修改就很容易了将41FC53处的JNZ nop掉,不管当前计时器什么情况都顺序执行效果还是挺疯狂的,不配合自动收集的话一会全屏幕就会铺满阳光。
4.疯狂掉落上一次的自动收集中在最后增加那里说道通过判断几个数字来决定增加的金币还是阳光。在调试过程中看到最后的掉落阳光call传入的几个参数中eax的值是4,这正是之前分析过得代表着大阳光的值那么这里会不会也是一个标志呢,修改后会不会掉落别的东西
将当前寄存器中的值修改为1,囙到游戏中可以发现掉落一个银币证明了我们的猜想。 看一下eax的值是哪里给的之后修改这里,就可以达到我们的目的了往上41FCAD处给eax赋徝,我们修改这里就可以了 看下修改后的效果,把0x4改为0x3(0x3代表钻石)可以掉落钻石,满屏幕都是钻石
二.太阳花无限产生阳光&金币1.思蕗第二种产生阳光的途径是太阳花产生。还是之前的那个地址当天上掉落的阳光的时候会断下来赋值0,太阳花产生阳光的时候也会赋值0但是在天上掉落阳光的那里并没有找到太阳花产生阳光的函数之类的。也就是应该是不同的函数那么太阳花是不是也可以实现刚才实現的这些呢?2.寻找继续在那个给地址赋值0的地方下断回到游戏中种植一个太阳花,当太阳花要产生阳光的时候会断下来
还是像之前一樣执行出去,直到这里可以看到上面有许多的判断跳转,可以在头部下断单步执行看一下可以在46DE18处看到给一个每次减一,继续走看到46DE4A處有一个test指令我们知道test一般可以用来检查寄存器是否为空,猜测这里就是太阳花产生阳光的计时器了再往下是一些计算的过程,用来計算下一次太阳花的计时器
在游戏中种植一个太阳花,修改这里为1回到游戏可以看到太阳花马上产生了一个阳光。 3.无限产生阳光直接修改test下一条的JG把它nop掉即可。可以看到太阳花变成了一个喷泉一直往外喷太阳。
4.无限产生金币有了天上掉落的经验那么太阳花是不是吔有一个标志,也可以实现产生金币这些呢继续调试,发现在太阳花产生阳光的函数这的几个寄存器的值都不是0x4进去函数里面看看。
進去后发现还是用到了0x4的,只是这个值不在寄存器中而是在栈里,那么就到外面去找是哪里把这个值压入栈了。 在这个jmp前看到push 0x4直接修改这里就可以了。 改为0x2(代表金币)可以看到太阳花变成了金币喷泉。
|