最近很多热爱玩游戏的朋友看了我文章后,经常私信问我,“你是黑客吗?”我回答“我是一个白帽子黑客”。“那能不能帮我攻入游戏系统做一款游戏外挂,咱们一起赚钱?”我就只能呵呵了,肯定是不可以的,技术上虽然可以实现但是原则上一定不要那么做。
首先大家可以学习如何做外挂,也可以自己在家用单机游戏做外挂来测试,这样既能提高自身技术又能满足自己的好奇心,但是如果为了谋取利益攻击网络游戏,做一款外挂这样就是触犯了法律。所以热爱游戏的朋友们,咱们可以学习,学习掌握后如果想赚钱可以去游戏公司作安全技术维护人员,同样可以赚取高薪。但是切忌不要通过学习获得的知识做触犯法律的事情。
今天就以本篇文章内容,让大家理解一款“游戏外挂”原理、制作流程以及我们需要学习哪些知识才能掌握这项技术?
一、 认识外挂
外挂一般指通过修改游戏而为玩家谋取利益的作弊程序,即利用电脑技术针对一个或多个软件,通过改变软件的部分程序制作而成的作弊程序。
游戏外挂的历史可以追溯到单机版游戏时代,只不过当时它使用了另一个更通俗易懂的名字,游戏修改器。它可以在游戏中追踪锁定游戏主人公的各项能力数值。这样玩家在游戏中可以达到主角不掉血、不耗费魔法、不消耗金钱等目的。这样降低了游戏的难度,使得玩家更容易通关。
随着网络游戏的时代的来临,游戏外挂在原有的功能之上进行了新的发展,它变得更加多种多样,功能更加强大,操作更加简单,以至有些游戏的外挂已经成为一个体系,比如《石器时代》,外挂品种达到了几十种,自动战斗、自动行走、自动练级、自动补血、加速、不遇敌、原地遇敌、快速增加经验值、按键精灵等几乎无所不包。
二、 游戏外挂的分类
合法性分类:
1、授权外挂
授权的外挂即(内挂)软件在合理性、使用性、安全性上都是最优秀的,由于开发外挂需要考虑自身体积、人机功效及可靠性,所以好的外挂一般都是先由多个人或组织开发各式各样的!由官方测试后认定某一单位开发的外挂可以安全、稳定的给用户服务,这样官方才会授权它可以公开出售、下载及使用!
2、未授权外挂
未授权外挂并不是违法的,授权外挂的前身都是未授权外挂,它们需要在主体软件上作全面的测试,不然很容易出现死机、毁数据或其他有害症状!未授权外挂不可以随意发放给用户,更不能作为商业用品交易,所以法律为了软件用户的数据安全规定:出售未授权外挂是违法的的行为!另外如果未授权外挂被人利用来传播病毒和木马,那对用户来说就是一场灾难!
技术性分类:
1.脱机类外挂
在游戏开发过程中,每款游戏的客户端与服务端都会有固定的通信格式,大部分游戏通信协议位于TCP层之上,自定义的数据结构,外挂开发者们称此为封包。下面简单列举一个简单的打斗封包,以方便说明脱机类外挂原理。
0000ABCD 0000DCBA 00001234 00001000
例如玩家1在与玩家2打斗过程中,发送到服务器这样一个16字节的数据包,其中游戏开发者定义此数据包含义如下:
0000ABCD:玩家1的ID。
0000DCBA:玩家2的ID。
00001234:玩家1所使用的技能编号。
00001000:玩家1对玩家2造成的伤害,转换为十进制为:4096。
当服务器接收到此数据包时,则会将玩家2的血量减少4096点,如果玩家血量减少后小于等于0,则判定为玩家2已经阵亡。这时服务器会返回给玩家2的客户端一个数据包,玩家2的客户端则播放一个玩家2已经死亡的动画。
以上逻辑,其实存在着大量的漏洞,比如说,服务器应该判定玩家上一次释放00001234号技能是否在冷却时间内,再比如说,服务器应该判定玩家战斗过程中所造成的伤害是否与其装备、法力值、攻击力、暴击等相吻合,是否超过了游戏本身限制的最大伤害。类似这种漏洞,每一款游戏都会存在,只不过不会这么明显。一些老游戏在这方面做的相对较弱,所以漏洞更多。
另外,在游戏开发过程中,数据通信的格式在游戏开发商的公司中都有相关文档明确定义的。而这些文档非常机密。一些游戏开发商公司的安全做的不够好的情况下,可能会造成游戏代码以及文档的泄露。这些资料,一旦流入外挂开发者手中,那么这款游戏就极有可能会出现脱机式外挂。
脱机外挂定义:在不开启游戏客户端的情况下,第三方程序直接与游戏服务器进行通信,模拟账号登陆验证、选择角色、进入游戏、进入场景、开始战斗、对怪物造成伤害等操作时的合法数据包,发送给服务器,而服务器是没有能力判断出这些包是否是客户端发来的,即便有验证手段,由于源码已经泄露,外挂开发者可以轻而易举的模拟出服务端的各种验证机制。即便数据包传送过程中是加密的,由于源码外漏,外挂开发者一样可以正确模拟出数据包的加密方式。
2.模拟发包类外挂
脱机类外挂多半依赖于游戏开发商的资料外泄,而模拟发包类外挂与脱机类外挂很近似。原因是一些外挂开发者本身可能是游戏开发者出身,对游戏中的逻辑相当了解,他们可以用调试+抓包分析的方法,在没有源码以及通信格式资料的情况下,分析出一些游戏中关键的数据包,并采用一定的模拟发包技术,完成游戏中本身含有的功能。
此类外挂多半需要向游戏中注入一个dll文件,并且用dll获取到与服务器通信的socket句柄,在此socket句柄上,将自己组织好的、合法的数据包发送到服务器。部分比较老的游戏中很常见此类的外挂,比如决战OL中的挂机内挂中的喊话功能,自动喝药功能,都是模拟发包方式完成的。
3、内存式外挂
在没有游戏客户端源码,并且没有一定的游戏开发经验的情况下,依然是可以进行外挂开发的。而这些外挂开发者,一般熟练掌握操作系统的各种底层机制,如模块、线程、内存、内核对象、内核机制等技术。这些技术,有助于他们去分析游戏客户端进程中的逻辑和重要数据,之后他们一般会注入dll到游戏进程,去操作游戏进程内数据,完成一些特殊功能。当遇到一些改动,服务器恰好没有校验时,他们的外挂功能便成功执行。
三、 游戏外挂的基本原理
对于单机游戏而言:游戏中绝大部分的参数(比如血、蓝、能量亦或是金币)都存储在计算机的堆栈中,一些类似剧情进度的则加密后写入本地的自定义配置文件中;所以单机外挂原理是修改本地配置文件
对于页游、网游和手游:游戏外挂通常是修改内存数据、或者截获网络封包。
1、修改内存数据的原理:服务器保存了大量的重要的参数,但由于客户端不可避免的需要进行大量的计算和资源的加载,本地内存种必定存有部分的临时变量,通过判断这些变量的变化规律和函数的破密寻到利于自身的参数,比如伤害值一类,继而寻找该变量的内存地址,根据指针偏移分析获得内存基址,再提升权限利用Windows API把自定义数值写入该内存块,就完成了修改某项数值的操作,一般来说,只要破解了一项数值,利用规律继而破解其他数值就更加容易了。
2、截获网络封包的基本原理:Internet客户/服务器模式的通讯一般采用TCP/IP通信协议,数据交换是通过IP数据包的传输来实现的,一般来说客户端向服务器发出某些请求,比如移动、战斗等指令都是通过封包的形式和服务器交换数据。那么我们把本地发出消息称为SEND,意思就是发送数据,服务器收到我们SEND的消息后,会按照既定的程序把有关的信息反馈给客户端,比如,移动的坐标,战斗的类型。把客户端收到服务器发来的有关消息称为RECV。接下来要做的工作就是分析客户端和服务器之间往来的数据(也就是封包),这样就可以提取到对我们有用的数据进行修改,然后模拟服务器发给客户端,或者模拟客户端发送给服务器,这样就可以实现修改游戏的目的。
四、 游戏外挂制作流程解析
以网游外挂为例,总体上分为两个过程,一是游戏分析调试过程,二是使用编程工具进行外挂功能开发,具体流程如下:
1、选择要制作的网游外挂类型
首先要做的第一件事就是确定你要制作的网游外挂类型。是想做修改内存数据的外挂和还是不依赖于客户端,能独立模拟客户端和游戏服务器进行通讯的网游脱机外挂。内存外挂的整体制作难度比脱机外挂要简单一些,但脱机外挂制作要比内挂更有趣,而且用起来也更方便,不必启动庞大的客户端程序。那我们选择比较难的以脱机外挂的制作流程为主进行讲解。
2、网络截包工具的使用
目标网游的初步分析最主要的工作是分析游戏初始阶段网游客户端和服务器之间的数据通讯。这一阶段主要是指从输入用户名和密码开始登录游戏到玩家人物出现在游戏场景中这个阶段。这是开始阶段最关键的一个步骤,如果你能够成功破解网游数据通讯部分的加密,并用DEMO程序成功模拟整个登录过程,那你几乎就已经成功了一半了。关于初步分析,首先要确定网游客户端和服务器之间的大致通讯过程,最起码你要知道客户端连接的是哪一个服务器,连接的端口是多少,在登录的过程中发送和接受了几个包?而要了解这些东西,你就要使用到网络截包工具了。
可以使用Wireshark,简单好用。
3、分析初始阶段C/S网络数据通讯
在这篇文章里,引用高手们破解某款网络游戏的过程作为分享。
首先在Microsoft Network Monitor抓包工具【aliases】窗口中将本地客户端和游戏服务器分别命名为:MyComputer和GameServer。注意不要忘了点击【apply】按钮
然后在【Display Filter】中输入如下语句,仅显示游戏客户端和服务器之间的数据包。数据包类型为TCP是因为网游通讯的协议是TCP协议。
下图中的数据包列表就是目标网游从输入用户名和密码登录游戏到人物出现在游戏中(然后立即退出。)这一阶段客户端和服务器之间的所有往来的数据包。
图中红线标识的三个包代表了一个连接的过程。注意它的TCP Flags的变化。 MyComputer è GameServer .S…… 客户端请求建立连接 MyComputer GameServer .S.A…… 服务器同意建立连接 MyComputer è GameServer ……A…… 连接建立 以上三个包称为建立TCP连接的三段式握手。当你调用Socket类的Connect方法时就会产生上面的三个TCP包。 图中蓝线标识的是连接断开的过程。 MyComputer è GameServer F……A…… 客户端请求断开连接 MyComputer GameServer ……A…… 服务器同意断开请求 MyComputer GameServer F……A…… 服务器请求断开连接 MyComputer è GameServer ……A…… 客户端同意断开请求 调用Socket类的Disconnect方法时就会产生上面的四个TCP包。 从上图中我们不难看出在验证用户名和密码的过程中,客户端和服务器之间总共连接了二次,所以在之后的外挂程序编写过程中,我们同样也要连接二次。
TCP Flag为...PA...表示该TCP包内带有数据,而....A...则是回应包,用于回应上一个包的发送方:我已经收到你上一个包了,它本身不带数据。所以一般一个...PA...包都有一个对应的....A...包(例如编号为266和269),但如果回应的时候,发现正好有数据要发送,则可以将回应包掺杂在发送包中发送过去(例如编号为273的回应包就掺杂在275这个包内)。下面观察客户端和服务器之间的实际数据往来。 客户端连接到服务器 MyComputer GameServer 服务器给客户端发送7字节的数据 MyComputer è GameServer 客户端给服务器发送90字节的数据 MyComputer GameServer 服务器给客户端发送65字节的数据 MyComputer GameServer 服务器给客户端发送48字节的数据 MyComputer è GameServer 客户端给服务器发送48字节的数据 MyComputer GameServer 服务器给客户端发送208字节的数据 服务器断开连接 以上就是第一次连接的大致过程。观察每个包内的具体传输数据是没有意义的,因为网游之间的通讯肯定是加密的,你每次拦截下来的数据都会不一样。通常游戏服务器给客户端发送的第一个包都是KEY包(例如上面的7字节的包),客户端在接收到KEY包之后执行相应的数据加密初始化。所以接下来的任务就是根据已掌握的数据通讯规律,对游戏客户端的加密算法进行破解了。
4、游戏加密算法破解
网络游戏所使用的网络通讯函数肯定也是微软操作系统所提供的标准API函数,所以通常在接受网络数据的API函数中下一个断点,当接收到第一个7字节包时,断点激活,然后逐渐跟进去,查看游戏客户端是如何处理该段数据的,然后我们在外挂中依样画葫芦,进行同样的处理。
5、网游基本指令分析
监控网游客户端的发送包和接受包,得到网游指令的数据样本。那么如何得到网游指令的数据样本呢?首先想到的是使用网络截包工具,这种方式在网游发展早期的话还有一定的可行性,因为那时候网游大部分采用明文通讯,而现在的网游数据通讯肯定是加密的,所以使用网络截包工具截获到的数据毫无意义。既然无法使用通用的工具,那我们只能把目光移向游戏客户端了,因为在游戏客户端内处理的肯定是未加密的数据。像之前的加密破解一样,跟踪游戏对网络数据的处理过程,分别找到游戏中对解密后的指令包的处理函数入口和游戏对要发送指令包进行加密的函数入口这二个地方,然后修改这二处地方入口点的汇编指令,使之先调用我们编写的函数,然后再调用原始的过程。在我们自己编写的函数内部,分别记录下接收到的指令包和要发送的指令包(如下图)。这样,网游客户端的发送包和接受包的监控就完成了。
分析网游指令的通用方法:能够获得网游指令样本数据之后,接下去就是实际的分析过程了。一般而言,根据指令包所起的不同作用,可以将游戏指令包分为不同类别:
连接相关指令包 用于与游戏建立连接以及退出游戏时的指令包玩家属性相关指令包 与玩家本身状态相关的指令包,在刚进入游戏系统时,服务器会发送过来大量的关于玩家角色基本信息的指令包。 环境相关指令包 由于告知玩家周围怪物/NPC/其他玩家状况的指令包 移动相关指令包 与走路相关的指令包 战斗相关指令包 与战斗相关的指令包 交易相关指令包 与交易相关的指令包 制作一款外挂,如果只要求基本功能的话,分析20,30个指令包应该就差不多了,如果要求功能比较完善的话,至多50个指令包也就差不多了。具体分析的方法也很简单,无非是排除干扰因素,逐个击破,以及重复试验,确保分析结果正确。 下图是针对某一款游戏的28个指令包的具体分析:
6、网游资源解析
游戏资源主要是指包含在网游客户端内的与游戏相关的数据资源:其中最重要的是地图资源,其他的资源包括NPC的位置坐标啊,地图传送点的坐标啊,等等。
第一地图资源解析:地图资源的解析是外挂制作中很重要的一个方面,寻路算法以及地图间的自动移动等都要依赖于地图资源。 外挂中所使用的地图资源不完全等同于游戏中使用的地图资源。游戏中使用的地图资源包含有更多的信息,而外挂所使用的地图称之为BOOL地图,它仅仅包含一项信息:指定的某一点是可移动点还是障碍点。
例如上图就是某个游戏地图所对应的BOOL地图,其中蓝色部分代表不可移动区域,白色部分代表可移动区域。(另外绿色的点是通过解析其他的资源文件获得的NPC的坐标点,红色点是传送点。) 那么如何获得游戏地图所对应的地图资源呢?通常在网游客户端的程序安装目录内会存在一个类似map或者res之类的目录。地图资源处在其中的可能性很大,而且地图资源本身的文件格式也比较明显,通常它都是以如下的格式存在的:
前面N个字节的地图头信息中肯定包含了地图的宽度信息和高度信息,设宽度和高度分别为W和H。后面的部分通常都是地图点信息。地图上的一个点通常由n个字节所构成,整个地图文件的大小由此计算而得: N + (W*H*n)。
所以判断是否是地图文件很简单,只要看一下文件的头,然后查看一下文件的大小。如果有一组文件满足上面的规律的话,那基本上可以肯定是地图资源文件了。接下来就是要把游戏地图转化为BOOL地图。前面提到地图文件中地图上的一个点通常有n个字节所构成,里面含有很多丰富的信息,而BOOL地图所关心的是否是可移动点的信息通常仅需要用1位即可表示。(注意是位,1个字节有8位,所以n个字节总共有8n位)将一张游戏地图中所有点的该位信息收集起来组成的新的地图就是BOOL地图。它标示了地图中那些区域玩家是可移动的,那些区域是不可移动的,为后面的寻路算法提供了基础数据。原理明白了,接下去就是写一个程序解析地图资源。大致步骤如下: 首先打开一个地图文件 然后读入地图文件的头信息,解析出地图宽度和高度
最后读入地图点信息,对每一个点所代表的n字节数据执行位操作,提炼出其中某一位的信息,保存到自己的结构中。(此处我建议大家采用BMP格式的数据来保存提炼出来的位信息,好处有三点:一是保存完之后,直接可以用图片浏览工具查看结果,不必自己再写一个绘制的程序,二是使用BMP格式保存的话,保存的数据容量也小,三是在外挂中显示地图时可以将BMP图片直接作为背景图片贴在窗口上。)由于之前你尚无法确定n字节中的哪一位代表了点的是否可移动属性,所以每一位你都要取一遍组成一幅地图,然后查看哪一幅和游戏地图最接近。多读几个地图文件做实验,很容易就可以确认下来的。
第二其他资源的解析:地图资源的解析是通过了解物理磁盘上地图文件的保存格式,然后自己写程序解析出来的,使用这种方法还可以解析其他很多资源信息。大家可以仔细观察游戏的安装目录,根据子目录和文件的名字可以分析出很多有用的信息。 但目前游戏厂商将保存在磁盘上的资源文件通常进行了变形(压缩或者加密),使你无法通过简单的分析获得你所需要的信息。 一种解决办法就是观察游戏是如何处理变型的资源文件的。因为在游戏中资源肯定是以原始形式存在的,通常都是在游戏初始化的时候,从磁盘上读入变形的资源文件,然后将其恢复为原始状态的资源形式,我们就跟踪该段的处理过程,然后自己模仿写一段程序将变形资源恢复为原始资源形式。 另外一种方法就是直接从游戏的内存中读取有用的资源信息。该方法的理论依据就是:资源信息在游戏中肯定是明文形态,而且是被有序组织的。比如,如果你想要获得所有游戏物品的信息列表,你可以随意选择一个物品名称,然后在游戏的内存中查找他的位置。所有的物品在游戏内存中肯定是以某种链表的形式存在的,你只要找到了一个,就可以顺藤摸瓜,找到该链表的头,然后自己写一个程序,读写游戏的内存空间,将整个游戏的物品列表全部读取出来。
7、网游中的算法
寻路算法:外挂中最有名的,也最重要的一个算法就是寻路算法了。所谓寻路算法就是指给定一张地图数据,以及起始点和目标点,然后利用算法计算出一条路径来。它所依赖的数据基础是BOOL地图,这个我们在之前的讲述中已经成功获得了。
具体算法如下:常用的寻路算法实现有二种,一种是A*算法,还有一种等高线算法。还记得在大学里面学过遍历图的二种算法吗,一种是深度优先,一种是广度优先。A*算法就对应了深度优先算法,而等高线算法则对应了广度优先算法。 A*算法是最常用的寻路算法了,不过它也有个很大的缺陷,那就是计算出来的路径通常是贴边的,所以如果你在游戏中观察用外挂控制的人物的走动的话,你会发现他通常是沿着障碍物的边走动的,走动起来显得很不自然。 A*算法和等高线算法在网上都有很多例子,在我的站点上也提供了这二个算法的实现(C++版)。下面这张图显示的是A*算法和等高算法的具体应用。
其他算法:外挂中除了寻路算法之外,还有其他的一些算法应用,比如地图间移动算法:在已知各个地图间传送点的情况下,计算出从地图A移动到地图B所要经过的所有地图,这同样是一个经典的图论算法问题。 此外还有打怪时如何搜索最近怪物的算法,以及最有效的自动战斗的算法,这些算法要根据每款游戏的实际情况而进行相应的变动。
8、使用编程工具进行外挂功能开发
选择何种编程语言和工具制作外挂则没有限定,常用的如VC,Delphi,VB…等都可以,具体的编程过程再以后的文章里会详述。
五、学习编写游戏外挂我们需要掌握哪些基础知识?
1、要学会编程
至少要掌握可视化编程,如学习VC,Delphi,VB等编程语言
2、学会简单分析游戏
需要会使用一些工具,分析游戏的窗口,控件,进程,线程,DLL模块,内存..因为做外挂就是要控制游戏程序,所以需要学会分析游戏的这些表面特征与内在数据.了解了游戏的基本构造才能针对性的编写外挂功能.
3、学会API
学习一下基本的Win32 API调用很有必要,主要是那些进程线程操作,内存读写,DC设备对象,鼠标键盘模拟等。
4、学会用CE查找动态内存基址
CE可是个利器,对于查找解决游戏中的动态内存等有奇效,用法上也不难,花个几天时间就能学会基本的操作了,对于简单的人物信息数据等很容易找到,但对于地图物品,怪物数组的内存稍复杂.
5、学会OD调试游戏找关键CALL
游戏也是编出来的,里面也是有一个一个的功能函数组合起来.找到一些关键的功能函数入口地址,并分析出该函数的参数,就可以编写CALL代码,来直接调用游戏中的函数,让其实现自动化.
6、学会写CALL代码
对于C语言来说,本身就支持汇编指令编写,但是易语言不支持,幸好网上也有人做出过一些汇编模块,可以使用这些汇编来编写CALL调用代码,也可以使用外挂作坊模块里的 调用函数() CALL() 调用机器码() 等命令.
7、加解密封包
用OD调试游戏中收发封包的API上下层函数,这里的函数循环体基本上都是游戏的数据包加解密功能了.可以分析之后自已编写出这两个函数代码,也可以直接CALL游戏中现成的加解密函数体.还要分析封包的封装的消息格式.
8、分析游戏地图与寻路
有些游戏里本身就有自动点击行走或寻路的功能,可以很方便的利用之,若没有这些的话,就得分析了,这个有相当的难度.是做挂机挂的必经之路.