收藏 分享(赏)

游戏外挂常用程序.doc

上传人:hskm5268 文档编号:9085722 上传时间:2019-07-23 格式:DOC 页数:38 大小:82.50KB
下载 相关 举报
游戏外挂常用程序.doc_第1页
第1页 / 共38页
游戏外挂常用程序.doc_第2页
第2页 / 共38页
游戏外挂常用程序.doc_第3页
第3页 / 共38页
游戏外挂常用程序.doc_第4页
第4页 / 共38页
游戏外挂常用程序.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、一、 前言 所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作、修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将。虽然,现在对游戏外挂程序的“合法”身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧。随着网络游戏的时代的来临,游戏外挂在原有的功能之上进行了新的发展,它变得更加多种多样,功能更加强大,操作更加简单,以至有些游戏的外挂已经成为一个体系,比如石器时代 ,外挂品种达到了几十种,自动战斗、自动行走、自动练级、自动补血、加速、不遇敌、原地遇敌、快速增加经验值、按键精灵几乎无所不包。游戏外挂的设计主要是针对于某个

2、游戏开发的,我们可以根据它针对的游戏的类型可大致可将外挂分为两种大类。一类是将游戏中大量繁琐和无聊的攻击动作使用外挂自动完成,以帮助玩家轻松搞定攻击对象并可以快速的增加玩家的经验值。比如在龙族中有一种工作的设定,玩家的工作等级越高,就可以驾驭越好的装备。但是增加工作等级却不是一件有趣的事情,毋宁说是重复枯燥的机械劳动。如果你想做法师用的杖,首先需要做基本工作-?砍树。砍树的方法很简单,在一棵大树前不停的点鼠标就可以了,每 10000 的经验升一级。这就意味着玩家要在大树前不停的点击鼠标,这种无聊的事情通过“按键精灵“就可以解决。外挂的“按键精灵“功能可以让玩家摆脱无趣的点击鼠标的工作。另一类是

3、由外挂程序产生欺骗性的网络游戏封包,并将这些封包发送到网络游戏服务器,利用这些虚假信息欺骗服务器进行游戏数值的修改,达到修改角色能力数值的目的。这类外挂程序针对性很强,一般在设计时都是针对某个游戏某个版本来做的,因为每个网络游戏服务器与客户端交流的数据包各不相同,外挂程序必须要对欺骗的网络游戏服务器的数据包进行分析,才能产生服务器识别的数据包。这类外挂程序也是当前最流利的一类游戏外挂程序。另外,现在很多外挂程序功能强大,不仅实现了自动动作代理和封包功能,而且还提供了对网络游戏的客户端程序的数据进行修改,以达到欺骗网络游戏服务器的目的。我相信,随着网络游戏商家的反外挂技术的进展,游戏外挂将会产生

4、更多更优秀的技术,让我们期待着看场技术大战吧三、外挂技术综述可以将开发游戏外挂程序的过程大体上划分为两个部分:前期部分工作是对外挂的主体游戏进行分析,不同类型的外挂分析主体游戏的内容也不相同。如外挂为上述谈到的外挂类型中的第一类时,其分析过程常是针对游戏的场景中的攻击对象的位置和分布情况进行分析,以实现外挂自动进行攻击以及位置移动。如外挂为外挂类型中的第二类时,其分析过程常是针对游戏服务器与客户端之间通讯包数据的结构、内容以及加密算法的分析。因网络游戏公司一般都不会公布其游戏产品的通讯包数据的结构、内容和加密算法的信息,所以对于开发第二类外挂成功的关键在于是否能正确分析游戏包数据的结构、内容以

