游戏外挂制作原理

外挂现在大体上来讲分为三种,分别是模拟按键,WPE封包和内存挂。比如模拟键盘的,鼠标的,这种就叫做按键模拟,也叫脚本精灵;还有修改数据包的,这种就叫做WPE封包外挂,这种外挂相对而言比较稳定,但是对于技术要求难度也比较高,因为修改WPE封包,你需要知道和了解加密解密算法等等一系列的知识;还有最后一种就是修改本地内存的,这种相对而言比较常见,市场上面比较常见的也是这种游戏外挂,相对而言技术要求也不是太高,资料也比较齐全,比较大众;但好像没有修改服务器内存的哦,呵呵。其实修改服务器也是有办法的,只是技术太高一般人没有办法入手而已。这里就记一下本地修改内存的外挂制作原理。

   其实,制作内存挂也不是很难,步骤就这么几步。第一步,找游戏数据内存地址,偏移地址;第二步,修改内存地址的值,达到外挂的目的;第三步,用编程语言写出一个程序,使得外挂方便于携带传输,同时也方便于下次玩游戏直接使用。其实第三步主要是方便使用,方便贩卖等等,很多时候对于一个高手而言,根本不需要写出来,记录下内存地址,偏移地址以后,下次上游戏直接工具里面修改就是了。但是如果经常玩某个游戏,可以写出来,用不着每次玩游戏都去修改。

外挂开发第一步——找游戏内存地址
说道找游戏内存地址,偏移地址,这可能是整个游戏外挂开发中最难的一步,因为一个大型的网络游戏,可能一个技能或者血条的内存基址可能会偏移很多次,最后才得到一个内存地址也叫物理地址。那么,这里有个问题来了,我们为什么要找技能或者血条的内存基址?不是直接修改物理地址就行了吗?这样是不行的,因为物理地址是会变动的;举个例子,每次关闭游戏重新启动以后,游戏进程是会变动的,同样的,游戏代码在内存中的存放位置,因为游戏结束以后,释放掉了内存地址,这个内存地址可能会被其他程序所占用,所以是会变动的;当你关闭游戏重新进入以后,游戏的技能或者血条在内存中的物理地址就变了。但是,游戏技能或者血条的内存基址是不会变动的,在内存中的物理地址不管怎么变动,内存基址都不会变动。那么内存基址和物理地址之间是一种什么样的关系呢?看下面这个公式:

物理地址 = 一级偏移地址 + 偏移地址
一级偏移地址 = 二级偏移地址 + 偏移地址
二级偏移地址 = 三级偏移地址 + 偏移地址
三级偏移地址 = 游戏技能基址 + 偏移地址
如上公式,一个游戏的物理地址是等于这个游戏的基址加上偏移地址的,所以,想要每次重新进入游戏都能够找到准确的物理地址进行修改内存地址的值,达到外挂的目的的话,就必须找到这个物理地址当前对应的偏移地址和基址,只有这样才能够确保每次登陆游戏都能够修改物理地址的值。下面,就通过《植物大战僵尸》这款经典的单机游戏来演示一下找这款游戏的内存基址的过程。
首先,介绍一款找游戏内存基址的工具Cheat Engine简称CE,Cheat Engine是一款内存修改编辑工具 ,它允许修改游戏或软件内存数据,以得到一些其他功能。它包括16进制编辑,反汇编程序,内存查找工具。与同类修改工具相比,它具有强大的反汇编功能,且自身附带了外挂制作工具,可以用它直接生成外挂。好了,这个工具的具体介绍有兴趣的去百度,这里也就是百度了一下,简单的说了一下这个工具的作用,下面,打开植物大战僵尸,打开CE,在CE中找到植物大战僵尸,附加到CE中去,如图所示:


游戏附加到OD以后,看自己想修改哪儿的内容,就去找对应的内存基址,怎么找呢?比如修改无限阳光吧;首先,看一下最开始的阳光是多少?比如这里,开局阳光是50,就在CE中数值一项输入50,扫描类型选择精确数值在数值类型选择4字节然后点击首次搜索,这里不懂为什么这样选择的,自己百度科普一下基础知识。如图所示:

如上图所示,出来了这么多的地址,究竟哪一个是我们想要的物理地址呢?接下来就需要在游戏中改动一下阳光的值,然后点击再次搜索,结果就会出来了,如图所示:


如上第二幅图所示,我们想要的物理地址就出来了,把这个地址添加到地址列表中去,然后修改一下阳光的值,确认一下是不是想要的地址,不过这里要注意,在修改的时候,我们需要点击列表地址中我们拉下来的这一行的数值这一栏,其他是修改地址和字节类型用的,不要乱动,如图所示:

如上图所示,这就是我们想要的物理地址,这里我们可以锁定这个内存地址的值,一直是100或者200或者更多。只需要点击前面激活这一栏选中就行了,从而达到锁定阳光值的效果。但是当关闭游戏,重新进入,这个地址就没用了,又需要重新找。所以,这里就需要找到真正的阳光值的基址和偏移地址,那么,怎么找呢?我们找到这个物理地址以后,就右键,选择找出是什么改写了这个地址也就是快捷键F6这个名字每个版本的汉化效果都不一样的,这里就会弹出一个窗口,是空白,然后我们再到游戏中改变阳光的值,看看这个空白窗口中出现的代码,如图所示:



如上图三所示,分析这两条代码,看见最终都指向了一个指针数值17C88118,然后我们分析一下这两条代码什么意思,相信稍微懂一点汇编语言的人都能够看懂。首先分析一下mov [edi+00005560],esi这条指令,我们在详细信息中看见,寄存器esi中的代码是000026DE这个值换算成十进制刚好是9950,那么这个9950是怎么来的呢?其实就是刚刚我在做上一步的时候,说了要变动游戏中的阳光值,所以我先直接把阳光值修改成了10000,然后种了一个石头,刚好是50,所以阳光值发生了变化,这条指令mov [edi+00005560],esi就是把寄存器esi的9950的阳光值放入edi+00005560这个地址中去,这个地址是谁呢?其实这个地址就是刚刚找出来的物理地址,刚好满足前面的公式:物理地址 = 阳光基址地址 + 偏移地址不信的朋友可以自己加一下算一算,用寄存器edi里面的指针数值17C88118加上偏移地址00005560看看是不是等于阳光物理地址17C8D678。接下看看add [eax+00005560],ecx这条指令,add指令是相加的意思,前面的mov是赋值或者移动的意思,这条代码的意思就是,把ecx寄存器中的值加入[eax+00005560]这个地址中的值当中去,再看看寄存器eax的地址是多少?刚好又是17C88118这个指针数值,那么,我们就可以确定一个事情,那就是17C88118这个指针数值,肯定是上一级的地址的指针数值,那么上一级要么是基址,要么还是一个不偏移地址,这个需要进一步来确认。怎么确认呢?这里不是出来了17C88118这个指针数值嘛,再次放到CE中搜索一波,看看这个值对应的地址是多少,看看出来的是一个动态地址还是静态地址,这里需要普及一个知识点,在CE中,黑色的地址表示动态地址,绿色的表示静态地址,那好,丢到CE中搜索,这里这个值是十六进制的,所以在搜索的时候,需要勾选搜索框前面的hex,也就是十六进制搜索的意思,这里填好以后点击新的扫描,首次扫描如图所示:

这里可以看见结果为56个地址,这么多,我们怎么来确认究竟是哪个呢?可以看见还有很多红色的地址。其实,这里的红色的地址,是一直在改变的地址,我们不用管它,直接点击再次扫描,把这些红色的过滤掉,然后看看还剩下的地址有哪些,如图所示:
多次点击再次扫描以后发现不管怎么点击都剩下来了52个结果,然后看了一下这些结果中并没有绿色的静态地址,并且其他地址开头几位都比较像,唯独如图所示两个地址比较特殊,这两个可能就是我们需要的地址了,后来我也去百度了一波,结果所说的是这种开头比较像的是数组,也就是说,遇到这种,基本都不是我们需要的地址,直接放弃,把这两个特殊的拉进下边的地址列表,开始分析,双击地址这一栏,在出来的更改地址窗口中复制下这个地址,然后再勾选指针选项,在出来的内容框中填写入刚刚复制的地址,在上面的内容框中写入刚刚找到的00005560这个偏移地址,得到的结果刚好是阳光的物理地址,最后的阳光值也正好和当前的阳光值一样,并且,这两个地址都是一样的,而且都是动态地址,如图所示:

