制作游戏修改器,应该有很多人对这类内容感兴趣吧。

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

此修改器的目的是要实现修改阳光值(如上图中的数值: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、有了内存基址,现在我们就可以写程序了,相对于找基址,写代码就简单得多。
核心代码如下:

主要代码

HWND hWnd = ::FindWindow(NULL,"植物大战僵尸中文版"); //查找窗口句柄
if(hWnd == 0) return;
HANDLE hProc;
DWORD proID;
GetWindowThreadProcessId(hWnd,&proID); //取得进程ID
hProc=OpenProcess(PROCESS_ALL_ACCESS, false,proID); //打开进程
if(hProc==NULL)
{
//m_sunny = (int)hWnd;
//UpdateData(false);
//MessageBox("cannot open process!");
return;
}

DWORD ads_ps=0x006a9ec0; //读取内存地址
DWORD value;
ReadProcessMemory(hProc,(void *)ads_ps,&value,4,NULL);
ads_ps = value + 0x768;
ReadProcessMemory(hProc,(void *)ads_ps,&value,4,NULL);
ads_ps = value + 0x5560;
UpdateData();
value = m_sunny; //阳光值
WriteProcessMemory(hProc,(void *)ads_ps,&value,4,NULL); //写内存
CloseHandle(hProc);

的VC和汇编都是刚学的,以上读取指针的代码我自己看了都觉得怪怪的,呵呵。将就用着先吧。
最终做出来的程序运行界面如下图所示:

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


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

代码

DWORD ads_ps=0x0041ba74; //程序内存地址
WORD value;
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);

好了,一个简单的游戏修改器制作完成,我用同样的方法也做了红色警戒2的修改器(点击查看),期间碰到一个问题,就是无法用SPY获取游戏的窗口句柄,因为红警是全屏运行了,后来我瞎猜了一个 “Red Alert 2”,竞然成功了,呵呵。还请哪位高手指点一二,如何获取全屏程序的句柄,或者进程ID。