5、及加密算法,虽然可以使用一些工具辅助分析,但是这还是一种坚苦而复杂的工作。后期部分工作主要是根据前期对游戏的分析结果,使用大量的程序开发技术编写外挂程序以实现对游戏的控制或修改。如外挂程序为第一类外挂时,通常会使用到鼠标模拟技术来实现游戏角色的自动位置移动,使用键盘模拟技术来实现游戏角色的自动攻击。如外挂程序为第二类外挂时,通常会使用到挡截 Sock 和挡截 API 函数技术,以挡截游戏服务器传来的网络数据包并将数据包修改后封包后传给游戏服务器。另外,还有许多外挂使用对游戏客户端程序内存数据修改技术以及游戏加速技术。本文主要是针对开发游戏外挂程序后期使用的程序开发技术进行探讨,重点介绍的如下几

6、种在游戏外挂中常使用的程序开发技术: 动作模拟技术:主要包括键盘模拟技术和鼠标模拟技术。 封包技术:主要包括挡截 Sock 技术和挡截 API 技术。四、动作模拟技术我们在前面介绍过,几乎所有的游戏都有大量繁琐和无聊的攻击动作以增加玩家的功力,还有那些数不完的迷宫,这些好像已经成为了角色游戏的代名词。现在,外挂可以帮助玩家从这些繁琐而无聊的工作中摆脱出来,专注于游戏情节的进展。外挂程序为了实现自动角色位置移动和自动攻击等功能,需要使用到键盘模拟技术和鼠标模拟技术。下面我们将重点介绍这些技术并编写一个简单的实例帮助读者理解动作模拟技术的实现过程。 鼠标模拟技术几乎所有的游戏中都使用了鼠标来改变角

7、色的位置和方向,玩家仅用一个小小的鼠标,就可以使角色畅游天下。那么,我们如何实现在没有玩家的参与下角色也可以自动行走呢。其实实现这个并不难,仅仅几个 Windows API 函数就可以搞定,让我们先来认识认识这些 API 函数。(1) 模拟鼠标动作 API 函数 mouse_event,它可以实现模拟鼠标按下和放开等动作。VOID mouse_event(DWORD dwFlags, / 鼠标动作标识。DWORD dx, / 鼠标水平方向位置。DWORD dy, / 鼠标垂直方向位置。DWORD dwData, / 鼠标轮子转动的数量。DWORD dwExtraInfo / 一个关联鼠标动作辅

8、加信息。); 其中,dwFlags 表示了各种各样的鼠标动作和点击活动,它的常用取值如下:MOUSEEVENTF_MOVE 表示模拟鼠标移动事件。MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键。MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键。MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键。MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键。MOUSEEVENTF_MIDDLEDOWN 表示模拟按下鼠标中键。MOUSEEVENTF_MIDDLEUP 表示模拟放开鼠标中键。(2)、设置和获取当前鼠标位置的 API 函数。获取当前鼠标位置使用

9、GetCursorPos()函数,设置当前鼠标位置使用 SetCursorPos()函数。BOOL GetCursorPos(LPPOINT lpPoint / 返回鼠标的当前位置。);BOOL SetCursorPos(int X, / 鼠标的水平方向位置。int Y /鼠标的垂直方向位置。); 通常游戏角色的行走都是通过鼠标移动至目的地,然后按一下鼠标的按钮就搞定了。下面我们使用上面介绍的API 函数来模拟角色行走过程。CPoint oldPoint,newPoint;GetCursorPos( /保存当前鼠标位置。newPoint.x = oldPoint.x+40;newPoint.y

10、 = oldPoint.y+10;SetCursorPos(newPoint.x,newPoint.y); /设置目的地位置。mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);/模拟按下鼠标右键。mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);/模拟放开鼠标右键。 消息 说明WM_LBUTTONDBLCLK OnLButtonBlclk(UINT nFlag, CPoint point)鼠标左键被双击WM_LBUTTONDDOWN OnLButtonDown(UINT nFlag, CPoint point)鼠标左键被按下W

