好友
阅读权限 30
听众
最后登录 1970-1-1
Panel
发表于 2022-3-10 17:25
单机游戏逆向分析:植物大战僵尸中文版破解学习
用到工具:CE、OD、植物大战僵尸中文版
原理:每个程序在window上都会分配得到4GB的虚拟内存,我们只需将其在该4GB上对应的逻辑和数值进行修改即可实现最简单的破解
例子:1.修改阳光反向增长
2.实现植物卡槽无冷却
1.挖掘阳光数据
0x1打开ce工具选择游戏进程选择打开按钮
1
0x2选好植物进入游戏后得到了50阳光的初始值,那我们ce选择精确数值4字节首次扫描
2
首次扫描出现了多个结果,那我们继续通过数据变化来继续跟踪
3
0x3在栽下一个向日葵以后阳光值变化为了0,那输入0再次扫描后就只得到了一个结果
4
0x4将该值添加到地址表,修改数值确认该值是否是阳光地址
5
更改后发现这个地址的值就是阳光的地址值
0x5我们此时知道这个地址的值就是阳光的地址值,所以我们就可以通过查看是那些代码访问了或改写了这个地址的值,就比如我们看到游戏右上角的阳关数就是通过不停访问阳光的值显示此时的阳光数量,我们栽下植物后或者收集阳光后则是对这个地址的值进行了更改(增加或减少),那我们选中地址列表中对应地址的值按下F5来选择附件进程跟踪是什么访问了这个地址,如果打开这个窗口是空内容的话那就栽下或者收集阳光就可以出现内容了,那为什么会出现没有内容呢?因为这个窗口的内容是从我们附加游戏进程后来记录对应的访问和改写记录
6
0x6此时我们选择再栽下一棵植物来找最新的记录,然后查看这条指令所在的汇编代码
7
0x7打开反汇编界面以后,可以看到在我们跟进这条记录的前一条指令是sub esi,ebx
我们知道sub是相减指令,而且刚才我们是栽下了植物,阳光减少了,所以猜测这里的esi存是未更改前的阳光值,ebx存的是对应植物所需的阳光值,则[edi+0x5578]存的是此时阳光的值,那我们此时可以通过修改sub esi,ebx 指令为add sub esi,ebx来验证我们的猜想,如果我们栽下植物后阳光增加了对应栽下植物所需的阳光就说明我们的猜想就正确了,此时阳光是9899,那我们栽下一个寒冰豌豆175试试
8
0x7果然,我们的猜想正确,那我们选中此时的add esi,ebx按下CTRL+G来查看这条指令的虚拟地址,并且把它记录下,00427694
9
2.挖掘卡槽冷却数据
0x1这里我们采用和挖掘阳关数据一样的方法来跟踪数据,即卡槽没在冷却则为一个状态值,在冷却为一个状态值,这里我们通过猜测状态值为1、0来挖掘(不对再通过模糊搜寻来挖掘),这里注意用状态值时基本都是字节类型,所以要记得更改数值类型再搜索
10
0x2最后找到22个可以数据我们全部把这些地址值加入地址列表,然后通过二分法来批量修改验证知道找到最后的卡槽冷却数据,这里我就不说二分法具体怎么用了,大家可以百度,最后我找到卡槽状态的地址值是0x1F5B2438(临时数据,不是特征,我只是说一下我找的数据方便接下来讲解),此时我们知道我们之所以看到植物卡槽的状态灰与亮都是由这个值来决定,那我们依旧采用挖掘阳光数据的方法去查找那些指令访问了这个地址,查看汇编代码
11
mov byte ptr [esi+49],00
mov byte ptr [esi+48],01
0x3mov byte ptr [esi+49],00代码是我载下植物时候产生的访问或者改写记录,可以看到上面两行代码一个赋值00,一个赋值01,那我们就将00改为01试试,发现依旧没实现无冷却,那么我们分析指令,发现以上两行指令是在一个jle条件不成立的情况下才会执行,那我们直接把jle那行指令nop了,让它无论什么情况都执行一下两行代码
mov byte ptr [esi+49],01
mov byte ptr [esi+48],01
0x4更改后发现的确没存在了冷却,和挖掘阳光一样,记下这几条指令的地址0049CE02
12
3.此时所有的修改都是内存中的值,都是临时,所以我们接下来用od对其进行永久性更改
0x1先对阳光反增长逻辑指令定位更改,CTRL+G跳转到00427694,将sub 该为add
13
0x2对卡槽冷却逻辑定位更改,CTRL+G跳转到0049CE02,jle用二进制填充,mov byte ptr ds:[esi+0x48],0x0改mov byte ptr ds:[esi+0x48],0x1
0x3右键保存所有更改,再次运行更改后的程序发现已经实现阳光反向生长和卡槽无冷却
注意:以上所涉及到的工具和技术均只是用来学习分析!请勿利用其做任何违反国家法律、侵犯他人商业利益!
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。