ce逆向修改——植物大战僵尸
一、实验目的
为熟悉CE的使用和对软件逆向分析有进一步的了解。
二、实验设备
Cheat Engine 6.8、植物大战僵尸
三、实验内容
1.针对“阳光值”
四、实验步骤
1.针对“阳光值”
(1)采用3种以上的方法扫描至少3关的“阳光值”的内存地址,并能修改;
①打开游戏进程
②第一关寻找阳光值地址(精确扫描)
初始阳光值为50,输入50,点击首次扫描,显示结果
消耗(或者增加)阳光值,使阳光值产生变化为0,输入0,点击再次扫描,显示结果
单击右键,选择改变该值,进行阳光值的修改
③第二关寻找阳光值地址(值大于)
初始阳光值为50,选择值大于40,点击首次扫描,显示结果
消耗(或者增加)阳光值,使阳光值产生变化25,输入25,点击再次扫描,显示结果
单击右键,选择改变该值,进行阳光值的修改
(2)找到阳光值的内存基址,简述如何分析和找出基址的过程;
在此地址上点右键->查找写入该地址的代码,会看到一个对话框“下列代码更改选择的地址”,里面是空白的,切换回游戏,随便种一棵植物(目的是让阳光变少,好找出哪些代码修改了此内存),再回到CE,会看到刚才的空白对话框中已经有内容了,双击或点“更多信息”。
记住EDI的值,下一步将上面的搜索框前的16进制勾选上->将EDI的值填进去->首次扫描。
搜索出一堆地址,将上一步搜索出的值添加到地址列表->右键->查找所有访问此地址的代码,双击第一个 mov指令查看更多信息,我们继续搜索所得地址。
查找到了绿色内存地址,绿色内存地址表明该地址在游戏中是静态的,它就是要找的基址了,把这些内存地址连接起来,手动填加地址进行测试。
(3)画出阳光值的内存访问示意图或工作原理;
(4)分析阳光值功能实现的设计算法;
#include <stdio.h>
class SunClass{
public:
int SunTime;
int SunValue;
int SunAttr;
};
int main(){
SunClass *Sun=new SunClass;
Sun->SunValue=100;
printf("SunValue: %d",Sun->SunValue);
return 0;
}
(5)分析阳光值的相关汇编语言代码的工作过程;
当捡起阳光时,阳光数值增加,执行下图中的两句指令;当消耗阳光时,阳光数值减少,执行下图中的最后一句指令
(6)画出逆向分析的思维导图,并将以说明其逆向原理。
(7)观察“阳关”的其它属性,并采用上述(1)-(5)的方法分析之。
首次扫描时需要进行未知的初始值,之后它的倒计时在没有产出阳光时时慢慢减少的,在产出阳光后,它的倒计时相对于之前来说是进行增加的。
选择减少的数值、增加的数值多次,操作完成之后就可以发现其的时间地址,然后寻找基址。
之后要将其进行锁定要不然还会进行新一轮的倒计时,同时要将数值修改为1,让阳光不断的进行这一操作。
(9)实现自动收集阳光,并详细说明原理;
首先找到阳光的内存地址,然后找到是什么修改了这个地址,右击找到是什么修改了这个地址然后进行阳光的收集,发现在新的窗口中出现了一行代码。
接下来会出现一行代码,选择显示反汇编程序,在调试中设置断点,等待阳光的掉落,点击视图堆栈跟踪,点击工具中的自动汇编,模板中的CT表框架代码,接着点击模板代码注入,将这里的jne修改成jmp。点击文件分配到当前列表,点击运行,删除断点列表中的断点就可以进行自动收集阳光。