11、M_LBUTTONDUP OnLButtonUp(UINT nFlag, CPoint point)鼠标左键被释放WM_MBUTTONDBLCLK OnLMButtonBlclk(UINT nFlag, CPoint point)鼠标中间键被双击WM_MBUTTONDDOWN OnLMButtonDown(UINT nFlag, CPoint point)鼠标中间键被压下WM_MBUTTONDUP OnLMButtonUp(UINT nFlag, CPoint point)鼠标中间键被释放WM_MOUSEMOVE OnMoveMove(UINT nFlag, CPoint point)鼠标移动

12、穿过客户区域WM_RBUTTONDBLCKL OnRButtonBlclk(UINT nFlag, CPoint point)鼠标右键被双击WM_RBUTTONDDOWN OnRButtonDown(UINT nFlag, 鼠标右键被按下CPoint point)WM_RBUTTONDUP OnRButtonUp(UINT nFlag, CPoint point)鼠标右键被释放2 键盘模拟技术在很多游戏中,不仅提供了鼠标的操作,而且还提供了键盘的操作,在对攻击对象进行攻击时还可以使用快捷键。为了使这些攻击过程能够自动进行,外挂程序需要使用键盘模拟技术。像鼠标模拟技术一样,Windows API

13、 也提供了一系列 API 函数来完成对键盘动作的模拟。模拟键盘动作 API 函数 keydb_event,它可以模拟对键盘上的某个或某些键进行按下或放开的动作。VOID keybd_event(BYTE bVk, / 虚拟键值。BYTE bScan, / 硬件扫描码。DWORD dwFlags, / 动作标识。DWORD dwExtraInfo / 与键盘动作关联的辅加信息。); 其中,bVk 表示虚拟键值,其实它是一个 BYTE 类型值的宏,其取值范围为 1-254。有关虚拟键值表请在 MSDN 上使用关键字“Virtual-Key Codes”查找相关资料。bScan表示当键盘上某键被按下

14、和放开时,键盘系统硬件产生的扫描码,我们可以 MapVirtualKey()函数在虚拟键值与扫描码之间进行转换。dwFlags 表示各种各样的键盘动作,它有两种取值:KEYEVENTF_EXTENDEDKEY 和 KEYEVENTF_KEYUP。下面我们使用一段代码实现在游戏中按下 Shift+R 快捷键对攻击对象进行攻击。keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); /按下 CTRL 键。keybd_event(0x52,MapVirtualKey(0x52,0),0,0);/键下R 键。keybd_event(0x52,M

15、apVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);/放开 R 键。keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0), KEYEVENTF_KEYUP,0);/放开 CTRL 键。3 激活外挂上面介绍的鼠标和键盘模拟技术实现了对游戏角色的动作部分的模拟,但要想外挂能工作于游戏之上,还需要将其与游戏的场景窗口联系起来或者使用一个激活键,就象按键精灵的那个激活键一样。我们可以用 GetWindow 函数来枚举窗口,也可以用Findwindow 函数来查找特定的窗口。另外还有一个 FindWindowEx函数可以找到窗

16、口的子窗口,当游戏切换场景的时候我们可以用FindWindowEx 来确定一些当前窗口的特征,从而判断是否还在这个场景,方法很多了,比如可以 GetWindowInfo 来确定一些东西,比如当查找不到某个按钮的时候就说明游戏场景已经切换了等等办法。当使用激活键进行关联,需要使用 Hook 技术开发一个全局键盘钩子,在这里就不具体介绍全局钩子的开发过程了,在后面的实例中我们将会使用到全局钩子,到时将学习到全局钩子的相关知识。4 实例实现通过上面的学习,我们已经基本具备了编写动作式游戏外挂的能力了。下面我们将创建一个画笔程序外挂,它实现自动移动画笔字光标的位置并写下一个红色的“R”字。以这个实例为

