我爱秘籍论坛

 找回密码
 加入论坛

QQ登录

只需一步,快速开始

扫一扫,访问微社区

CE:最优秀的游戏修改工具入门:修改器制作傻瓜教程说说:你最想要找的修改器以前游戏玩我们,现在我们玩游戏
进阶:游戏修改视频教程导航必备:超2400款游戏秘籍下载:超5000款游戏修改器必读:论坛金币获得方法
查看: 1120152|回复: 278

[转载] 以休闲游戏“植物大战僵尸”为例,制作无限阳光修改器。

  [复制链接]
发表于 2010-1-30 14:57:19 | 显示全部楼层 |阅读模式
转载自:http://www.cnblogs.com/gxlxzys/archive/2009/12/06/1618025.html

制作游戏修改器,应该有很多人对这类内容感兴趣吧。
发现这个游戏纯属巧合,一日我在百度搜索“植物”这个词时,搜索框下方就列出一大堆“植物大战僵尸”的相关内容,于时就下载来玩了一下,挺有意思的,玩到最后就有了修改的念头,本人对于游戏的态度是:能改则改,现实生活中我是穷人,在游戏中至少也要变富人吧。费话不说了,准备开始,先看一下游戏截图,好让大家有一些总体认识,

此修改器的目的是要实现修改阳光值(如上图中的数值:1950),因此要找出游戏中存放“阳光”的内存地址,然后使用API函数WriteProcessMemory进行内存修改,但是每次运行游戏时这个内存地址都会不一样,所以要找出基址,我使用的工具是Cheat Engine 5.4简体中文版(以下简称CE),步骤如下:
1、打开游戏并运行在窗口模式,再打开CE,点击左上角电脑图标->选中进程->确定,如下图:

2、在数值框中输入当前阳光数50,点击首次扫描;
切换到游戏中种一棵向日葵,使阳光数变成0;
再切换回CE,在数值框中输入0,点击再次扫描;
将会搜索到一个结果,如下图所示:

3、双击此地址添加到下方的地址列表中,在列表中双击“数值”下面对应的内容可以修改此内存值;
我们将值改成1000试试看,如下图:

再看看游戏中的值,修改成功了,如下图:

如上图所示,内存地址“0CD29FB8”就是存放阳光的地址,我们可以随意的修改此内存中的数值,比金山游侠还要好用。
但是此地址是动态的,下次运行游戏时它存放的肯定就不是阳光了,我们要继续查找不会变的静态地址,看下一步。
4、在此地址上点右键->查找写入该地址的代码,会看到一个对话框“下列代码更改选择的地址”,里面是空白的;
切换回游戏,随便种一棵植物(目的是让阳光变少,好找出哪些代码修改了此内存);再回到CE,会看到刚才的空白对话框中已经有内容了,双击或点“更多信息”出现下图内容:

注意看红色汇编代码 :mov 是传送指令,把esi的值传送到EDI+5560,ESI的值是16进制的320,等于10进制的800,恰好就是阳光值,而EDI指向的地址0CD24A58偏移加5560刚好等于0CD9FB8,此地址保存着当前阳光值,很显然这就是改变内存的赋值代码了,红色代码上面那行,很显然就是减法运算。
记住EDI的值“0CD24A58“,下一步
5、将上面的搜索框前的16进制勾选上—>将EDI的值填进去—>首次扫描,如下图所示:

搜索出一堆地址,刚开始时我也是毫无头绪,搜索了几次都发现有这个值“010D84E0”,以为这个就是基址了,其实不是的,但这个值是怎么来的呢?我们继续下一步。
6、将上一步搜索出的值添加到地址列表—>右键—>查找所有访问此地址的代码,稍等一下就出一大堆代码出来了,如下图:

双击第一个mov 指令查看更多信息,如下图:

原来ESI的值是EDI+768得来的,EDI的值是010D7D78,我们继续搜索010D7D78,如下图:

大功告成,查找到了绿色内存地址,绿色内存地址表明该地址在游戏中是静态的,它就是我们要找的基址了。
7、下面我们试着把这些内存地址连接起来,内存地址006a9ec0(值为010D7D78)+偏移 768 = 010D84E0,地址010D84E0(值为0CD24A58)+偏移5560=0CD9FB8(此地址就是我们第二步搜索出来的阳光地址)。
好了,我们用CE测试一下是否正确,如下图,手动填加地址进行测试:

结果完全正确,最终地址指向的内存值为800,继续下一步。
8、有了内存基址,现在我们就可以写程序了,相对于找基址,写代码就简单得多。
核心代码如下:
  1. HWND hWnd = ::FindWindow(NULL,"植物大战僵尸中文版");  //查找窗口句柄
  2.         if(hWnd == 0) return;
  3.         HANDLE hProc;
  4.         DWORD proID;
  5.         GetWindowThreadProcessId(hWnd,&proID);  //取得进程ID
  6.         hProc=OpenProcess(PROCESS_ALL_ACCESS, false,proID);  //打开进程
  7.         if(hProc==NULL)
  8.         {
  9.             //m_sunny = (int)hWnd;
  10.             //UpdateData(false);
  11.             //MessageBox("cannot open process!");
  12.             return;
  13.         }
  14.         
  15.         DWORD ads_ps=0x006a9ec0; //读取内存地址
  16.         DWORD value;               
  17.         ReadProcessMemory(hProc,(void *)ads_ps,&value,4,NULL);
  18.         ads_ps = value + 0x768;
  19.         ReadProcessMemory(hProc,(void *)ads_ps,&value,4,NULL);
  20.         ads_ps = value + 0x5560;
  21.         UpdateData();
  22.         value = m_sunny; //阳光值
  23.         WriteProcessMemory(hProc,(void *)ads_ps,&value,4,NULL);    //写内存
  24.         CloseHandle(hProc);   
复制代码
的VC和汇编都是刚学的,以上读取指针的代码我自己看了都觉得怪怪的,呵呵。将就用着先吧。
最终做出来的程序运行界面如下图所示:

后记:
刚开始我只做了修改及锁定,但后面觉得这样太麻烦,干脆就做了“安放植物不减阳光,反而获得阳光的功能”,个人感觉这个功能更有意思,这个功能实现起来更简单,还记得第4步的sub 减法指令吗?只要将 sub 改成 add就行了,呵呵。
当然写到我们的程序中是要用16进制的,这个16进制的获得也在CE中获得,如下图:


仔细看了,sub esi,ebx 对应的16进制代码为 2b f3 ,我改成add esi,ebx 后代码为01 de,大家可以自己改改看了。
不过在我们的程序要修改其它程序的代码是要有权限才行的,直接拿上面的代码来用是行不通的,我在上面代码基础上加了个函数vrtualProtectEx,代码如下:

  1. DWORD ads_ps=0x0041ba74; //程序内存地址
  2.         WORD value;
  3.         value = 0xde01;
  4.         VirtualProtectEx(hProc,(void *)ads_ps,2,PAGE_READWRITE,&oldFlag);
  5.         WriteProcessMemory(hProc,(void *)ads_ps,&value,2,NULL);
  6.         VirtualProtectEx(hProc,(void *)ads_ps,2,oldFlag,&oldFlag);
  7.         CloseHandle(hProc);   
复制代码

