分析:
植物大战僵尸种下一棵植物后有一段冷却时间,因此相信程序里肯定有类似计数器之类的东西;植物冷却时,计数器不断改变;植物冷却完毕后,计数器保持不变
破解:
1、找出计数器
2、修改计数器
操作:
我这里运用ce强大的内存查找功能来实现定位计数器,具体如下
1、运行植物大战僵尸,建一个小号,进入游戏(这样做为的是程序运行简单,便于操作),等到游戏正式开始后进行第二步
2、打开ce,附加到植物大战僵尸进程,进程名为:“PlantsVsZombies.exe”

3、设置扫描参数:扫描类型选“未知初始值”,数值类型为“4字节”,点击“首次扫描”,等一会儿后扫描完成
[
4、切换回游戏,种下一棵豌豆

5、切换到ce,此时植物填充中,所以扫描类型为“更改的数值”,点击“再次扫描”,扫描完成后结果如下:

6、切换回游戏,等待植物填充一小段时间
7、切换到ce,扫描类型选为“更改的数值”,点击“再次扫描”

8.1、植物未填充完前重复步骤6~7,具体次数看个人操作
8.2、植物填充完成,因为是从填充中到填充完成所以扫描类型还是为“更改的数值”,点击“再次扫描”


9、切换回游戏,随便干点什么
10、切换到ce,此时因为计数器不变,所以扫描类型选为“未更改的数值”,点击“再次扫描”
11、步骤9~10重复次数,具体次数看个人

12、重复步骤4~11,直到结果数为20个左右(大家可一直这样扫下去,直到结果数为1,但由于这个游戏毕竟还是算中等游戏,所以不大可能完全定位,接下来靠自己观察扫描的结果中与游戏同步的,注意:扫描到得地址应4地址对齐,数值一般不是太大)如图:



13、现在验证搜到的数据是否正确,如果正确,数据会和游戏里的植物填充显示对应,如图




14、确认正确后,他其他的删掉,并把正确的地址选到下方

15、右键下方的地址,选择“查找访问该地址的代码”,确定后会要求附加进程,因为只有一个进程,所以大家选择唯一的那个,点击确定
16、切换回游戏,种下植物,让计数器改变
17、切换回ce,可以看到如下所以代码:

18、选择最下面的一个(为什么?因为观察到下面两个比较接近,比较汇编指令后发现的)

这里贴出汇编语句:

0048728C  |.  8347 24 01    ADD DWORD PTR DS:[EDI+24],1              ;  计数器加1
00487290  |.  8B47 24       MOV EAX,DWORD PTR DS:[EDI+24]            ;  取出计数器
00487293  |.  3B47 28       CMP EAX,DWORD PTR DS:[EDI+28]            ;  与计数器终点数值比较
00487296  |.  7E 14         JLE SHORT PlantsVs.004872AC              ;  不大于就跳转
00487298  |.  C747 24 00000>MOV DWORD PTR DS:[EDI+24],0              ;  计数器清零
0048729F  |.  C647 49 00    MOV BYTE PTR DS:[EDI+49],0               ;  可用标志
004872A3  |.  C647 48 01    MOV BYTE PTR DS:[EDI+48],1               ;  可用数
004872A7  |.  E8 E4FEFFFF   CALL PlantsVs.00487190                   ;  调用使植物可用
004872AC  |>  8B47 3C       MOV EAX,DWORD PTR DS:[EDI+3C]            ;  标志位
004872AF  |.  85C0          TEST EAX,EAX                             ;  测试
004872B1  |.  0F8E BE000000 JLE PlantsVs.00487375                    ;  跳转到下面,看了下,单纯的返回

00487375处代码:
00487375  |> \5F            POP EDI                                  ;  跳到这里
00487376  |.  83C4 08       ADD ESP,8
00487379  \.  C3            RETN                                     ;  处理完毕,返回

再贴出:数据如下:

到这里,分析已经完成大半了;修改方法有多种:
方法一:直接nop掉 00487296  |.  7E 14         JLE SHORT PlantsVs.004872AC 
方法二:修改计数器终点
方法三:自己写个函数直接调用004872A7  |.  E8 E4FEFFFF   CALL PlantsVs.00487190   这语句

上传的附件 12.JPG