17、基础,加入相应的游戏动作规则,就可以实现一个完整的游戏外挂。这里作者不想使用某个游戏作为例子来开发外挂(因没有游戏商家的授权啊!) ,如读者感兴趣的话可以找一个游戏试试,最好仅做测试技术用。首先,我们需要编写一个全局钩子,使用它来激活外挂,激活键为 F10。创建全局钩子步骤如下:(1) 选择 MFC AppWizard(DLL)创建项目 ActiveKey,并选择MFC Extension DLL(共享 MFC 拷贝)类型。(2). 插入新文件 ActiveKey.h,在其中输入如下代码:#ifndef _KEYDLL_H#define _KEYDLL_Hclass AFX_EXT_CLASS

18、 CKeyHook:public CObjectpublic:CKeyHook();CKeyHook();HHOOK Start(); / 安装钩子BOOL Stop(); /卸载钩子;#endif (3). 在 ActiveKey.cpp 文件中加入声明 #include ActiveKey.h。(4). 在 ActiveKey.cpp 文件中加入共享数据段,代码如下:/Shared data section#pragma data_seg(“sharedata“)HHOOK glhHook=NULL; /钩子句柄。HINSTANCE glhInstance=NULL; /DLL 实例句柄。

19、#pragma data_seg() (5). 在 ActiveKey.def 文件中设置共享数据段属性,代码如下:SETCTIONSshareddata READ WRITE SHARED (6). 在 ActiveKey.cpp 文件中加入 CkeyHook 类的实现代码和钩子函数代码:/键盘钩子处理函数。extern “C“ LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)if( nCode = 0 )if( wParam = 0X79 )/当按下 F10 键时,激活外挂。/外挂实现代码。CPoint n

20、ewPoint,oldPoint;GetCursorPos(newPoint.x = oldPoint.x+40;newPoint.y = oldPoint.y+10;SetCursorPos(newPoint.x,newPoint.y);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);/模拟按下鼠标左键。mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);/模拟放开鼠标左键。keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); /按下 SHIFT 键。keybd_event(0

21、x52,MapVirtualKey(0x52,0),0,0);/按下 R 键。keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);/放开 R 键。keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);/放开 SHIFT 键。SetCursorPos(oldPoint.x,oldPoint.y);return CallNextHookEx(glhHook,nCode,wParam,lParam);CKeyHook:CKeyHook()CKeyHook:CK

22、eyHook() if( glhHook )Stop();/安装全局钩子。HHOOK CKeyHook:Start() glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);/设置键盘钩子。return glhHook;/卸载全局钩子。BOOL CKeyHook:Stop()BOOL bResult = TRUE;if( glhHook )bResult = UnhookWindowsHookEx(glhHook);/卸载键盘钩子。return bResult; (7). 修改 DllMain 函数,代码如下:ex

23、tern “C“ int APIENTRYDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)/如果使用 lpReserved 参数则删除下面这行 UNREFERENCED_PARAMETER(lpReserved);if (dwReason = DLL_PROCESS_ATTACH)TRACE0(“NOtePadHOOK.DLL Initializing!n“);/扩展 DLL 仅初始化一次 if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance)return 0;new

24、 CDynLinkLibrary(ActiveKeyDLL);/把 DLL 加入动态 MFC 类库中 glhInstance = hInstance;/插入保存 DLL 实例句柄 else if (dwReason = DLL_PROCESS_DETACH)TRACE0(“NotePadHOOK.DLL Terminating!n“);/终止这个链接库前调用它 AfxTermExtensionModule(ActiveKeyDLL);return 1; (8).编译项目 ActiveKey,生成 ActiveKey.DLL 和 ActiveKey.lib。接着,我们还需要创建一个外壳程序将全局

25、钩子安装了Windows 系统中,这个外壳程序编写步骤如下:(1). 创建一个对话框模式的应用程序,项目名为 Simulate。(2). 在主对话框中加入一个按钮,使用 ClassWizard 为其创建CLICK 事件。(3). 将 ActiveKey 项目 Debug 目录下的 ActiveKey.DLL 和ActiveKey.lib 拷贝到 Simulate 项目目录下。(4). 从“ 工程”菜单中选择“设置”,弹出 Project Setting 对话框,选择 Link 标签,在“对象/库模块”中输入 ActiveKey.lib。(5). 将 ActiveKey 项目中的 ActiveK

