菜鸟逆向实战植物大战僵尸(1)

文章目录

    • 1.修改阳光
    • 2.阳光的冷却如何实现
    • 3.实现植物0冷却
    • 4.阳光无限

1.修改阳光

我们通过改变阳光的值用ce将阳光修改过后,然后关闭游戏,当我们下次再打开想要修改阳关的值,这时候ce后面就是???也就是说这个曾经管阳光的地址不再管阳光,而是管着其他的值。
因为每次程序加载的地址不同,所以我们需要找到基址才行。也就是不管程序如何加载,这个指针都能指向阳光的地址。那么如何找呢?
首先,可以肯定的是,阳光肯定是个全局变量。我们可以猜测一个结构体管理着阳光,所以我们需要找到这个结构体的首地址。
如何到这个结构体首地址呢?现在我们知道,阳光的值是个变量,而且是有修改的,所以我们可以看看何处修改了此地址的值。
首先我们重新搜索,先找到阳光地址
然后右键下面的数据看看是什么修改了此处的值,再在游戏里面修改阳光数值扫扫
菜鸟逆向实战植物大战僵尸(1)_第1张图片我们知道阳光的值会改变,接下来我们就可以看看是什么访问了这个地址,游戏里面改变一下阳光数值,出现一条指令如下。猜测eax的值就是这个结构体的首地址,5578是阳光地址的偏移。
我们先记录一下。
然后再在搜索里面开启新的一次搜索,内容就是eax的值19c7b6e8,勾选上十六进制,一般地址隔得很远,而且没有连续的地址是我们重点关注的对象,如下:
菜鸟逆向实战植物大战僵尸(1)_第2张图片然后我们游戏里面改变阳光一次数值,有一些1
改变两次阳光数值,这些改变次数由1变成了2,所以我们可以肯定,这些指令和阳光数值有关。
其实这些都是一样的,随便选一个,查看指令,寄存器的值,然后搜索这个寄存器的值,和之前的操作一样,然后会发现始终有几百条消不掉,但是这几百条里面有四条绿色的,一般来说,绿色就是我们要找的基址了
不信我们可以看看,随便点一条绿色的指令,它的地址是一个模块加上一个偏移量,这个指针指向的就是我们的管理阳光的全局变量。
菜鸟逆向实战植物大战僵尸(1)_第3张图片再不信我们可以手动添加地址看看,首先来到我们的全局变量地址
PlantsVsZombies.exe+355E0C,再加上两个偏移量868和5578,现在这个指针所指向的地址就是我们阳光的地址如下:
我们重启游戏,发现原来的那个地址已经不再管理阳光的数值,但是我们的指针仍然指向阳光,而且其他关卡仍然有效!
菜鸟逆向实战植物大战僵尸(1)_第4张图片

2.阳光的冷却如何实现

我们知道,像这种减cd的,肯定是有个计数器,从小到大或者从大到小增长或者减少到了某个值就产生阳光,然后又从头开始。但是这个值是未知的,我们应该如何寻找呢?ce提供了选项,像这种未知的值,我们直接勾选未知的初始值开始首次扫描。
菜鸟逆向实战植物大战僵尸(1)_第5张图片然后再在游戏里面溜达一下,然后勾选减少的数值,像这种一般都是减少的,当然也有可能是增多的,多试试,最好发现这确实是个倒计时计数器,然后可以发现搜索到一亿多个数据,多试几次。
菜鸟逆向实战植物大战僵尸(1)_第6张图片多试几次,慢慢筛选,然后就会发现一个地址的数,很吻合向日葵产生的阳光。因为这个值每次减少到0,就产生阳光,然后又变为2000+,然后又慢慢减少。
菜鸟逆向实战植物大战僵尸(1)_第7张图片然后我们将其修改为0,果不其然,出来一个阳光,我们选上前面的叉叉将数值改为0锁定,阳光源源不断地产生。
这样的一个地址只管一个向日葵,多种值几个向日葵我们搜索便会发现,有几个相似的值,这说明阳光地址管理着一个阳光的cd。

3.实现植物0冷却