如上图所示,这两个地址加上偏移地址都可以得到阳光物理地址,那么哪个才是我们所需要的真正的一级偏移地址呢?这里就需要我们对这两个地址进行详细的分析了,同样的右键–找出是什么访问了这个地址,也就是快捷键的F5,这里一定不要搞混淆了,前面是找出是什么改写了这个地址,不一样的!我们进去以后也是和前面一样出来一个窗口,但是这两个窗口里面的内容就不一样了,第一个地址0264A400在F5找出是什么访问了这个地址以后的窗口中会出现内容,但是第二个地址0956BD3C在出现的窗口里面是一片空白,所以,这两个地址中,0264A400才是我们要找的真正的一级偏移地址,如图所示:


如上第二幅图所示,找到了真正的一级偏移地址0264A400后,访问这个地址的窗口中看这些代码指令,通过对比,发现这些代码都指向同一个指针数值02649C98且都有偏移地址00000768,如图所示:

如上图所示,既然所有的代码都指向了同一个指针数值02649C98那么就继续按照前面找一级偏移地址的办法,丢到CE中,继续新的十六进制搜索,搜索指针数值02649C98以后得到如下图所示的结果:
如上图所示,一共搜索到923个地址,而且还有几个绿色的静态地址,这里我们就可以尝试一下了,看看这几个绿色的静态地址究竟是不是我们想要的阳光基址,同样的原理,我们把几个绿色的静态地址拉到地址列表中,在地址这一栏双击,在出来的更改地址窗口中复制下这个地址,然后再勾选指针选项,在出来的内容框中填写入刚刚复制的地址,在上面的内容框中写入刚刚找到的00000768这个偏移地址,然后再点击添加偏移在出来的内容框中输入刚刚第一次找到的00005560这个偏移地址,得到的结果刚好是阳光物理地址和阳光当前的值,并且这几个静态地址的结果都是一样的。这里需要说明一下,为什么这里要填写两个偏移地址,因为刚刚第一次找到的是一级偏移地址,这次是二级偏移地址了,所以,这里

阳光物理地址 = 一级偏移地址 + 偏移地址
一级偏移地址 = 阳光基址 + 偏移地址
阳光物理地址 = 阳光基址 + 第一次的偏移地址 + 第二次的偏移地址
如图所示:



如上四幅图所示,四个静态地址最终结果都是一样的,都可以用作阳光基址,那么就随便取一个就行。这样,阳关的基址和偏移地址就找到了,阳光的基址和偏移地址如下:

阳光基址:006A9EC0
一级偏移:00000768
二级偏移:00005560

这里可能有人会问,一级偏移地址不是我们第一次找出来的地址吗?你这里的一级偏移不应该是00005560吗?对,也不对,我这里所说的一级偏移不是一级偏移地址的偏移,而是基于阳光基址的一级偏移,可以理解为从阳关基址开始,第一次偏移是00000768第二次偏移才是00005560,这样做主要是为了方便后面写代码。好了,这就是找游戏基址的思路,同样的道理,还可以找植物冷却时间,不过找冷却时间思路不太一样,因为冷却时间我们不知道具体的值,可以通过找未知的初始化值的方式来找,也可以通过字节的方式来找,具体详见百度,我这里只是把找游戏内存基址的思路和过程中怎么分析的给写了出来,免得后人掉坑,比如我在找植物冷却时间的时候,就掉了一个坑,我是通过字节的方式来找来找的,通过植物冷却的时候为0,冷却好了为1找到了物理地址以后,在找一级偏移地址的时候,忘记把搜索方式字节换为4字节型了,找了半天没找到!其他思路是一样的!

外挂开发第二步——修改游戏内存地址的值
其实,这一步就比较简单了,比如阳光的值,找到了以后,我们每次上游戏,直接在CE的地址列表框中手动添加地址,把像上面我们验证这几个基址的时候一样,把基址,偏移地址填写好,然后在数值这一栏双击,修改数值成为我们想要的阳光值就可以了,冷却就把数值改为1即可,这一步就不用过多的提及了!