26、ey.h 头文件加入到 Simulate项目中,并在 Stdafx.h 中加入#include ActiveKey.h。(6). 在按钮单击事件函数输入如下代码:void CSimulateDlg:OnButton1() / TOD Add your control notification handler code hereif( !bSetup )m_hook.Start();/激活全局钩子。elsem_hook.Stop();/撤消全局钩子。bSetup = !bSetup; (7). 编译项目,并运行程序,单击按钮激活外挂。(8). 启动画笔程序,选择文本工具并将笔的颜色设置为红色,将

27、鼠标放在任意位置后,按 F10 键,画笔程序自动移动鼠标并写下一个红色的大写 R。图一展示了按 F10 键前的画笔程序的状态,图二展示了按 F10 键后的画笔程序的状态。五、封包技术通过对动作模拟技术的介绍,我们对游戏外挂有了一定程度上的认识,也学会了使用动作模拟技术来实现简单的动作模拟型游戏外挂的制作。这种动作模拟型游戏外挂有一定的局限性,它仅仅只能解决使用计算机代替人力完成那么有规律、繁琐而无聊的游戏动作。但是,随着网络游戏的盛行和复杂度的增加,很多游戏要求将客户端动作信息及时反馈回服务器,通过服务器对这些动作信息进行有效认证后,再向客户端发送下一步游戏动作信息,这样动作模拟技术将失去原有

28、的效应。为了更好地“外挂”这些游戏,游戏外挂程序也进行了升级换代,它们将以前针对游戏用户界面层的模拟推进到数据通讯层,通过封包技术在客户端挡截游戏服务器发送来的游戏控制数据包,分析数据包并修改数据包;同时还需按照游戏数据包结构创建数据包,再模拟客户端发送给游戏服务器,这个过程其实就是一个封包的过程。封包的技术是实现第二类游戏外挂的最核心的技术。封包技术涉及的知识很广泛,实现方法也很多,如挡截 WinSock、挡截 API函数、挡截消息、VxD 驱动程序等。在此我们也不可能在此文中将所有的封包技术都进行详细介绍,故选择两种在游戏外挂程序中最常用的两种方法:挡截 WinSock 和挡截 API 函

29、数。1 挡截 WinSock众所周知,Winsock 是 Windows 网络编程接口,它工作于Windows 应用层,它提供与底层传输协议无关的高层数据传输编程接口。在 Windows 系统中,使用 WinSock 接口为应用程序提供基于 TCP/IP 协议的网络访问服务,这些服务是由 Wsock32.DLL 动态链接库提供的函数库来完成的。由上说明可知,任何 Windows 基于 TCP/IP 的应用程序都必须通过 WinSock 接口访问网络,当然网络游戏程序也不例外。由此我们可以想象一下,如果我们可以控制 WinSock 接口的话,那么控制游戏客户端程序与服务器之间的数据包也将易如反掌

30、。按着这个思路,下面的工作就是如何完成控制 WinSock 接口了。由上面的介绍可知,WinSock 接口其实是由一个动态链接库提供的一系列函数,由这些函数实现对网络的访问。有了这层的认识,问题就好办多了,我们可以制作一个类似的动态链接库来代替原 WinSock 接口库,在其中实现 WinSock32.dll 中实现的所有函数,并保证所有函数的参数个数和顺序、返回值类型都应与原库相同。在这个自制作的动态库中,可以对我们感兴趣的函数(如发送、接收等函数)进行挡截,放入外挂控制代码,最后还继续调用原 WinSock 库中提供的相应功能函数,这样就可以实现对网络数据包的挡截、修改和发送等封包功能。下