源码及程序下载:
源码  (VC6代码,哪位朋友有空转成C#后,和我打个招呼,我好做个链接)
exe程序

转载于:https://www.cnblogs.com/gxlxzys/archive/2009/12/06/1618025.html

以休闲游戏“植物大战僵尸”为例,制作无限阳光修改器。相关推荐

  1. 以休闲游戏“植物大战僵尸”为例,制作无限阳光修改器

    制作游戏修改器,应该有很多人对这类内容感兴趣吧. 发现这个游戏纯属巧合,一日我在百度搜索"植物"这个词时,搜索框下方就列出一大堆"植物大战僵尸"的相关内容,于时 ...

  2. PC休闲游戏~植物大战僵尸-植物连连看v1.0正式发布啦(更新iPhone版本)!

    11.29: 又稍微花了一些时间制作了HD的iPad版本,不过提交app store审核失败了,侥幸看来真的只有一次啊 -增加计分(done) -增加关卡选择(done) 6.14: 看到卖的很悲惨, ...

  3. 植物大战僵尸(1):实现无限阳光

    从本节课开始我们将进入实战环节,我们将手动分析植物大战僵尸的一些功能的实现并编写辅助,并根据章节的深入一步一步的完善我们的辅助,为啥这里使用植物大战僵尸呢?本来想使用网络游戏的,但涉及到驱动过保护和版 ...

  4. 植物大战僵尸——纯C实现无限阳光

    大致思路: 1.获取游戏窗口,使用FindWindow函数 2.获取游戏PID(ProcessID),使用GetWindowThreadProcessId函数 3.获取游戏进程句柄,使用OpenPro ...

  5. 经典而又耐玩的游戏——植物大战僵尸 绿色中文版(免安装)

    经典而又耐玩的游戏--植物大战僵尸 绿色中文版(免安装) 今天Yongd推荐大家一款超经典而又耐玩的游戏--植物大战僵,网络上对这个游戏的介绍和玩法早已是铺天盖地,而偶写这边文章的目的是把这款游戏介绍 ...

  6. python植物大战僵尸代码例_用Python实现植物大战僵尸游戏,很酷

    以前很火的植物大战僵尸游戏, 本想在网上找个python版本游戏学习下,无奈没有发现比较完整的,那就自己来写一个把.图片资源是从github上下载的,因为图片资源有限,只能实现几种植物和僵尸. 功能实 ...

  7. Android版本自带游戏,植物大战僵尸自带花园版

    植物大战僵尸自带花园版是一款经典射击休闲类手机游戏,植物大战僵尸保持原版玩法的基础上进行创新和升级,玩家可重温经典植物大战僵尸玩法,游戏极其考验玩家的策略和智慧,打败不断来犯的僵尸,体验游戏带来的无限 ...

  8. C/C++编程笔记:经典游戏植物大战僵尸游戏辅助,源码送上

    从前一直迷恋植物大战僵尸这款游戏,从一开始的水平不行,到后来经常看植物大战僵尸的过关视频来提升自己的游戏水平,到现在游戏是玩的越来越好了,后来为了让游戏通关更快,就写了一个简单的修改阳光和种植植物后免 ...

  9. 远程代码注入及DLL注入教程(InlineHook)---植物大战僵尸为例

    远程代码注入及DLL注入教程 说明 ​ 本人刚开始学习逆向,不知道有没有动力学下深去,这一块也没有详细的实战教学,学多少就上传多少,希望能给想学的朋友一点帮助吧,本教程想通过植物大战僵尸这一经典游戏来 ...

  10. 植物大战僵尸(2):实现自动收集阳光

    1.首先我们找出阳光的动态地址,找到之后我们双击这个地址,将其加入到地址列表中,阳光的查找技巧相信你已经能够掌握了,这里就不再罗嗦了. 2.接着我们选择最下方的地址列表,然后按下[F6键],也就是下一 ...

最新文章

  1. Other Linker Flags参数 -ObjC、-all_load和-force_load
  2. 《Hadoop集群与安全》一2.1 在Hadoop集群中配置操作系统
  3. php 处理raw数据,php以raw格式传递数据
  4. [转]Windows的批处理脚本
  5. kk 服务器信息,手机kk服务器设置
  6. 设计一个具有等待队列的连接池
  7. Web Service和Servlet的区别
  8. 电脑显示链接网络正常但是不能上网,用某些软件会提示系统丢失libeay32.dll
  9. 20 SD配置-主数据-定义客户账户组
  10. 【英语学习】【Daily English】U09 Fashion L03 You're my fashion icon
  11. 用计算机名怎么共享电视盒,机顶盒怎么通过电脑实现局域网共享
  12. [转]Android限制只能在主线程中进行UI访问的实现原理
  13. 【转】Delphi实现自动发贴和识别验证码 王泽宾
  14. 机器视觉技术在薄膜检测系统的应用
  15. Adobe下周将推新补丁和新的更新模式
  16. Atitit Server Side Include  ssi服务端包含规范 csi  esi
  17. 评分卡模型构建(含泪总结精华!!)
  18. 《从0到1上线微信小游戏》第九节 个人申请国家软件著作证书详细流程
  19. Latex如何设置超链接的字体颜色?如何更改颜色?
  20. linux模拟树莓派,使用QEMU模拟树莓派Raspberry Pi

热门文章

  1. 第三阶段应用层——1.7 数码相册—电子书(3)—轮询方式支持多输入
  2. Linux文件其他操作
  3. MATLAB-蒙特卡罗方法
  4. 将全部视频画面水平或者垂直翻转的实例教程分享
  5. 计算机电源16脚芯片,康舒AP16PCO5 ATX电源电路原理与维修(二)
  6. Python编程基础 第五章 编程练习 编写程序实现以下功能:根据指定值从一个列表中查找所有匹配元素的位置,要求使用列表中的index方法进行查找。
  7. bootloader recovery
  8. GPU设备架构全面解析(持续更新ing)
  9. 数字电路设计: FPGA实现倍频
  10. vue js 前端实现PDF文件下载的三种方式 解决vue下载pdf文件打开文件后空白