目录
一、实验工具介绍
二、针对植物大战僵尸
2.1 针对“阳光值”
2.1.1“阳光值”的内存地址
2.1.2 找出阳光值的内存基址
2.1.3 分析阳光内存的工作
2.1.4 分析阳光值功能实现的设计算法
2.1.5 阳光所用内存和数据分布
2.2 针对植物
2.2.1 植物的内存地址
2.2.2 植物的内存基址
2.2.3 代码工作过程
3.3 针对金币
3.3.1 金币的内存地址
3.4 针对僵尸
3.4.1 僵尸数量的存放地址
3.4.2 僵尸血量分析
3.5 关卡跳跃
三、心得与体会
一、实验工具介绍
Cheat Engine是一款专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。Cheat Engine的用法也不是很复杂,首先是要先打开游戏,然后打开Cheat Engine,点击左上角的那个电脑图标,在弹出来的框中选择游戏进程,然后选择扫描类型和数值类型,进行扫描并修改。内存扫描是Cheat Engine的最主要功能之一,它可以扫描指定数值的内存地址,通过修改这些数值来达到修改游戏数据的目的,从而达到诸如无限生命、时间或弹药等优势。
二、针对植物大战僵尸
2.1 针对“阳光值”
2.1.1“阳光值”的内存地址
采用3种以上的方法扫描至少3关的“阳光值”的内存地址,并能修改;
第一种:精确数值修改阳光值
第二种:根据增加的数值或减少的数值改变阳光数
第三种:根据数值增加了…或数值减少了…改变阳光数
2.1.2 找出阳光值的内存基址
因为要实现修改阳光值,所以要找出游戏中存放“阳光”的内存地址,然后使用API函数进行内存修改,但是每次运行游戏时这个内存地址都会不一样,所以要找出基址。
以上题为例,已经改好的一次阳光值为7777,在此基础上找基址,如上图所示,内存地址“2E1FA8E8”就是存放阳光的地址,我们可以随意的修改此内存中的数值。但是此地址是动态的,下次运行游戏时它存放的肯定就不是阳光了,我们要继续查找不会变的静态地址,看下一步。
在此地址上点右键->查找写入该地址的代码,会看到一个对话框“下列代码更改选择的地址”,里面是空白的;切换回游戏,随便种一棵植物(目的是让阳光变少,好找出哪些代码修改了此内存)﹔再回到CE,会看到刚才的空白对话框中已经有内容了,双击或点“更多信息”出现下图内容:
记住EDI 的值“2E1F5370“,下一步将上面的搜索框前的16进制勾选上一>将EDI的值填进去一>首次扫描,如下图所示:
搜索出一堆地址,搜索了几次都发现有这个值“025DAD28”,将上一步搜索出的值添加到地址列表一>右键一>查找所有访问此地址的代码,稍等一下就出一大堆代码出来了,如下图:
双击第一个 mov指令查看更多信息,如下图:
原来ESI 的值是EDI+868得来的,EDI的值是2E1F5370,我们继续搜索025DA4C0,如下图:
查找到了绿色内存地址,绿色内存地址表明该地址在游戏中是静态的,它就是我们要找的基址了。下面我们试着把这些内存地址连接起来,如下图,手动填加地址进行测试:
成功找到游戏的阳光基址
2.1.3 分析阳光内存的工作
2.1.4 分析阳光值功能实现的设计算法
#include
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;
}
2.1.5 阳光所用内存和数据分布
HWND的hWnd = FindWindowEx(NULL,NULL,“XXXX”,“XXXX”);/ /这里是游戏过程中,窗口的名称和窗口类名。
PVOID PADDR =(PVOID)0x43158F“;
DWORD dwProcessId和= 0;
GetWindowThreadProcessId(HWND,dwProcessId和);
操作的hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION,FALSE,dwProcessId和) / /适当的权限来打开游戏过程中得到处理。
和DWORD dwWritten = 0;
BYTE bCode =的0xe5;
的hProcess,PADDR,bCode,大小(bCode),与dwWritten WriteProcessMemory();
CloseHandle的(的hProcess);
2.2 针对植物
2.2.1 植物的内存地址
假设植物拿起时(暗色)为0,放下时(亮色)为1,通过不断拿起放下进行01扫描,找到植物的伪地址。
2.2.2 植物的内存基址
1.打开游戏(此时游戏内有三个或三个以上的植物),在CE中选择“未知的初始值”,点击“首次扫描”。
2.然后在游戏中点击某一植物,但不种下;随后在CE中选择“变动的数值”,点击“再次扫描”。
扫描结果如下:
3.不对植物进行操作,选择“未变动的数值”,点击“再次扫描”,反复进行该项操作直到发现点击“豌豆射手”后,有的值变为0,点击“向日葵”,值变为1,点击“樱桃炸弹”,值变为2。将找到的两个地址其中之一添加到下方。
4.点击地址,右键选择“找出是什么访问了这个地址”,随机点击某一植物,出现指令。
5.双击代码,显示详细信息,可以看到一级指针的偏移量为24。
6.在CE中勾选16进制,输入167410A0新扫描。然后把新地址16709430添加到地址栏,在地址上右键选择“找出是什么访问了这个地址”。
查看详细信息,可以看到二级偏移量为138
7.再搜索167092F8得到026BA368,在地址026BA368上右键选择“查看是什么访问了这个地址”
双击查看详细信息,可以看到三级指针偏移量为768
8.再搜索02819EB8看到绿色的基址
9.最后添加指针,点击“手动添加地址”点击指针,点击三次“添加偏移”,输入基址和偏移后点击“确定”。
2.2.3 代码工作过程
刚刚搜索到的第一个卡槽的内存地址 我们显示反汇编程序。
发现通过一些add和mov指令进行植物cd的冷却改变,我们改为nop,发现植物是始终冷却好的。
3.3 针对金币
3.3.1 金币的内存地址
金币的数值进行了加密,当前数值=金币数/10,然后我们用精确搜索即可,如下图:
在击败僵尸时,有时会掉落金币,金币数目增加到414,再次扫描
也可以通过先扫描未知的初始值再改变金币数值,扫描变动的数值,也可以根据金币的变化,选择增大或者是减小的数值,金币数不变时也可以通过未变动的数值进行扫描,最后得到金币的内存地址。
3.4 针对僵尸
3.4.1 僵尸数量的存放地址
通过扫描精确的数值找出僵尸数量的存放地址,并找出其基地址和指针。
3.4.2 僵尸血量分析
首先我们让僵尸被打一次,扫描一次减少的数值
找到访问之后,
进行再次查询
3.5 关卡跳跃
首先进行精确值扫描“1”,然后通关第一关后,在第二关开始时扫描“2”,然后再通关第二关后,第三关开始时扫描“3”,就可以找出关卡的数据内存地址。找到后可进行跳关操作。
三、心得与体会
信息安全的核心思想之一就是软件逆向,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,通过完成本次实验,利用ce对植物大战僵尸中的各种参数进行修改,对ce的使用有了更深刻的了解,对逆向思维的思考方式有了更加深刻的认识,受益匪浅。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!