上面都找到了阳光的冷却,接下来我们想要找到植物的冷却,实现植物的0冷却。还是按照上面的思路,从变动的数值和未变动的数值下手。比如说双重射手,最开始是可以种植的,这时候的计时器数值肯定是未变动的,然后种下一株,计时器开始计数,数值开始变动。我们猜测还是一个结构体管理着各个植物的冷却。
菜鸟逆向实战植物大战僵尸(1)_第8张图片在变动与不变动之间几经筛选,最后只有这么一个值,而且我们观察发现,这个地址的数值增长到某一个值过后又跳回零,这时候双重射手冷却就好了,我们可以确信,这就是管理双重射手的地址。
右键查看何处修改了此处的数值,继续切入游戏,我们看到了第一条指令。
菜鸟逆向实战植物大战僵尸(1)_第9张图片随着时间的推移,当冷却完成时,出现第二条指令,我们点击种植双重射手,出现第三条指令,再一次冷却完成后,第二条指令前面的值+1,第三条指令仍然是1,还没有+1,当我们点击种植双重射手,第三条指令才+1。
也就是说,第二条指令就是对完成冷却的计数,第三条指令就是种植的计数,当然,这不重要,现在我们的重点关注对象是第一条指令。
菜鸟逆向实战植物大战僵尸(1)_第10张图片菜鸟逆向实战植物大战僵尸(1)_第11张图片点击第一条指令显示其汇编代码,查看这几条汇编代码,

inc [esi+24]        //[esi+24]里面的值+1的操作,[esi+24]里面的值,就是那个增长的数
mov eax,[esi+24]    //把[esi+24]的值赋给eax寄存器   
cmp eax,[esi+28]    //比较eax和[esi+28]的值,也就是将那个增长的值和[esi+28]里面的值比较
                    //那么我们可以肯定,[esi+28]里面的值就是冷却的上限

jle就是不相等就跳转,也就是说冷却没好时就跳转,那么我们可以直接将这条跳转指令nop掉。
菜鸟逆向实战植物大战僵尸(1)_第12张图片菜鸟逆向实战植物大战僵尸(1)_第13张图片好了,现在我们惊喜地发现,所有植物的冷却都为0了!!!
菜鸟逆向实战植物大战僵尸(1)_第14张图片

4.阳光无限

现在还是有个问题,虽然我们之前已经找出阳光的指针,但是每次都要修改,还是挺麻烦的,有没有什么办法,让阳光无限?

还真有,我们之前有说到一条指令:没点击种植一次向日葵(或者其他什么植物)这个指令就会增加一。现在我们找到这条指令如下:
菜鸟逆向实战植物大战僵尸(1)_第15张图片让修改程序逻辑,我们可以就在ce里面修改,但是我个人认为od加载更方便。所以用od附加文件,这里有个问题,就是ce在进程当中时,od是无法附加这个程序的,ce需要脱钩,也就是再点一下ce左上角那个小电脑里面的这个程序,od才能附加。而如果od附加时想要ce附加程序,就需要od脱钩,右键——>strongOD——>Detach
菜鸟逆向实战植物大战僵尸(1)_第16张图片好了,od附加这个程序ctrl+g来到00427696这个地址,这条指令,我们需要将esi更改为一个比较大的值。
菜鸟逆向实战植物大战僵尸(1)_第17张图片现在有三种修改思路:
1.直接将指令后面的esi改为一个大数字比如说10000;
菜鸟逆向实战植物大战僵尸(1)_第18张图片2.因为edi是个地址,里面的值肯定很大,所以我们可以直接将edi的值赋值给[edi+0x5578]这样既可以避免值太大将下面的指令覆盖,又能得到一个很大的值。
然后运行游戏,没毛病。
菜鸟逆向实战植物大战僵尸(1)_第19张图片3.ctrl+b搜索0000000000000000000找到一处空地址,然后就可以按照我们第一种思路来改,然后跳到那处地址去,
菜鸟逆向实战植物大战僵尸(1)_第20张图片执行完后紧接着跳回去。
菜鸟逆向实战植物大战僵尸(1)_第21张图片运行游戏,没问题,无限阳光。
菜鸟逆向实战植物大战僵尸(1)_第22张图片

你可能感兴趣的:(实战,c语言)