31、面重点介绍创建挡截 WinSock 外挂程序的基本步骤:(1) 创建 DLL 项目,选择 Win32 Dynamic-Link Library,再选择 An empty DLL project。(2) 新建文件 wsock32.h,按如下步骤输入代码: 加入相关变量声明:HMODULE hModule=NULL; /模块句柄char buffer1000; /缓冲区FARPROC proc; / 函数入口指针 定义指向原 WinSock 库中的所有函数地址的指针变量,因WinSock 库共提供 70 多个函数,限于篇幅,在此就只选择几个常用的函数列出,有关这些库函数的说明可参考 MSDN 相关

32、内容。/定义指向原 WinSock 库函数地址的指针变量。SOCKET (_stdcall *socket1)(int ,int,int);/创建 Sock 函数。int (_stdcall *WSAStartup1)(WORD,LPWSADATA);/初始化 WinSock 库函数。int (_stdcall *WSACleanup1)();/清除 WinSock 库函数。int (_stdcall *recv1)(SOCKET ,char FAR * ,int ,int );/接收数据函数。int (_stdcall *send1)(SOCKET ,const char * ,int ,i

33、nt);/发送数据函数。int (_stdcall *connect1)(SOCKET,const struct sockaddr *,int);/创建连接函数。int (_stdcall *bind1)(SOCKET ,const struct sockaddr *,int );/绑定函数。其它函数地址指针的定义略。 (3) 新建 wsock32.cpp 文件,按如下步骤输入代码: 加入相关头文件声明:#include #include #include “wsock32.h“ 添加 DllMain 函数,在此函数中首先需要加载原 WinSock库,并获取此库中所有函数的地址。代码如下:BO