好了,一个简单的游戏修改器制作完成,我用同样的方法也做了红色警戒2的修改器(点击查看),期间碰到一个问题,就是无法用SPY获取游戏的窗口句柄,因为红警是全屏运行了,后来我瞎猜了一个 “Red Alert 2”,竞然成功了,呵呵。还请哪位高手指点一二,如何获取全屏程序的句柄,或者进程ID。
源码及程序下载:
源码  (VC6代码,哪位朋友有空转成C#后,和我打个招呼,我好做个链接)
exe程序
发表于 2013-6-13 22:27:26 来自手机 | 显示全部楼层
我拿网游做实验会不会太天真了?

点评

文章转载:http://m.wjhlw.net/book/2221763/ 在剑三世界做大侠手机版 http://www.wjhlw.net/book/2221763/ 在剑三世界做大侠 http://www.yprzw.cc/book/91150/ 擎天一棍  发表于 2016-10-19 06:27
回复 支持 1 反对 0

使用道具 举报

发表于 2015-9-3 21:45:15 | 显示全部楼层

好帖
很好帖
确实好帖
少见的好帖
不得了的好帖
难得一见的好帖
千年等一回的好帖
好得不能再好的好帖
惊天地且泣鬼神的好帖
让人阅毕击掌三叹的好帖
让人佩服得五体投地的好帖
让人奔走相告曰须阅读的好帖

点评

文章转载:http://m.wjhlw.net/book/2225434/ 元域镇妖师手机版 http://www.wjhlw.net/book/2225434/ 元域镇妖师 http://www.yprzw.cc/book/77805/ 剑道圣仙  发表于 2016-10-19 06:34
回复 支持 反对

使用道具 举报

发表于 2014-2-12 22:27:11 | 显示全部楼层
好帖
很好帖
确实好帖
少见的好帖
不得了的好帖
难得一见的好帖
千年等一回的好帖
好得不能再好的好帖
惊天地且泣鬼神的好帖
让人阅毕击掌三叹的好帖
让人佩服得五体投地的好帖
让人奔走相告曰须阅读的好帖

评分

参与人数 1金币 -1 收起 理由
重重过客 -1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2010-4-29 11:54:53 | 显示全部楼层
秘大,请问这种情况 CE.jpg 是什么意思?
 楼主| 发表于 2010-4-29 11:58:01 | 显示全部楼层
秘大,请问这种情况是什么意思?
2118cc 发表于 2010-4-29 11:54


只能开一个“查找写入该地址的代码” 窗口,把那个窗口关闭就行了。
发表于 2010-4-29 11:59:35 | 显示全部楼层
栋腰01 。请回答,
 楼主| 发表于 2010-4-29 12:02:38 | 显示全部楼层
有个窗口被隐藏了,找出来 关闭就行了
发表于 2010-4-29 12:04:28 | 显示全部楼层
我太笨,真想秘大能手把手教啊
发表于 2010-4-29 12:07:22 | 显示全部楼层
先做教程吧
教程做完就差不多会简单的了
发表于 2010-5-30 19:42:27 | 显示全部楼层
我发现  我不会写程序
发表于 2010-6-20 16:53:32 | 显示全部楼层
我和6楼一样......到快完成的时候出现情况,以为我操作错误......所以就......
发表于 2010-6-21 10:00:42 | 显示全部楼层
请教大大!
怎样找重叠种植植物的基址!请
发表于 2010-6-21 19:53:29 | 显示全部楼层
学习~~~
发表于 2010-6-24 18:22:28 | 显示全部楼层
观摩观摩
发表于 2010-6-27 15:46:53 | 显示全部楼层
好东西啊
发表于 2010-6-27 15:53:29 | 显示全部楼层
查窗口的全屏程序的句柄,或者進程ID
用GM8 就能看到了!!
发表于 2010-6-29 21:57:06 | 显示全部楼层
你太牛了
发表于 2010-6-29 21:57:35 | 显示全部楼层
厉害厉害呀    多弄点这样的帖子
发表于 2010-7-26 17:36:14 | 显示全部楼层
呵呵        好
发表于 2010-7-27 12:19:13 | 显示全部楼层
好好好的。
发表于 2010-7-28 13:58:58 | 显示全部楼层
顶顶……
发表于 2010-8-7 11:26:49 | 显示全部楼层
出视频  出视频  教材啊        看疯了           晕啊                              
您需要登录后才可以回帖 登录 | 加入论坛

本版积分规则

QQ|Archiver|手机版|小黑屋|我爱秘籍论坛  

GMT+8, 2019-3-21 00:10 , Processed in 0.175144 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表