龙空技术网

为何你的游戏总是充满不愉快,外挂到底是如何做到的

Exploit 439

前言:

而今我们对“封包加密算法”可能比较关注,小伙伴们都需要分析一些“封包加密算法”的相关资讯。那么小编在网摘上网罗了一些对于“封包加密算法””的相关内容,希望咱们能喜欢,姐妹们快快来学习一下吧!

外挂这个东西相信大家都不陌生,比如你刚刚回到家,累的不行,想打开电脑玩几把游戏,结果,心态爆炸,各种自瞄锁头。透视。举报了还没用,这个就是其他的人将自己的快乐建立在你的基础上,就大家聊聊那些反外挂的事

1.外挂起源

外挂这个事情要追溯到 2000 年。当年星际争霸的开全图,CS 的透视、穿墙等,让游戏完全失去公平竞技性。当时反外挂的概念也呼之欲出。而后随着 PC 端网络游戏的崛起,就很少要有人再去玩或者谈起这些游戏,但是游戏外挂却跟随时代的脚步而不断前进。

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.1 封包的概念 本文所讲的封包是指由sockets协议进行发送与接收的数据包。广义的封包是指计算机之间互相进行通信的数据包,其可以因通信协议的不同而在内容上有所不同。1.2 破解原理 目前破解封包加密与解密算法的方法主要是通过动态调试技术来实现的。其原理是首先通过动态调试跟踪并取出加密与解密算法的代码段,然后再通过分析这些代码最终得出结论。

内存挂再说内存挂,内存挂主要是对游戏数据进行验证,比如伤害,移动速度,血量等等,打个比方,就说以前很流行的变速齿轮(CE类修改内存),早些年游戏没有验证的时候几乎是想要跑多快跑多快,现在都被和谐了,和谐的方式也非常简单,计算人物速度,再取人物的一个坐标到另一个坐标距离,这其中有一定偏差,如果差距超过设定的额度那么就可以判定玩家在使用加速工具。伤害,血值,都类似,任何数据都有算法来计算是否超过了预期最大值。

游戏应用

1、 压枪:压枪技术很多方法可以实现,但高精度的压枪,就需要修改内存或者网络封包,首先获得枪口偏移信息,然后通过鼠标移动的虚拟指令,将准星调到特定点。

2、透视:读取内存中的数据坐标,在屏幕上绘制出应该对玩家隐藏的信息。在OBS推流时,如果选择仅推流游戏,那么这类"信息"仅对直播者可见。

3、自动瞄头:上两者结合获得,获得玩家坐标,然后通过鼠标移动指令完成瞄头。

总结:如果能完美无视枪口跳动时随机的左右偏移量,那么基本可以认为是读取内存的压枪。对于透视的发现则难得多,但是不管装的多像,最终目的肯定还是从这项功能收益。自动瞄头最容易发现。

修改内存/封包类:同时秒杀多人、瞬移、一拳超人、圈外不受伤害等

总结:通过修改内存和封包实现各种丧心病狂的功能,及其容易被封号,也很容易被看出来。

反外挂与外挂的对决

1、对服务器上的数据库进行严格加密,并且每天自动更新随机密码,数据包经常检验,而且效验结果以服务器上为准;

2、对游戏客户端进行严格检测,具体手段有:

(1)对关键api Hook进行保护,网络相关send recv;

(2)dll注入检测可能是hook loadlibrary,也有用定时检测进程模块的(找到非法模块就退出);

(3)对于用od进行调试客户端,还没有完全有效的方法,一般就是加些花指令,加壳,这些方法对大量水平低的外挂作者已经足够了;

(4)很多游戏都会对PE、OD、按键精灵、简单游等进行检测,主要是枚举窗口名字,进程名字,有这些名字的就封杀,但这种低级方法效果不大。

(5)按键类外挂检测,对于后台脚本主要是用GetCursor,GetForegroundWindow,检测窗口位置和鼠标位置是否正确,还有些是对WM_ACTIVE消息进行处理(神武就是这么干),对于前台脚本除了把鼠标弄偏移外,也就没有什么更好的办法了,不过这个偏移对普通玩家也很不友好,也影响游戏公司留存玩家。

(6)对于有些人说检测鼠标点击位置的重复度,这个多半是他们自己的猜想,这样做很容易造成误封。

外挂技术与游戏安全性分析

抵御逆向分析

