学习啦>学习电脑>网络知识>网络技术>

网络游戏外挂技术

时间: 晓斌668 分享

  网络游戏外挂技术想必很多人都是听过或者使用过,但是真正怎么取制作想必很多人都是不清楚的。所以学习啦小编今天就在这里给大家分享下网络游戏外挂技术的知识。下面是具体内容:

  网络游戏外挂技术引言

  所谓游戏外挂,是一种游戏外部的辅助程序,它可以帮助玩家自动生成游戏动作、修改游戏的网络数据封包等,使玩家以最少的时间和精力完成游戏中的各种任务。随着网络游戏的不断升温,游戏外挂作为其附属品也得到了迅猛的发展。从最初的鼠标键盘模拟和变速齿轮技术发展到挡截Sock、挡截API等高端技术的应用。

  事物都有两面性,游戏外挂也不例外。一方面,它可以使玩家从机械的、重复的操作中解放出来,使游戏更加人性化,娱乐化。另一方面,一些恶意外挂篡改游戏数据,欺骗服务器,严重破坏了游戏的公平性,使玩家大量流失。因此,外挂的开发应仅限于研究和学习编程技术之用。

  1 外挂技术综述

  外挂的种类纷繁复杂,功能也多种多样。针对同一款网络游戏的外挂甚至多达几十种,功能相同的外挂实现起来也有若干种不同的技术,例如本文下面要谈到的某网络斗地主游戏记牌器外挂的实现方式至少有三种,通过分析屏幕扑克牌的图片、通过读取游戏在本地机所使用的内存空间、截获并分析数据封包。因此对网游外挂做一个科学的分类显得十分必要。按照外挂所针对的游戏类型,可以把其分为两大类即,模拟玩家鼠标、键盘操作的动作模拟类外挂和截获数据封包,提取或修改其中数据的封包类外挂。下面对两类外挂所采用的技术进行详细说明。

  1.1 动作模拟类外挂

  动作模拟类外挂可以在没有人为干预的情况下,自动控制游戏中的角色,使其四处行走或者发动攻击。此类外挂看似复杂,其实原理非常简单。游戏中角色的行动是靠鼠标与键盘控制,此类外挂就是调用相关的API函数,来模拟玩家对鼠标和键盘的操作,从而控制游戏中的角色。

  1.1.1 鼠标模拟技术

  鼠标的操作包含以下几种,点击左键、点击右键、点击中键、移动鼠标改变相应窗体中指针的位置。下面介绍实现以上操作所需要的API函数。

  1)mouse_event函数,模拟鼠标发出按下和放开左右键的动作,其格式如下:

  VOID mouse_event(

  DWORD dwFlags, // 鼠标动作标识

  DWORD dx, // 鼠标横坐标位置

  DWORD dy, // 鼠标纵坐标位置

  DWORD dwData, // 鼠标轮子转动的数量

  DWORD dwExtraInfo // 其它信息

  );

  其中,dwFlags表示各种鼠标动作,如MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键、MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键、MOUSEEVENTF_MOVE表示模拟鼠标移动事件等。

  2)GetCursorPos函数,获取鼠标当前位置,其格式如下:

  BOOL GetCursorPos(

  LPPOINT lpPoint // 返回鼠标的当前位置

  );

  3)SetCursorPos函数,设置当前鼠标位置,其格式如下:

  BOOL SetCursorPos(

  int X, // 鼠标的横坐标

  int Y //鼠标的纵坐标

  );

  游戏中角色的移动一般是将鼠标移动到目的地,然后按下鼠标左键来完成的。下面利用上面介绍的API函数来模拟角色的移动。

  CPoint oldPoint,newPoint;   GetCursorPos(&oldPoint); //保存当前鼠标位置

  newPoint=SetPoint(oldPoint);//SetPoint为自编的坐标设置函数

  SetCursorPos(newPoint.x,newPoint.y); //设置目的地位置

  mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键

  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键

  1.1.2 键盘模拟技术

  键盘的操作比较简单,只有按键的按下与放开两种。通过keydb_event函数模拟键盘动作,其格式如下:

  VOID keybd_event(

  BYTE bVk, // 虚拟键值

  BYTE bScan, // 硬件扫描码

  DWORD dwFlags, // 动作标识

  DWORD dwExtraInfo //辅加信息

  );

  下面利用该函数来模拟按下Ctrl+C的操作。

  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL键

  keybd_event(0x43,MapVirtualKey(0x43,0),0,0);//键下C键

  keybd_event(0x43,MapVirtualKey(0x43,0), KEYEVENTF_KEYUP,0);//放开C键

  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),

  KEYEVENTF_KEYUP,0);//放开CTRL键

  其中,MapVirtualKey函数功能是在虚拟键值与扫描码之间进行转换。

  1.2 封包类外挂

  网络游戏最大的特点在于分布在各地的玩家之间可以相互通信,实现这个功能的关键是玩家在游戏中所做的任何操作,都会以数据封包的形式发送至服务器,服务器经过处理后再把数据封包反馈给游戏中的玩家们。

  封包类外挂利用网络游戏这个特点,在客户端拦截服务器发送来的数据封包,采用特定的方法对封包内的数据进行分析,最后按照需要修改封包内的数据模拟客户端发送至服务器。此类外挂实现的关键技术涉及两个方面:封包截获与封包数据的分析。

  1.2.1 封包截获

  API Hook技术是封包截获的核心,是指拦截API调用的过程。API Hook技术的应用十分广泛,如实时翻译系统中屏幕取词功能。API Hook一般由两部分组成:Hook服务器和Hook驱动器。Hook服务器一般以exe的形式出现,主要负责把Hook驱动器注入到目标进程或模块中。Hook驱动器一般以DLL的形式出现,主要负责API的拦截工作。至此,又涉及到两个核心技术:DLL注入技术与API拦截技术。

  1.3DLL注入技术

  DLL的注入方法有很多种,由于篇幅有限,只介绍两种比较常用的方法,即利用全局钩子进行DLL注入和利用远程线程进行DLL注入。下面分别介绍。

  全局钩子必须在DLL中也就是Hook驱动器中实现,原理是当待注入进程在接收到某一消息时,消息不会先到这个进程,而是先到DLL中的钩子函数中,由钩子先处理这个消息后再传递到接收这个消息的进程中。

  也就是说,当待注入进程的消息被一个钩子截获时,相当于这个进程调用了DLL中的钩子函数,系统便会强制把DLL文件映射到这个进程的地址空间中,供这个进程使用。以上是利用全局钩子进行DLL注入的全过程。可以通过SetWindowsHookEx函数在系统中安装钩子,通过UnHookWindowsHookEx卸载钩子。

  利用远程线程进行DLL注入的步骤:

  利用OpenProcess函数取得远程进程的进程ID;

  利用VirtualAllocEx函数在远程进程空间中分配一段内存用来存放要注入的DLL完整路径

  ;利用WriteProcessMemory函数将要注入的DLL的路径写到刚才分配的远程进程空间;

  利用GetProcAddress函数从Kernel32.dll中取得LoadLibray的地址

  ;利用CreateRemoteThread函数以从Kernel32.dll中取得的LoadLibrary函数的地址为线程函数的地址,以我们要注入的DLL文件名为参数,创建远程线程。

  1.4API拦截技术

  API拦截的实现方法也有多种,本文重点介绍两种最为常用的技术,即挡截Winsock和挡截API函数。

  Winsock是Windows网络编程接口。在Windows系统中,使用Winsock接口为应用程序提供基于TCP/IP协议的网络访问服务,而这些服务是由Wsock32.DLL提供的函数库来完成的。因此,任何Windows基于TCP/IP的应用程序都必须通过Winsock接口访问网络。挡截Winsock的原理是由自己写一个与原有进程调用的Wsock32.DLL具有相同接口函数的DLL,再用重写的DLL替换原有的DLL。在替换的过程中,可以对感兴趣的函数进行挡截,放入外挂控制代码,而对其它不感兴趣的函数,则以函数转发的形式调用原有Wsock32.DLL中的函数。

  实现挡截API的常用方法是改写执行代码,主要步骤是:利用GetProcAddress函数获取所要挡截的API函数的地址;利用VirtualQuery函数查询关于本进程内虚拟地址页的信息,利用VirtualProtect函数改变本进程内虚拟地址页的保护属性;利用WriteProcessMemory函数修改原API函数执行代码的前8个字节,使得对该API函数的调用能转向自定义的函数调用。除此之外,还可以通过改写PE文件的输入地址表来实现挡截API的功能,有关此方法可以参见MSDN的相关内容。   1.2.2 封包数据分析

  封包数据分析的过程非常复杂,需要分析人员有极大的耐心和毅力。首先,封包内数据的格式很复杂,需要经过反复的试验与分析,才能得出数据中每个字节在游戏中所表示的含意。其次,绝大部分游戏对封包内的数据进行了加密处理。在网络游戏出现的初期,只要掌握几种简单的加密解密算法,就可以通过对封包内数据的分析得出封包的加密解密算法。但随着机器性能的提高与网络带宽的提升,游戏开发商对封包的加密与解密算法设计的越来越复杂,单纯的通过封包内数据的分析已经很难推出加密解密算法。目前破解封包加密与解密算法的方法主要是通过动态调试技术来实现的。

  其原理是首先通过动态调试跟踪并取出加密与解密算法的代码段,然后再通过分析这些代码最终得出结论。动态调试主要是跟踪代码的执行,一般跟踪的起点可以是windows消息、socket中的send与recv等函数。动态调试工具一般采用OllyDbg,softice等工具。动态调试工具所跟踪的代码都是以汇编语言的形式反馈给用户,汇编语言相对高级语言难以读懂,一般可以通过代码反推导将汇编语言转换为相应的高级语言,

  步骤如下:首先,可以将汇编码写成三元表达码,其次,将代码中的转移指令转换为条件语句或循环语句,再次,将代码中的变量进行迭代,最后,进行变量形式转换与语句形式转换。当然我们对代码进行动态调试的目的是为了掌握封包的加密算法,进而对封包中的数据进行分析,通过大量的实验,最终读懂封包中重要数据的含意。为后面的编程工作做好准备。

  2 结束结

  外挂程序对网络游戏的环境安全和健康发展有着极大的影响,防治外挂必然要对外挂的实现技术有所了解。但防治外挂仅靠技术手段是很难实现的,因为在网络世界没有什么是绝对安全绝对保密的。技术手段只能是尽可能的加大外挂制作的难度,拖延外挂开发的时间而已,并不可能完全杜绝外挂。因此外挂的防治必须要多管齐下,尤其是加强游戏信用体制的建设,完善相应的法律法规,以促进网络游戏更好,更快的发展。

387462