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

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

此修改器的目的是要实现修改阳光值(如上图中的数值: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程序

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 【机器视觉案例】(5) AI视觉,手势调节物体尺寸,附python完整代码
  2. 基于OHCI的USB主机 —— OHCI(设计思路)
  3. dev gridcontrol设置过滤器下拉列表
  4. Consider static factory methods instead of constructor
  5. 数据结构题:根据所给权值设计相应的哈夫曼树,并设计哈夫曼编码
  6. 编码的喜悦……以及Java中的变异测试
  7. Vue「二」—— vue 基本使用 、vue 指令 、vue 过滤器
  8. 按键精灵打卡怎么写_[按键精灵教程]过新手引导的各种姿势
  9. sklearn.metrics.roc_curve使用说明
  10. echarts同时带有颜色和光圈的中国地图
  11. Linux环境运行jmeter+测试报告查看
  12. android多媒体框架介绍(一)整体架构
  13. 新变局、新机遇,新发展 新华锦受邀参加2020中欧企业家峰会青岛论坛
  14. 05 Python基础
  15. DeFi 2.0的LaaS协议,重振DeFi赛道发展的关键
  16. 2022年迎接“金三银四”,为什么面试你总拿不到高薪?你所不知道的面试技巧
  17. python中的函数不包括参数函数_在Python中定义函数时不需要声明函数参数的类型。...
  18. 详解pytorch动态量化
  19. 微软拼音输入法卸载相关
  20. jQuery---仿芒果网机票预定智能输入提示

热门文章

  1. 鲁南经济圈推动绿色建材高质量发展技术交流会在临沂召开
  2. python怎么实现直播_python+django 聚合直播平台
  3. 什么是营业利润率%?
  4. H3DNet论文阅读笔记
  5. eNodeB 伪基站辨识与优化
  6. 中国式自动驾驶攻坚战:冷静的车,热闹的路
  7. 红米K50 Pro上手体验
  8. Oracle学习1.0
  9. Glide 加载圆角、圆形图片
  10. 泰坦尼克号船员获救数据分析