外挂开发第三步——编写游戏外挂
其实编写外挂只有会写程序的人都知道该怎么弄了,只要找出来想要的功能的内存基址,偏移等,直接在程序中写上读取和写入内存地址就行了,比较简单,我大概说一下就好了,就是在外挂软件启动以后,我就读取植物大战僵尸的游戏进程ID,然后读取阳光的物理地址,加以输出显示,然后在启动窗口创建完毕的时候还加一个定时器,达到实时监控阳光值的目的,然后设置了几个按钮,分别是增加阳光、锁定阳光、锁定冷却时间和减少阳光、取消锁定阳光、取消锁定冷却时间。下面分别来说一下几个按钮怎么实现功能的。

增加阳光
增加阳光就定义了一个全局变量,变量中获取输入框中的值,然后让阳光物理地址里面的值加上输入的值,就达到了增加阳光的目的!

WriteMemory函数实现

减少阳光
减少阳光和增加阳关的写法一模一样,只不过把阳光物理地址里面的值设置为了减去输入的值而已,这样就达到了减少阳关的目的!

WriteMemory函数实现

锁定阳光
锁定阳光我定义了一个定时器,设置周期为999毫秒,然后设置了阳光固定值1000。当按钮锁定阳光被单击以后,就执行这个定时器的周期,也就是每隔999毫秒执行一次定时器下面的代码,也就是执行在阳光物理地址中改阳光的值为1000,这样就达到了锁定阳光的目的!

SetTimer WriteMemory函数实现

取消锁定阳光
取消锁定阳光其实就是把锁定阳光这个定时器的周期设置为0,当取消锁定阳光的按钮被单击以后,就执行这个定时器周期事件,定时器下面的代码也就不执行了,达到了取消阳光锁定的目的!
后面的锁定冷却时间和取消锁定冷却时间的原理和上面锁定阳光和取消锁定阳光的原理一样,就不再做详细的解释了,因为我这里针对每个栏位的植物做了单独的冷却锁定和取消锁定,所以代码比较长,其实在找植物冷却时间的时候,可以配合OD,直接找到冷却时间前面的循环干掉,这样所有的植物栏的冷却时间都没了!

KillTimer函数实现

总结
其实不管是单机游戏也好,还是网络游戏也罢,原理都一样,只不过,可能游戏类型不同,所需要的东西也不一样,比如射击类游戏,就需要D3D技术来做人物透视的定位等等,这个具体的方法,可以百度参考。但是万变不离其中,都是找内存基址,找偏移地址。最后感兴趣的朋友可以加群一起闲聊qq群947405150,一起交流技术群947405150。

原文地址:http://blog.51cto.com/13435991/2317575

时间: 2024-10-24 11:40:57

游戏外挂制作原理的相关文章

游戏外挂原理解析与制作 - [内存数值修改类 篇一]

本章旨在讲解外挂实现原理,未深入涉及至代码层面.希望能与对这方面感兴趣的朋友多多交流,毕竟理论是死的,套路是固定的,只有破解经验是花大量时间和心血积累的. 对于单机游戏而言,游戏中绝大部分的参数(比如血.蓝.能量亦或是金币)都存储在计算机的堆栈中,一些类似剧情进度的则加密后写入本地的自定义配置文件中: 对于页游.网游和手游,虽然服务器保存了大量的重要的参数,但由于客户端不可避免的需要进行大量的计算和资源的加载,本地内存种必定存有部分的临时变量,通过判断这些变量的变化规律和函数的破密寻到利于自身的

游戏外挂原理解析与制作 - [内存数值修改类 篇二]

本章旨在讲解如何利用高级语言根据变量数值寻找内存地址.涉及代码以C#为例. 我用C#写了一个WinForm形式的Demo,界面如下: 源代码: //血量初始值 private int value = 1000; public Form1() { InitializeComponent(); } /// <summary> /// 刷新界面:将最新的血量显示在界面 /// </summary> /// <param name="sender"><

游戏外挂原理解析与制作 - [内存数值修改类 篇四]

