手游封包发送源码-游戏客户端脚本剖析

最近,很多爱玩游戏的同学看完我的文章后,经常私信问我“你是黑客吗?” 我回答说“我是白帽黑客”。 “那你能不能帮我攻克游戏系统,制作一个游戏金手指,我们一起赚钱?” 我只能呵呵,肯定不可能,技术上好像可以,原则上是绝对不能做的。

首先,你可以学习如何做金手指,也可以在家庭单机游戏中自己测试一下,这不仅可以提高你的技能,还可以满足你的好奇心。 简直触犯了法律。 所以热爱游戏的同学,我们可以学习,学完之后如果想赚钱,可以去游戏公司做安全技术维护人员,同样可以获得高薪。 但不要用学到的知识去做违法的事情。

图像

今天就通过这篇文章的内容,让大家了解一下“游戏外挂”的原理、制作流程以及掌握这项技术我们需要学习哪些知识呢?

1.了解插件

外挂通常是指通过改变游戏为玩家获取利润的作弊程序,即借助笔记本技术将软件的部分内容更改为一个或多个软件而制作的作弊程序。

游戏金手指的历史可以追溯到单机游戏时代,但当时它使用了另一个更通俗易懂的名字——游戏修改器。 它可以追踪并锁定游戏主角在游戏中的各种能力值。 这样玩家就可以达到主角在游戏中不失血、不消耗法力、不消耗金钱的目的。 这增加了游戏的难度,让玩家更容易通过关卡。

随着网络游戏时代的到来,游戏外挂在原有功能的基础上有了新的发展。 一个系统,比如《石器时代》,有几十种类型的插件,比如自动战斗、自动行走、自动练级、自动春药、加速、未遇敌人、原地遇敌、快速减少经验等点和关键向导。 不包括。

2.游戏金手指的分类

合法性分类:

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句柄与服务器进行通信。 在此套接字句柄上,将组织好的合法数据包发送到服务器。 这种插件在一些老游戏中很常见,比如决战OL中挂机插件中的呼叫功能,自动喝药的功能,都是通过模拟分包来完成的。

3.内存插件

没有游戏客户端源码,没有一定的游戏开发经验,还是可以开发外挂的。 而这类插件开发者一般都精通操作系统的各种底层机制,比如模块、线程、内存、内核对象、内核机制等技术。 这些技术帮助他们分析游戏客户端进程中的逻辑和重要数据,然后他们通常会向游戏进程中注入dll来操作游戏进程中的数据并完成一些特殊功能。 当遇到一些变化时,服务器恰好失去了校准,他们的作弊功能就成功执行了。

3. 游戏黑客的基本原理

对于单机游戏:游戏中的大部分参数(如血量、法力、能量或金币)都存储在电脑的堆栈中,一些类似于剧情进度的参数被加密写入本地自定义配置文件;所以单机插件的原理就是改变本地配置文件

对于页游、网络游戏、手游:游戏外挂一般会改变显存数据,或者抢占网络数据包。

手游封包发送源码-游戏客户端脚本剖析

1、修改显存数据的原理:服务器保存了大量的重要参数,但由于客户端不可避免地需要进行大量的估计和资源加载,所以本地显存必须有一些临时变量。 通过判断各个变量的变化规律以及对函数的解密来找到对自己有利的参数,比如伤害值,然后找到变量的内存地址,根据偏转分析得到显存的基地址表针,然后提高权限,通过使用Windows API自定义将值写入内存块,完成更改某个值的操作。 一般来说,只要破解了其中一个数值,再利用法则破解其他数值就会更容易一些。

2、拦截网络数据包的基本原理:互联网客户端/服务器模式通信通常采用TCP/IP通信协议,通过IP数据包的传输来实现数据交换。 一般来说,客户端向服务器发送单独的请求,如联通、战斗等命令通过数据包与服务器交换数据。 那么我们把本地发送的消息称为SEND,即发送数据的意思。 服务器收到我们的SEND消息后,会按照既定的流程向客户端反馈相关信息,比如移动坐标、战斗类型等。 客户端从服务器接收到的相关消息称为RECV。 接下来要做的就是分析客户端和服务器之间的数据(也就是数据包),这样就可以提取出有用的数据供我们改变,然后模拟服务器发送给客户端,或者模拟客户端发送给服务器,这样就可以达到改变游戏的目的。

4.游戏外挂制作流程分析

以网络游戏作弊为例,一般分为两个过程,一是游戏分析调试过程,二是使用编程工具开发外挂功能。 具体流程如下:

1.选择要制作的网络游戏外挂类型