除了少数通用性外挂(如键盘模拟外挂、通用加速挂)外,绝大部分外挂在制作前均需动态调试和静态分析游戏逻辑和数据,找到关键逻辑和数据的位置,才能对游戏进行修改,因此反调试和保护游戏逻辑是抵御游戏外挂产生的强有力的方式。

阻止外挂入侵

一旦游戏关键逻辑与数据被黑客分析完成,接下来黑客会通过编程对游戏客户端进行修改,修改游戏进程常常通过一些系统函数如 ReadProcessMemory,WriteProcessMemroy ,或者通过向游戏进程注入 dll 等方式修改游戏内存,因此保护游戏内存和恶意模块扫描是进一步防止外挂和被动检查外挂的有效措施。

游戏反外挂先行一步

Virbox 反外挂系统针对游戏安全问题,采用静态保护和动态保护相结合的方式,抵御和打击外挂,为端游保驾护航,目前仅支持 Windows 系统。

静态保护(Virbox Protector)

Virbox Protector 是深思自主研发的虚拟机外壳,用于保护游戏的代码逻辑,强大的虚拟机保护以及为 Unity 游戏设计的独特的 Unity3D 保护,对游戏的逆向分析造成极大的阻碍,有效遏制外挂的产生。

➤ 代码逻辑保护

现代反编译工具日益强大,即使是 C/C++ 这类静态语言编译后的程序,也能将代码还原到与源代码相差无几。没有代码保护,游戏客户端的代码逻辑暴露,很容易被黑客发现攻击的位置,使外挂的编写成本变得很低。

Virbox Protector 可以通过混淆、虚拟机、代码加密等方式对游戏中指定的函数进行保护,保护后的代码无法自动还原,黑客分析混淆和虚拟化的指令需要超过原先几十上百倍的时间。对游戏客户端的关键函数进行保护,每次客户端更新,黑客都需要大量的时间重新分析被保护的代码。

➤ 内存校验

绝大部分外挂的高级功能都采用"内存补丁"的方式对游戏模块进行修改,Virbox Protector 带有内存校验功能,能对游戏代码进行校验,防止被打补丁。(该功能目前不支持 Unity3D 游戏)

Unity3D 保护

Unity 游戏采用 C# 编写,相比于 C/C++ 开发的游戏,Unity 游戏更容易被黑客分析,使用 DnSpy、Reflector 等工具可以直接反编译 Assembly-CSharp.dll 中的代码,游戏代码中的变量与函数名清晰可见。

Virbox Protector 对 Assembly-CSharp.dll 中的方法都进行了加密,只有在该方法运行编译为汇编代码才解密,黑客无法通过 Dump 出原始代码。

动态保护(Virbox 反外挂引擎)

Virbox 反外挂引擎是一款驱动级进程保护系统。该系统结合了主动防御(反调试、内存保护、反注入、Hook 检测等)和被动防御(窗口检测、内存特征扫描等),动态地保护游戏进程。Virbox 反外挂引擎的主要功能如下:

➤ 反调试

编写外挂或者盗版补丁,首先要做的是使用调试器(如 OllyDbg、x64dbg、Windbg、 Cheating Engine 等)调试软件进程,分析关键代码逻辑和数据。Virbox 反外挂引擎对所保护的进程进行调试检测,并防止内核调试器(如 WinDbg)调试 Virbox 反外挂引擎自身,使各种调试器失效,对逆向分析过程造成了极大阻碍。

➤ 内存保护

黑客在分析软件时,除了调试之外,还会通过内存搜索(如使用 Cheating Engine)等方式定位关键数据的内存,另一方面,大部分外挂或是盗版补丁会通过另外的进程修改内存,Virbox 反外挂引擎通过驱动级内存保护,防止其它进程读写、修改被保护的进程,保证了被保护进程的安全。

➤ 反注入

修改进程内存,除了跨进程的内存访问之外,还可以通过注入 Dll 或者 ShellCode 的方式进行,Virbox 反外挂引擎通过内存保护和监控模块加载的方式拦截了绝大部分注入方式,并配合内存特征检测功能,拦截非法模块。

➤ 特征扫描

反外挂引擎可以检测内存特征、窗口特征、模块特征、驱动特征(如 HideToolz, PCHunter, StrongOD 等)

安全问题一定要引起重视,反外挂本身就是一个伴随游戏全生命周期的问题,你所碰到的问题也是其它游戏开发商碰到的问题,你先行一步,解决好反外挂的问题,可以领先其它开发商一大步。

标签: #封包加密算法 #封包加密后是不是会变得毫无规律 #封包解密 #封包解密综合工具 #封包解密综合工具怎么用