34、OL WINAPI DllMain (HANDLE hInst,ULONG ul_reason_for_call,LPVOID lpReserved)if(hModule=NULL)/加载原 WinSock 库,原 WinSock 库已复制为wsock32.001。hModule=LoadLibrary(“wsock32.001“); else return 1;/获取原 WinSock 库中的所有函数的地址并保存,下面仅列出部分代码。if(hModule!=NULL)/获取原 WinSock 库初始化函数的地址,并保存到WSAStartup1 中。proc=GetProcAddress(hM

35、odule,“WSAStartup“);WSAStartup1=(int (_stdcall *)(WORD,LPWSADATA)proc;/获取原 WinSock 库消除函数的地址,并保存到WSACleanup1 中。proc=GetProcAddress(hModule i,“WSACleanup“);WSACleanup1=(int (_stdcall *)()proc;/获取原创建 Sock 函数的地址,并保存到 socket1 中。proc=GetProcAddress(hModule,“socket“);socket1=(SOCKET (_stdcall *)(int ,int,i

36、nt)proc;/获取原创建连接函数的地址,并保存到 connect1 中。proc=GetProcAddress(hModule,“connect“);connect1=(int (_stdcall *)(SOCKET ,const struct sockaddr *,int )proc;/获取原发送函数的地址,并保存到 send1 中。proc=GetProcAddress(hModule,“send“);send1=(int (_stdcall *)(SOCKET ,const char * ,int ,int )proc;/获取原接收函数的地址,并保存到 recv1 中。proc=Ge

37、tProcAddress(hModule,“recv“);recv1=(int (_stdcall *)(SOCKET ,char FAR * ,int ,int )proc;其它获取函数地址代码略。else return 0;return 1; 定义库输出函数,在此可以对我们感兴趣的函数中添加外挂控制代码,在所有的输出函数的最后一步都调用原 WinSock 库的同名函数。部分输出函数定义代码如下:/库输出函数定义。/WinSock 初始化函数。int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData)/调用原 W

38、inSock 库初始化函数return WSAStartup1(wVersionRequired,lpWSAData);/WinSock 结束清除函数。int PASCAL FAR WSACleanup(void)return WSACleanup1(); /调用原 WinSock 库结束清除函数。/创建 Socket 函数。SOCKET PASCAL FAR socket (int af, int type, int protocol)/调用原 WinSock 库创建 Socket 函数。return socket1(af,type,protocol);/发送数据包函数int PASCAL

39、FAR send(SOCKET s,const char * buf,int len,int flags)/在此可以对发送的缓冲 buf 的内容进行修改,以实现欺骗服务器。外挂代码/调用原 WinSock 库发送数据包函数。return send1(s,buf,len,flags);/接收数据包函数。int PASCAL FAR recv(SOCKET s, char FAR * buf, int len, int flags)/在此可以挡截到服务器端发送到客户端的数据包,先将其保存到 buffer 中。strcpy(buffer,buf);/对 buffer 数据包数据进行分析后,对其按照玩

40、家的指令进行相关修改。外挂代码/最后调用原 WinSock 中的接收数据包函数。return recv1(s, buffer, len, flags);.其它函数定义代码略。(4)、新建 wsock32.def 配置文件,在其中加入所有库输出函数的声明,部分声明代码如下:LIBRARY “wsock32“EXPORTS WSAStartup 1WSACleanup 2recv 3send 4socket 5bind 6closesocket 7connect 8 其它输出函数声明代码略。(5) 、从 “工程”菜单中选择“设置”,弹出 Project Setting 对话框,选择 Link 标签

41、,在“对象/库模块”中输入 Ws2_32.lib。(6) 、编译项目,产生 wsock32.dll 库文件。(7) 、将系统目录下原 wsock32.dll 库文件拷贝到被外挂程序的目录下,并将其改名为 wsock.001;再将上面产生的 wsock32.dll 文件同样拷贝到被外挂程序的目录下。重新启动游戏程序,此时游戏程序将先加载我们自己制作的 wsock32.dll 文件,再通过该库文件间接调用原 WinSock 接口函数来实现访问网络。上面我们仅仅介绍了挡载 WinSock 的实现过程,至于如何加入外挂控制代码,还需要外挂开发人员对游戏数据包结构、内容、加密算法等方面的仔细分析(这个过

42、程将是一个艰辛的过程) ,再生成外挂控制代码。关于数据包分析方法和技巧,不是本文讲解的范围,如您感兴趣可以到网上查查相关资料。(3)、注入外挂代码进入被挂游戏进程中完成了定位和修改程序中调用 API 函数代码后,我们就可以随意设计自定义的 API 函数的替代函数了。做完这一切后,还需要将这些代码注入到被外挂游戏程序进程内存空间中,不然游戏进程根本不会访问到替代函数代码。注入方法有很多,如利用全局钩子注入、利用注册表注入挡截 User32 库中的 API 函数、利用CreateRemoteThread 注入(仅限于 NT/2000) 、利用 BHO 注入等。因为我们在动作模拟技术一节已经接触过全

43、局钩子,我相信聪明的读者已经完全掌握了全局钩子的制作过程,所以我们在后面的实例中,将继续利用这个全局钩子。至于其它几种注入方法,如果感兴趣可参阅 MSDN 有关内容。有了以上理论基础,我们下面就开始制作一个挡截 MessageBoxA 和 recv 函数的实例,在开发游戏外挂程序 时,可以此实例为框架,加入相应的替代函数和处理代码即可。此实例的开发过程如下:(1) 打开前面创建的 ActiveKey 项目。(2) 在 ActiveKey.h 文件中加入 HOOKAPI 结构,此结构用来存储被挡截 API 函数名称、原 API 函数地址和替代函数地址。typedef struct tag_HOOKAPI LPCSTR szFunc;/被 HOOK 的 API 函数名称。PROC pNewProc;/替代函数地址。PROC pOldProc;/原 API 函数地址。HOOKAPI, *LPHOOKAPI; (3) 打开 ActiveKey.cpp 文件,首先加入一个函数,用于定位输入库在输入数据段中的 IAT 地址。代码如下:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报