首先要做的是确定你想要制作的网络游戏外挂的类型。 你想做一个改变显存数据的插件,还是做一个不依赖于客户端、可以独立模拟客户端和游戏服务器通信的网络游戏离线插件。 内存插件整体制作难度比离线插件简单,但离线插件的制作比内部插件更有趣,使用起来更方便,无需启动一个庞大的客户端程序。 那么我们选择难度较大的一个来主要讲解离线插件的制作流程。

2、网络数据包拦截工具的使用

目标网络游戏初步分析最重要的任务是分析游戏初始阶段网络游戏客户端与服务器端的数据通信情况。 该阶段主要指从输入用户名和密码登录游戏到玩家角色出现在游戏场景中的阶段。 这是初始阶段最关键的一步。 如果你能成功破解网络游戏数据通信部分的加密,并成功用DEMO程序模拟整个登录过程,那么你就差不多成功了一半。 关于初步分析,首先要确定网络游戏客户端和服务器之间的大致通信流程。 最起码你需要知道客户端连接的是哪台服务器,连接的是哪个端口,登录过程中发送和接收了多少消息。 包? 要了解这种事情,就需要使用网络拦截工具。

图像

您可以使用Wireshark,它简单易用。

3、分析初期C/S网络数据通信

本文引用高手破解某网游的过程作为分享。

首先,在Microsoft Network Monitor抓包工具的【别名】窗口中,将本地客户端和游戏服务器分别命名为:MyComputer和GameServer。 请注意不要忘记单击[应用]按钮。

图像

然后在【显示过滤】中输入以下语句,只显示游戏客户端与服务器之间的数据包。 数据包类型为TCP,因为网络游戏通信合约是TCP合约。

手游封包发送源码-游戏客户端脚本剖析

图像

下图中的数据包列表就是本阶段从输入用户名密码登录游戏到角色出现在游戏中(然后立即退出)这一阶段客户端与服务器之间的所有数据包。目标在线游戏。

图像

图中红线标注的三个包代表一个连接过程。 注意其TCP Flags的变化。 MyComputer è GameServer .S... 客户端请求建立连接 MyComputer GameServer .SA... 服务器同意建立连接 MyComputer è GameServer .A... 连接构建 以上三个包称为三阶段建立 TCP 连接的握手。 当调用Socket类的Connect方法时,里面的三个TCP数据包就会形成。 图中蓝线表示断开连接的过程。 MyComputer è GameServer F...A... 客户端请求断开 MyComputer GameServer...A... 服务器同意断开连接请求 MyComputer GameServer F...A... 服务器请求断开 MyComputer è GameServer...A。 .. Client 里面的四个 TCP 数据包只有在调用 Socket 类的 Disconnect 方法同意断开请求时才会形成。 从上图不难看出,在验证用户名和密码的过程中,客户端和服务器一共连接了两次,所以在以后编译插件程序的过程中,我们还需要连接两次。

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 + (WHn)。

图像

所以判断是否是map文件很简单,只要看文件头,然后查看文件大小即可。 如果有一组文件满足前面的规则,那么它基本上就是一个地图资源文件。 下一步是将游戏地图转换为 BOOL 地图。 前面提到,地图文件中地图上的一个点一般由n个字节组成,其中包含了很多丰富的信息,而BOOL地图关心的是否是可连接点的信息一般只需要用1位表示。 (注意是位,1个字节有8位,所以n个字节总共有8n位)收集游戏地图中所有点的位信息形成的新地图是BOOL地图。 它识别地图中玩家可连接的区域和不可连接的区域,为旁边的寻路算法提供基本数据。 原理明白了,接下来就是编写一个解析地图资源的程序了。大致步骤如下:首先打开一个地图文件,然后读取地图文件的头信息,解析出地图的长度和高度地图

最后读入地图点信息,对每个点代表的n字节数据进行位运算,提取出某位的信息手游封包发送源码,保存在自己的结构体中。 (这里建议大家使用BMP格式的数据来保存提取的位信息,好处有三:第一,保存后可以直接使用图像浏览工具查看结果,无需自己编写画图程序;第二,使用BMP格式保存的话,保存的数据容量也小。第三,在插件中显示地图时,可以直接将BMP图片粘贴到窗口上作为背景图片。)因为你目前还无法确定这n个字节中哪一个代表的点是是否可以连通,所以你得把每一个组成一张地图,然后检查哪一个与游戏地图最接近。 多看几个地图文件并做实验就很容易确认了。

