植物大战僵尸数据修改器

  • 前言
  • 知识点
    • 关于spy++的使用
    • 关于windows错误的获取和查询
    • 对于基地址的获取方法和计算步骤
  • 示例代码
    • 效果图
  • 总结

前言

你好! 这是本人第一次使用 Markdown编辑器 所展示的欢迎页。接下来我们一起使用Microsoft Visual C++ 6.0编写经典游戏《Plants V.S. Zombies》外挂,实现改变游戏底层数据的功能,功能实现是简单的,但后面带来的收益却是巨大的,希望观者见微知著,不拘于束。本章涉及到的内容如下:

  1. 关于visual自带tools的**spy++**的使用。
  2. 关于Windows错误代码的获取和原因查询。
  3. 对于基地址和偏移量的获取方法和计算过程。

知识点

本项目使用若干知识点,为了方便未来的查询与使用,本人将知识点提出列开。下面对本项目使用到的知识点展开来讲。

关于spy++的使用

spy++作为一款visual studio自带的一款工具,可以非常方便地获取选定窗口的句柄、标题和类名

意义:在本项目中配合windows.h中自带的方法,获取窗口句柄,使程序锁定窗口,准备下一步操作。

使用方法:

  1. 点击tools——>spy++,进入工具窗口
  2. 点击望远镜,拖动finder tool到指定窗口即可

    故此我们便获取到了窗口句柄、标题、类名。为接下来的程序编写准备。

关于windows错误的获取和查询

在程序运行中可能会遇到错误,这时候我们用windows自带的方法GetLastError()即可获取错误代码,将错误代码通过tools中的Error lookup进行原因查找。

例如:

printf("获取一级偏移地址失败,错误代码:%d\n",GetLastError());



这Error lookup只能查找到问题原因,不提供解决办法。

对于基地址的获取方法和计算步骤

以《植物大战僵尸》为例,数据的储存往往是从基地址经历几个偏移量的偏移才得到最终地址。那么如何获取某个数据的基地址呢,一个成熟的程序员要懂得借用已有的工具——Cheat Engine。

  1. 打开运行Cheat Engine,搜索并获得“阳光”的地址(具体方法请百度,本处不再赘述),这时候的地址是多次偏移以后的地址,我们这里称作最终地址,我查出来的地址为233A9848(地址为16进制)。
  2. 获取一级偏移量和地址、获取二级偏移量和地址请直接参考下面地址。(太多太麻烦)
  3. 添加一条说明:基地址的内容是一个静态地址,静态地址+一级偏移量=一级偏移地址;一级偏移地址+二级偏移量=二级偏移地址(到这里就是一开始得到的最终地址)。但是用CE查找的时候是反着找的,先找了最终地址然后找的二级偏移地址,然后是一级,再然后是初地址,初地址存在于绿色的基地址。

注意:不同版本的同款游戏,基地址和偏移量都可能有所不同。建议参考下面链接来获取自己的数据。

参考来自:https://www.cnblogs.com/gd-luojialin/p/7789569.html
推荐视频:http://www.iqiyi.com/w_19rt636lht.html?fromvsogou=1

示例代码

#include<stdio.h>
#include<Windows.h>
#include<String.h>int main()
{//1.运行游戏,通过spy++获取窗口信息HWND hGameWnd = FindWindow("MainWindow","Plants vs. Zombies 1.2.0.1073 RELEASE");if(hGameWnd == NULL){printf("没有运行游戏");getchar(); return 0;}//2.根据窗口句柄获取进程PID,Process IDDWORD dwPID = 0;GetWindowThreadProcessId(hGameWnd,&dwPID);if(dwPID == 0){printf("获取进程PID失败,错误代码:%d\n",GetLastError());return 0;}//3.根据PID获取进程句柄HANDLE hProcess =  OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID);if (hProcess == NULL){printf("打开进程失败,错误代码:%d\n",GetLastError());return 0;}//4.从指定的进程内存区域去读取数据DWORD dwSunshineBaseAddress = 0x7578F8;DWORD dwSunshineAddressValue = 0;DWORD dwSize = 0;if(FALSE == ReadProcessMemory(hProcess,                      //哪一个进程(LPVOID)dwSunshineBaseAddress, //要读取的进程(基地址)&dwSunshineAddressValue,       //接收进程数据sizeof(DWORD),                 //要修改的字节数&dwSize                        //实际修改的字节数)){printf("获取静态地址失败,错误代码:%d\n",GetLastError());return 0;}else printf("静态地址为:%x\n",dwSunshineAddressValue);//静态地址(16进制)//5.获取一级偏移地址DWORD dwSunshineOffsetFirst = 0x868;//一级偏移量DWORD dwSunshineOffsetValue = 0;                  //一级偏移地址的容器if(FALSE == ReadProcessMemory(hProcess,             (LPVOID)(dwSunshineOffsetFirst+dwSunshineAddressValue),//一级偏移地址的计算&dwSunshineOffsetValue,//一级偏移地址的赋值sizeof(DWORD),&dwSize)){printf("获取一级偏移地址失败,错误代码:%d\n",GetLastError());return 0;}else printf("一级偏移地址:%x\n",dwSunshineOffsetValue);//一级偏移地址(16进制)//6.获取二级偏移地址DWORD dwSunshineOffsetSecond = 0x5578;           //二级偏移量DWORD dwSunshine = 0;                            //二级级偏移地址(最终地址)的容器if(FALSE == ReadProcessMemory(hProcess,              (LPVOID)(dwSunshineOffsetSecond+dwSunshineOffsetValue),//二级偏移地址的计算&dwSunshine,sizeof(DWORD),&dwSize)){printf("获取二级偏移地址失败,错误代码:%d\n",GetLastError());return 0;}else printf("二级偏移地址:%x\n",dwSunshine);//二级偏移地址(16进制)printf("阳光值为%d",dwSunshine);int NowSunshine=0;        //想得到的阳光值printf("请输入想要修改的阳光值:");scanf("%d",&NowSunshine);//修改阳光值WriteProcessMemory(hProcess,             (LPVOID)(dwSunshineOffsetSecond+dwSunshineOffsetValue),&NowSunshine,sizeof(DWORD),&dwSize);return 0;
}

