您好,欢迎访问三七文档
1制作“植物大战僵尸”无限阳光修改器1010270主讲:姜学锋,计算机学院2IE课程设计计划3IE课程设计计划►此修改器的目的是要实现修改阳光值(如上图中的数值:1950),因此要找出游戏中存放“阳光”的内存地址,然后使用API函数WriteProcessMemory进行内存修改,但是每次运行游戏时这个内存地址都会不一样,所以要找出基址。►使用的工具是CheatEngine5.4简体中文版(以下简称CE)4IE课程设计计划►步骤如下:►1、打开游戏并运行在窗口模式,再打开CE,点击左上角电脑图标-选中进程-确定,如下图:5IE课程设计计划►2、在数值框中输入当前阳光数50,点击首次扫描;►切换到游戏中种一棵向日葵,使阳光数变成0;►再切换回CE,在数值框中输入0,点击再次扫描;6IE课程设计计划7IE课程设计计划►3、双击此地址添加到下方的地址列表中,在列表中双击“数值”下面对应的内容可以修改此内存值;►我们将值改成1000试试看,如下图:8IE课程设计计划9IE课程设计计划►再看看游戏中的值,修改成功了,如下图:10IE课程设计计划►如上图所示,内存地址“0CD29FB8”就是存放阳光的地址,我们可以随意的修改此内存中的数值。►但是此地址是动态的,下次运行游戏时它存放的肯定就不是阳光了,我们要继续查找不会变的静态地址,看下一步。11IE课程设计计划►4、在此地址上点右键-查找写入该地址的代码,会看到一个对话框“下列代码更改选择的地址”,里面是空白的;►切换回游戏,随便种一棵植物(目的是让阳光变少,好找出哪些代码修改了此内存);再回到CE,会看到刚才的空白对话框中已经有内容了,双击或点“更多信息”出现下图内容:12IE课程设计计划13IE课程设计计划►注意看红色汇编代码:mov是传送指令,把esi的值传送到EDI+5560,ESI的值是16进制的320,等于10进制的800,恰好就是阳光值,而EDI指向的地址0CD24A58偏移加5560刚好等于0CD9FB8,此地址保存着当前阳光值,很显然这就是改变内存的赋值代码了,红色代码上面那行,很显然就是减法运算。►记住EDI的值“0CD24A58“,下一步14IE课程设计计划►5、将上面的搜索框前的16进制勾选上—将EDI的值填进去—首次扫描,如下图所示:15IE课程设计计划►6、将上一步搜索出的值添加到地址列表—右键—查找所有访问此地址的代码,稍等一下就出一大堆代码出来了,如下图:16IE课程设计计划►双击第一个mov指令查看更多信息,如下图:17IE课程设计计划►原来ESI的值是EDI+768得来的,EDI的值是010D7D78,我们继续搜索010D7D78,如下图:18IE课程设计计划►查找到了绿色内存地址,绿色内存地址表明该地址在游戏中是静态的,它就是我们要找的基址了。►7、下面我们试着把这些内存地址连接起来,内存地址006a9ec0(值为010D7D78)+偏移768=010D84E0,地址010D84E0(值为0CD24A58)+偏移5560=0CD9FB8(此地址就是我们第二步搜索出来的阳光地址)。►好了,我们用CE测试一下是否正确,如下图,手动填加地址进行测试:19IE课程设计计划20IE课程设计计划►结果完全正确,最终地址指向的内存值为800,继续下一步。►8、有了内存基址,现在我们就可以写程序了,相对于找基址,写代码就简单得多。核心代码如下:HWNDhWnd=::FindWindow(NULL,植物大战僵尸中文版);//查找窗口句柄if(hWnd==0)return;HANDLEhProc;DWORDproID;GetWindowThreadProcessId(hWnd,&proID);//取得进程IDhProc=OpenProcess(PROCESS_ALL_ACCESS,false,proID);//打开进程21IE课程设计计划if(hProc==NULL){//m_sunny=(int)hWnd;//UpdateData(false);//MessageBox(cannotopenprocess!);return;}DWORDads_ps=0x006a9ec0;//读取内存地址DWORDvalue;ReadProcessMemory(hProc,(void*)ads_ps,&value,4,NULL);ads_ps=value+0x768;ReadProcessMemory(hProc,(void*)ads_ps,&value,4,NULL);22IE课程设计计划ads_ps=value+0x5560;UpdateData();value=m_sunny;//阳光值WriteProcessMemory(hProc,(void*)ads_ps,&value,4,NULL);//写内存CloseHandle(hProc);23IE课程设计计划►最终做出来的程序运行界面如下图所示:24IE课程设计计划►刚开始只做了修改及锁定,但后面觉得这样太麻烦,干脆就做了“安放植物不减阳光,反而获得阳光的功能”,这个功能更有意思,这个功能实现起来更简单,还记得第4步的sub减法指令吗?只要将sub改成add就行了。►当然写到我们的程序中是要用16进制的,这个16进制的获得也在CE中获得,如下图:25IE课程设计计划26IE课程设计计划►仔细看了,subesi,ebx对应的16进制代码为2bf3,改成addesi,ebx后代码为01de,大家可以自己改改看了。►不过在我们的程序要修改其它程序的代码是要有权限才行的,直接拿上面的代码来用是行不通的,在上面代码基础上加了个函数vrtualProtectEx27IE课程设计计划►代码如下:DWORDads_ps=0x0041ba74;//程序内存地址WORDvalue;value=0xde01;VirtualProtectEx(hProc,(void*)ads_ps,2,PAGE_READWRITE,&oldFlag);WriteProcessMemory(hProc,(void*)ads_ps,&value,2,NULL);VirtualProtectEx(hProc,(void*)ads_ps,2,oldFlag,&oldFlag);CloseHandle(hProc);28结束
本文标题:植物大战僵尸程序
链接地址:https://www.777doc.com/doc-5211530 .html