其他资源的第二次分析:地图资源的分析是通过了解化学C盘上地图文件的存储格式,然后编写程序进行分析来完成的。 使用这些方法,您还可以分析很多其他资源信息。 你可以仔细观察游戏的安装目录,根据子目录和文件的名称可以分析出很多有用的信息。 但目前游戏厂商通常会对C盘存储的资源文件进行修改(压缩或加密),这样你就无法通过简单的分析来获取你所需要的信息。 一种解决方案是观察游戏如何处理转换后的资源文件。 因为游戏中的资源必须以原来的形式存在,通常在游戏初始化的时候,会从c盘读取修改后的资源文件,然后恢复到原来的资源模式,我们会跟踪这一段的处理过程,以及然后仿写一个程序,将修改后的资源恢复为原来的资源。 另一种方法是直接从游戏的显存中读取有用的资源信息。 这种方法的理论基础是:游戏中的资源信息必须是纯文本的形式,并且是有序组织的。 例如,如果您想获取所有游戏项目的信息列表,您可以随机选择一个项目名称,然后查找其在游戏显存中的位置。 所有项目必须以某种数组的形式存在于游戏的视频内存中。 只要找到一个,就可以顺着藤蔓找到数组的头部,然后自己写一个程序来读写游戏的显存空间。 将物品清单全部读下来。

7.网络游戏中的算法

寻路算法:插件中最著名、最重要的算法就是寻路算法。 所谓寻路算法就是给定一个地图数据,以及起点和目标点,然后利用算法来估计一条路径。 它所依赖的数据基础是BOOL图,我们在前面的描述中已经成功获取到了。

具体算法如下: 常用的寻路算法有两种,一种是A算法,一种是轮廓算法。 还记得大学里学过的两种遍历图的算法,一个是深度优先,一个是广度优先。 A算法对应深度优先算法,轮廓算法对应广度优先算法。 算法A是最常用的寻路算法,但它也有一个很大的缺陷,那就是估计的路径通常接近边缘,所以如果观察游戏中插件控制的角色的移动,你会发现他平时都是沿着障碍物的一侧走,走上去就变得很不自然。 A算法和轮廓算法网上都有很多反例,我的网站上也提供了这两种算法的实现(C++版本)。 下图为A*算法和轮廓算法的具体应用。

图像

其他算法:除了寻路算法外,插件中还有其他算法应用,比如地图间通信算法:在地图间已知传递点的情况下,计算从地图A到地图A要传递的距离map B 都是地图,这也是一个经典的图论算法问题。 另外还有打怪时如何搜索最近怪物的算法,以及手动战斗最有效的算法。 这些算法需要根据每个游戏的实际情况进行相应的改变。

8、使用编程工具开发插件功能

选择哪种编程语言和工具来制作插件没有限制。 常用的如VC、Delphi、VB等都可以使用。 具体的编程过程将在后面的文章中讲解。

5、学习编写游戏插件需要掌握哪些基础知识?

1.学习编程

至少掌握可视化编程,比如学习VC、Delphi、VB等编程语言

2.学会简单分析比赛

需要能够使用一些工具来分析游戏的窗口、控件、进程、线程、DLL模块、内存……因为做插件就是控制游戏程序,所以需要学会分析表面特征和游戏的内部数据。 了解了游戏的基础结构后,就会有针对性地编写外挂功能。

3. 学习API

需要学习基本的Win32 API调用,主要是这些进程线程操作、内存读写、DC设备对象、鼠标键盘模拟等。

4.学习使用CE查找动态内存基址

CE也是一个神器。 对于寻找和解决游戏中的动态显存非常有效。 使用起来并不困难。 学习基本操作需要几天时间。 寻找简单的人物信息和数据很容易,但是对于地图项来说。 ,怪物链表的显存稍微复杂一些。

5.学习OD调试游戏,找到关键CALL

游戏也是编译好的,有功能功能一一组合。 找到一些关键函数的函数入口地址,并分析函数的参数,然后就可以编译CALL代码直接调用游戏中的函数,让它实现自动化。

6. 学习编写CALL代码

对于C语言来说,支持汇编指令的编译,但是easy语言不支持。 幸运的是,网上有人做了一些组装模块。 你可以使用这个程序集来编译CALL调用代码,也可以使用插件workshop模块中的call函数。 () CALL() 调用机器码()等命令。

7.添加并开封包装

使用OD调试游戏中API收发包的上下函数。 这里的函数循环体基本上就是游戏的数据包加上秘密函数。 这两个函数代码你可以分析后自行编译,也可以直接调用游戏中现成的加解密函数体。 还需要分析数据包的封装消息格式。

8. 分析游戏地图和寻路

有些游戏有手动点击行走或者寻找路径的功能,使用起来非常方便。 如果没有这样的功能,就得剖析一下。 这是相当困难的。 这是挂断的唯一方法。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 手游资源 手游封包发送源码-游戏客户端脚本剖析 https://www.wkzy.net/game/146995.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务