效果图


总结

在《Plants V.S. Zombies》中,可以通过修改基地址和两个偏移量来实现 金币数、阳光数的修改,还可以修改本游戏的其他基础数据,也能修改其他单机游戏的数据。此方法适合运用在公司或学校这类统一性比较强的地方,相比于每次打开CE修改数据,此方法操作更加方便简单,传播更加便捷。玩过的都说好

基于visual的单机游戏外挂相关推荐

  1. [转载]游戏外挂原理

    最近同学在折腾外挂 我也就把这篇发上来吧 以前的文章了 也不知道那里来的了..... 1.游戏外挂的原理 外挂现在分为好多种,比如模拟键盘的,鼠标的,修改数据包的,还有修改本地内存的,但好像没有修改服 ...

  2. 游戏外挂设计终极教程2

    五.封包技术 通过对动作模拟技术的介绍,我们对游戏外挂有了一定程度上的认识,也学会了使用动作模拟技术来实现简单的动作模拟型游戏外挂的制作.这种动作模拟型游戏外挂有一定的局限性,它仅仅只能解决使用计算机 ...

  3. DNF 单机游戏 手机游戏 网络游戏 推荐游戏 TXT 小说 外挂 辅助

    DNF  单机游戏 手机游戏 网络游戏 推荐游戏 TXT 小说 外挂 辅助 PS: 纯粹拉流量用的.勿喷!

  4. 编写贩卖《和平精英》游戏外挂,5人被判刑;苹果推出轻App码;Firefox 84.0发布|极客头条...

    整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「 ...

  5. 【游戏外挂、修改器、辅助研究1】认识外挂

    1.什么是游戏外挂 随着电子游戏的兴起,许多人都在以游戏娱乐, 自然,有人的地方就有需求,就有竞争, 人们竞争着等级.排名.装备.物品等等, 可是,要怎么获得这些东西呢? 自然是刷怪,无穷无尽地刷怪, ...

  6. 极客日报第 31 期:编写贩卖《和平精英》游戏外挂,5人被判刑;苹果推出轻App码

    文章目录 互联网快讯 程序员专属 Github 每日精选 CSDN 社区优质博文精选 互联网快讯 1.编写贩卖<和平精英>游戏外挂,湖北襄阳 5 人被判刑 据 "湖北高院&quo ...

  7. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲

    这篇文章里,我们将迈出精通DirectX的第一步,先了解典型Direct3D程序的书写流程,然后学习COM接口的对象的一些思想,然后按照"四步曲"的思路,系统地学习DirectX的 ...

  8. 【Visual C++】游戏开发笔记三十二 浅墨DirectX提高班之一 DirectX大局观认知篇

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:  http://blog.csdn.net/zhmxy555/article/details/8172615 作者:毛星云(浅 ...

  9. 【Visual C++】游戏开发笔记二十五 最简化的DirectX开发环境的配置

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7672101 作者:毛星云    邮箱: h ...

最新文章

  1. 基于线段的激光雷达和单目联合曲面重建​
  2. Expression Blend 4 激活码
  3. python turtle画彩虹-Python利用turtle库绘制彩虹代码示例_天津SEO
  4. FreeSql (二)自动迁移实体
  5. es6 import 命令
  6. SpringMVC实现文件上传
  7. (转)SqlServer基础之(触发器)(清晰易懂)
  8. c#通过RFC调用SAP接口程序之输入输出参数案例
  9. 微软MCITP系列课程(二四)利用组策略部署软件
  10. Labview如何建立与远程MS SQL数据库的连接
  11. 【C语言】入门基础选择题附答案
  12. 优秀的软件测试简历是什么样的?
  13. 免费好用的判定节假日API来了
  14. 硬盘显示驱动器中的光盘未被格式化的解决方法
  15. 计算机组成RAW相关,计算机组成和系统结构习题解答.ppt
  16. ★Kali信息收集~ 5.The Harvester:邮箱挖掘器
  17. android 距离传感器 api,Android传感器API之:近距离感应Proximity功能源码
  18. 9.0 OTA升级logo不更新,输入法不更新
  19. 什么是SOA?为什么要SOA?
  20. 有效解决Ubuntu18.04无法联网问题

热门文章

  1. 可怕 !FaceBook 工程师上班跳楼自杀,北美这是怎么了
  2. echars 饼状图做成水球图
  3. ERP 软件项目验收流程
  4. kali wifi不可用_Kali Linux系统解决无线网卡无驱动问题教程:
  5. 人工智能如何实现两难抉择?
  6. Bug2021.01.07 Unity WebGL包 内网映射外网 图片下载不了
  7. c语言理发店管理系统,理发店如何通过美容美发管理系统处理好顾客预约业务?...
  8. 自考2020计算机科学陕西,2020年4月陕西自考计算机及应用专业计划及课程设置(080702本科)...
  9. 谷歌chrome离线安装包_Google将向手机制造商支付更多费用以立即安装Chrome
  10. 中科金财区块链平台容器化最佳实践