前三篇的博文结合了C#的Demo对内存数据修改一类的挂剖析了原理,利用C#语言调用Windows API,我们其实已经写出了一个简单的内存扫描工具,但是它存在一些缺陷,比如说只能所搜索单一类型数值(整型),只能搜索确定的数值,比如1000.2000,而不能进行模糊搜索,比如搜索某个值变小了,或者在某某区间内变化了等. 我一直认为语言只是一种工具,只要能够达到修改数值的目的,用什么语言都可以,甚至可以配合着多种语言和工具来完成一项数值的修改.其实实际中通常都是这样,因为每种语言有自己的优势,比如C

【转载】游戏外挂的编写原理和思路

原文:游戏外挂的编写原理和思路 游戏外挂的编写原理(一) 一. 前言 所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作.修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将.虽然,现在对游戏外挂程序的“合法”身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧. 不管游戏外挂程序是不是“合法”身份,但是它却是具有一定的技术含量的,在这些小小程序中使用了许多高端技术,如拦截Sock技术.拦截API技术.模拟键盘与鼠标技术.

初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程

详解游戏辅助编程 [目录] 1-什么是Windows API 2-Windows进程 3-Windows 的内存的运行原理 4-windows 中句柄的概念 5-Windows的变量类型 6-辅助实现的原理 7-编程实现游戏辅助 8-怎样查找内存地址 9-总结 准备软件:VC,CheatEngineer5.5 学习这部分内容,你必须要掌握C语言的基础知识,非常基础的语法就行了.这篇文章的内容适合刚开始接触编程的人,高手请飘过. [1]什么是windows API Windows API 中文翻译

游戏外挂教程(转)

游戏外挂教程(转) 由于本人是游戏爱好者,又是懒人,所以就有了写外挂的想法. 有同样爱好的人 可以 参考一下 主要是调用API的一些东西. 以下教程来自网上,本人通过一下教程,编写了魔兽争霸3,辅助工具(主用功能显血.改键) 谢谢 O(∩_∩)O~ 游戏外挂的编写原理(一)     一. 前言 所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作.修改游戏网络数据包以及修改游 戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将.虽然,现在对游戏外挂程序的“合法”

关于游戏外挂

这篇文章不是自己所写,但基本上工作中也有接触,看到了就转过来记录 对于一个要上线的游戏,防外挂是必须的,历史上因为外挂而造成大量玩家流失的游戏数不胜数.随着游戏研发技术的发展,对外挂的预防业内其实做的已经越来越好了.下面总结一下防外挂的基础知识,以及我们的移动模块为防外挂做了哪些工作. 1 预防外挂的基础知识 在做外挂预防工作之前,我们要先了解外挂有哪些.根据我的了解,市面上常见的外挂主要有以下几种: 修改客户端的内存信息这类外挂通过分析游戏所使用的内存,找到内存中的变量去分析猜测变量是代表的什

【QT】找茬外挂制作

找茬外挂制作 找茬游戏大家肯定都很熟悉吧,两张类似的图片,找里面的不同.在下眼神不大好,经常瞪图片半天也找不到区别.于是乎决定做个辅助工具来解放一下自己的双眼. 一.使用工具 Qt:主要是用来做界面的 OpenCV: 用于图像处理 C++: 基本实现语言 Qt中OpenCV的配置在[QT]OpenCV配置中讲过了,不会配置的可以看看. 二.实现方案 我要做一个通用的找茬辅助工具,即可以在所有PC找茬游戏中使用.这意味着我们不能通过获取游戏窗口句柄来定位游戏界面.那怎么办呢?灵光一闪,我想到了截图

游戏外挂技术

     1.首先打开植物大战僵尸.进入如下界面. 2.打开MemSearch工具.截图如下: 注意:可以通过查找出的内存地址来修改阳光值.如果左侧查找出了多个,重新输入目标值,然后点击累计查找,直到找到确切的内存地址. 3.然后新建一个项目:挂中挂,截图如下: 4.点击确定 5.源文件-à新建一个.c文件. 6.通过指针的方式间接修改阳光的值.例如: 7.调试以下程序: (1)在程序中打断点à点击"本地Windows调试器" (2)点击调试à窗口à内存à内存4(4) 然后在地址