怎么作外挂

一:什么叫外挂? 

如今的网络游戏可能是基于Internet上客户/服务器模式,服务端程序运行在游戏服务器上,游戏的设计者在其中创造一个庞大的游戏空间,各地的 玩家能够经过运行客户端程序同时登陆到游戏中。简单地说,网络游戏实际上就是由游戏开发商提供一个游戏环境,而玩家们就是在这个环境中相对自由和开放地进 行游戏操做。那么既然在网络游戏中有了服务器这个概念,咱们之前传统的修改游戏方法就显得无能为力了。记得咱们在单机版的游戏中,为所欲为地经过内存搜索 来修改角色的各类属性,这在网络游戏中就没有任何用处了。由于咱们在网络游戏中所扮演角色的各类属性及各类重要资料都存放在服务器上,在咱们本身机器上 (客户端)只是显示角色的状态,因此经过修改客户端内存里有关角色的各类属性是不切实际的。那么是否咱们就没有办法在网络游戏中达到咱们修改的目的?回答 是"否"。咱们知道Internet客户/服务器模式的通信通常采用TCP/IP通讯协议,数据交换是经过IP数据包的传输来实现的,通常来讲咱们客户端 向服务器发出某些请求,好比移动、战斗等指令都是经过封包的形式和服务器交换数据。那么咱们把本地发出消息称为SEND,意思就是发送数据,服务器收到我 们SEND 的消息后,会按照既定的程序把有关的信息反馈给客户端,好比,移动的坐标,战斗的类型。那么咱们把客户端收到服务器发来的有关消息称为 RECV。知道了这个道理,接下来咱们要作的工做就是分析客户端和服务器之间往来的数据(也就是封包),这样咱们就能够提取到对咱们有用的数据进行修改, 而后模拟服务器发给客户端,或者模拟客户端发送给服务器,这样就能够实现咱们修改游戏的目的了。目前除了修改游戏封包来实现修改游戏的目的,咱们也能够修 改客户端的有关程序来达到咱们的要求。咱们知道目前各个服务器的运算能力是有限的,特别在游戏中,游戏服务器要计算游戏中全部玩家的情况几乎是不可能的, 因此有一些运算仍是要依靠咱们客户端来完成,这样又给了咱们修改游戏提供了一些便利。好比咱们能够经过将客户端程序脱壳来发现一些程序的判断分支,经过跟 踪调试咱们能够把一些对咱们不利的判断去掉,以此来知足咱们修改游戏的需求。在下几个章节中,咱们将给你们讲述封包的概念,和修改跟踪客户端的有关知识。 你们准备好了吗? 

游戏数据格式和存储: 

在进行咱们的工做以前,咱们须要掌握一些关于计算机中储存数据方式的知识和游戏中储存数据的特色。本章节是提供给菜鸟级的玩家看的,若是你是高手 就能够跳过了,呵呵!  若是,你想成为无坚不摧的剑客,那么,这些东西就会花掉你一些时间;若是,你只想做个江湖的游客的话,那么这些东西,了解与否无 关紧要。是做剑客,仍是做游客,你选择吧! 

如今咱们开始!首先,你要知道游戏中储存数据的几种格式,这几种格式是:字节(BYTE)、字(WORD)和双字(DOUBLE WORD),或 者说是8位、16位和32位储存方式。字节也就是8位方式能储存0~255的数字;字或说是16位储存方式能储存0~65535的数;双字即32位方式能 储存0~4294967295的数。 

为什么要了解这些知识呢?在游戏中各类参数的最大值是不一样的,有些可能100左右就够了,好比,金庸群侠传中的角色的等级、随机遇敌个数等等。而有 些却须要大于255甚至大于65535,象金庸群侠传中角色的金钱值可达到数百万。因此,在游戏中各类不一样的数据的类型是不同的。在咱们修改游戏时须要 寻找准备修改的数据的封包,在这种时候,正确判断数据的类型是迅速找到正确地址的重要条件。 

在计算机中数据以字节为基本的储存单位,每一个字节被赋予一个编号,以肯定各自的位置。这个编号咱们就称为地址。 

在须要用到字或双字时,计算机用连续的两个字节来组成一个字,连续的两个字组成一个双字。而一个字或双字的地址就是它们的低位字节的地址。如今我 们经常使用的Windows 9x操做系统中,地址是用一个32位的二进制数表示的。而在平时咱们用到内存地址时,老是用一个8位的16进制数来表示它。  算法

 

二进制和十六进制又是怎样一回事呢? 

简单说来,二进制数就是一种只有0和1两个数码,每满2则进一位的计数进位法。一样,16进制就是每满十六就进一位的计数进位法。16进制有 0--F十六个数字,它为表示十到十五的数字采用了A、B、C、D、E、F六个数字,它们和十进制的对应关系是:A对应于10,B对应于11,C对应于 12,D对应于 13,E对应于14,F对应于15。并且,16进制数和二进制数间有一个简单的对应关系,那就是;四位二进制数至关于一位16进制数。比 如,一个四位的二进制数1111就至关于16进制的F,1010就至关于A。 

了解这些基础知识对修改游戏有着很大的帮助,下面我就要谈到这个问题。因为在计算机中数据是以二进制的方式储存的,同时16进制数和二进制间的转 换关系十分简单,因此大部分的修改工具在显示计算机中的数据时会显示16进制的代码,并且在你修改时也须要输入16进制的数字。你清楚了吧? 

在游戏中看到的数据可都是十进制的,在要寻找并修改参数的值时,可使用Windows提供的计算器来进行十进制和16进制的换算,咱们能够在开始菜单里的程序组中的附件中找到它。 

如今要了解的知识也差很少了!不过,有个问题在游戏修改中是须要注意的。在计算机中数据的储存方式通常是低位数储存在低位字节,高位数储存在高位字节。好比,十进制数41715转换为16进制的数为A2F3,但在计算机中这个数被存为F3A2。 

看了以上内容你们对数据的存贮和数据的对应关系都了解了吗? 好了,接下来咱们要告诉你们在游戏中,封包究竟是怎么一回事了,来!你们把袖口卷起来,让咱们来干活吧! 


------------------------------------------------------------------------------------------------------------------
二:什么是封包? 

怎么截获一个游戏的封包?怎么去检查游戏服务器的ip地址和端口号? Internet用户使用的各类信息服务,其通信的信息最终都可以归结为以 IP包为单位的信息传送,IP包除了包括要传送的数据信息外,还包含有信息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一 台路由器收到一个IP数据包时,它将根据数据包中的目的IP地址项查找路由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包 后继续转发,直至发到目的地。路由器之间能够经过路由协议来进行路由信息的交换,从而更新路由表。 

那么咱们所关心的内容只是IP包中的数据信息,咱们可使用许多监听网络的工具来截获客户端与服务器之间的交换数据,下面就向你介绍其中的一种工具:WPE。 

WPE使用方法:执行WPE会有下列几项功能可选择: 

SELECT GAME选择目前在记忆体中您想拦截的程式,您只需双击该程式名称便可。 

TRACE追踪功能。用来追踪撷取程式送收的封包。WPE必须先完成点选欲追踪的程式名称,才可使用此项目。按下Play键开始撷取程式收送的 封包。您能够随时按下 | | 暂停追踪,想继续时请再按下 | | 。按下正方形能够中止撷取封包而且显示全部已撷取封包内容。若您没按下正方形中止 键,追踪的动做将依照OPTION里的设定值自动中止。若是您没有撷取到资料,试试将OPTION里调整为Winsock Version 2。 WPE 及 Trainers 是设定在显示至少16 bits 颜色下才可执行。 

FILTER过滤功能。用来分析所撷取到的封包,而且予以修改。 

SEND PACKET送出封包功能。可以让您送出假造的封包。 

TRAINER MAKER制做修改器。 

OPTIONS设定功能。让您调整WPE的一些设定值。 

FILTER的详细教学 

- 当FILTER在启动状态时 ,ON的按钮会呈现红色。- 当您启动FILTER时,您随时能够关闭这个视窗。FILTER将会保留在原来的 状态,直到您再按一次 on / off 钮。- 只有FILTER启用钮在OFF的状态下,才能够勾选Filter前的方框来编辑修改。- 当您想编辑 某个Filter,只要双击该Filter的名字便可。  服务器

 

NORMAL MODE: 

范例: 

当您在 Street Fighter Online [快打旋风线上版]游戏中,您使用了两次火球并且击中了对方,这时您会撷取到如下的封 包:SEND-> 0000 08 14 21 06 01 04 SEND-> 0000 02 09 87 00 67 FF A4 AA 11 22 00 00 00 00 SEND-> 0000 03 84 11 09 11 09 SEND-> 0000 0A 09 C1 10 00 00 FF 52 44 SEND-> 0000 0A 09 C1 10 00 00 66 52 44 

您的第一个火球让对方减了16滴[16 = 10h]的生命值,而您观察到第4跟第5个封包的位置4有10h的值出现,应该就是这里了。 

您观察10h前的0A 09 C1在两个封包中都没改变,可见得这3个数值是发出火球的关键。 

所以您将0A 09 C1 10填在搜寻列[SEARCH],而后在修改列[MODIFY]的位置4填上FF。如此一来,当您再度发出火球时,FF会取代以前的10,也就是攻击力为255的火球了! 

ADVANCED MODE: 

范例:当您在一个游戏中,您不想要用真实姓名,您想用修改过的假名传送给对方。在您使用TRACE后,您会发现有些封包里面有您的名字出现。假设 您的名字是 Shadow,换算成16进位则是[53 68 61 64 6F 77];而您打算用moon[6D 6F 6F 6E 20 20]来取 代他。 1) SEND-> 0000 08 14 21 06 01 042) SEND-> 0000 01 06 99 53 68 61 64 6F 77 00 01 05 3) SEND-> 0000 03 84 11 09 11 094) SEND-> 0000 0A 09 C1 10 00 53 68 61 64 6F 77 00 11 5) SEND-> 0000 0A 09 C1 10 00 00 66 52 44 

可是您仔细看,您的名字在每一个封包中并非出如今相同的位置上 

- 在第2个封包里,名字是出如今第4个位置上- 在第4个封包里,名字是出如今第6个位置上 

在这种状况下,您就须要使用ADVANCED MODE- 您在搜寻列[SEARCH]填上:53 68 61 64 6F 77 [请务必从位 置1开始填]- 您想要从原来名字Shadow的第一个字母开始置换新名字,所以您要选择从数值被发现的位置开始替代连续数值 [from the position of the chain found]。- 如今,在修改列[MODIFY]000的位置填 上:6D 6F 6F 6E 20 20 [此为相对应位置,也就是从原来搜寻栏的+001位置开始递换]- 若是您想从封包的第一个位置就修改数值,请 选择[from the beginning of the packet] 

了解一点TCP/IP协议常识的人都知道,互联网是将信息数据打包以后再传送出去的。每一个数据包分为头部信息和数据信息两部分。头部信息包括数据 包的发送地址和到达地址等。数据信息包括咱们在游戏中相关操做的各项信息。那么在作截获封包的过程以前咱们先要知道游戏服务器的IP地址和端口号等各类信 息,实际上最简单的是看看咱们游戏目录下,是否有一个SERVER.INI的配置文件,这个文件里你能够查看到个游戏服务器的IP地址,好比金庸群侠传就 是如此,那么除了这个咱们还能够在DOS下使用NETSTAT这个命令, 

NETSTAT命令的功能是显示网络链接、路由表和网络接口信息,可让用户得知目前都有哪些网络链接正在运做。或者你可使用木马客星等工具来查看网络链接。工具是不少的,看你喜欢用哪种了。 

NETSTAT命令的通常格式为:NETSTAT [选项] 

命令中各选项的含义以下:-a 显示全部socket,包括正在监听的。-c 每隔1秒就从新显示一遍,直到用户中断它。-i 显示全部网络接口 的信息。-n 以网络IP地址代替名称,显示出网络链接情形。-r 显示核心路由表,格式同"route -e"。-t 显示TCP协议的链接状况。 -u 显示UDP协议的链接状况。-v 显示正在进行的工做。 

-------------------------------------------------------------------------------- 

三:怎么来分析咱们截获的封包? 

首先咱们将WPE截获的封包保存为文本文件,而后打开它,这时会看到以下的数据(这里咱们以金庸群侠传里PK店小二客户端发送的数据为例来说解): 

第一个文 件:SEND-> 0000 E6 56 0D 22 7E 6B E4 17 13 13 12 13 12 13 67 1BSEND-> 0010 17 12 DD 34 12 12 12 12 17 12 0E 12 12 12 9BSEND-> 0000 E6 56 1E F1 29 06 17 12 3B 0E 17 1ASEND-> 0000 E6 56 1B C0 68 12 12 12 5ASEND-> 0000 E6 56 02 C8 13 C9 7E 6B E4 17 10 35 27 13 12 12SEND-> 0000 E6 56 17 C9 12网络

 

第二个文 件:SEND-> 0000 83 33 68 47 1B 0E 81 72 76 76 77 76 77 76 02 7ESEND-> 0010 72 77 07 1C 77 77 77 77 72 77 72 77 77 77 6DSEND-> 0000 83 33 7B 94 4C 63 72 77 5E 6B 72 F3SEND-> 0000 83 33 7E A5 21 77 77 77 3FSEND-> 0000 83 33 67 AD 76 CF 1B 0E 81 72 75 50 42 76 77 77SEND-> 0000 83 33 72 AC 77 

咱们发现两次PK店小二的数据格式同样,可是内容却不相同,咱们是PK的同一个NPC,为何会不一样呢? 原来金庸群侠传的封包是通过了加密运算才在网路上传输的,那么咱们面临的问题就是如何将密文解密成明文再分析了。 

由于通常的数据包加密都是异或运算,因此这里先讲一下什么是异或。简单的说,异或就是"相同为0,不一样为1"(这是针对二进制按位来说的),举个 例子,0001和0010异或,咱们按位对比,获得异或结果是0011,计算的方法是:0001的第4位为0,0010的第4位为0,它们相同,则异或结 果的第4位按照"相同为0,不一样为1"的原则获得0,0001的第3位为 0,0010的第3位为0,则异或结果的第3位获得0,0001的第2位为 0,0010的第2位为1,则异或结果的第2位获得1,0001的第1位为1, 0010的第1位为0,则异或结果的第1位获得1,组合起来就是 0011。异或运算从此会遇到不少,你们能够先熟悉熟悉,熟练了对分析颇有帮助的。 

下面咱们继续看看上面的两个文件,按照常理,数据包的数据不会所有都有值的,游戏开发时会预留一些字节空间来便于往后的扩充,也就是说数据包里会 存在一些 "00"的字节,观察上面的文件,咱们会发现文件一里不少"12",文件二里不少"77",那么这是否是表明咱们说的"00"呢?推理到这里, 咱们就开始行动吧! 

咱们把文件一与"12"异或,文件二与"77"异或,固然用手算很费事,咱们使用"M2M 1.0 加密封包分析工具"来计算就方便多了。获得下面的结果: 

第一个文 件:1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 892 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 083 SEND-> 0000 F4 44 09 D2 7A 00 00 00 484 SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 005 SEND-> 0000 F4 44 05 DB 00 

第二个文 件:1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 70 6B 00 00 00 00 05 00 05 00 00 00 1A2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 843 SEND-> 0000 F4 44 09 D2 56 00 00 00 484 SEND-> 0000 F4 44 10 DA 01 B8 6C 79 F6 05 02 27 35 01 00 005 SEND-> 0000 F4 44 05 DB 00 

哈,这一下两个文件大部分都同样啦,说明咱们的推理是正确的,上面就是咱们须要的明文! 

接下来就是搞清楚一些关键的字节所表明的含义,这就须要截获大量的数据来分析。 

首先咱们会发现每一个数据包都是"F4 44"开头,第3个字节是变化的,可是变化颇有规律。咱们来看看各个包的长度,发现什么没有?对了,第3个 字节就是包的长度!经过截获大量的数据包,咱们判断第4个字节表明指令,也就是说客户端告诉服务器进行的是什么操做。例如向服务器请求战斗指令 为"30",战斗中移动指令为 "D4"等。 接下来,咱们就须要分析一下上面第一个 包"F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89", 在这个包里包含什么信息呢?应该有通知服务器你PK的哪一个NPC吧,咱们就先来找找这个店小二的代码在什么地方。咱们再PK一个小喽罗(就是大理客栈外的 那个 咯):SEND-> 0000 F4 44 1F 30 D4 75 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 8A 19 00 00 00 00 11 00 02 00 00 00 C0 我 们根据常理分析,游戏里的NPC种类虽然不会超过65535(FFFF),但开发时不会把本身限制在字的范围,那样不利于游戏的扩充,因此咱们在双字里看 看。经过"店小二"和"小喽罗"两个包的对比,咱们把目标放在"6C 79 F6 05"和"CF 26 00 00"上。(对比一下很容易的,但你不能 太迟钝咯,呵呵)咱们再看看后面的包,在后面的包里应该还会出现NPC的代码,好比移动的包,游戏容许观战,服务器必然须要知道NPC的移动坐标,再广播 给观战的其余玩家。在后面第4个 包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00"里咱们又看到 了"6C 79 F6 05",初步判定店小二的代码就是它了!(这分析里边包含了不少工做的,你们能够用WPE截下数据来本身分析分析)  socket

 

第一个包的分析暂时就到这里(里面还有的信息咱们暂时不须要彻底清楚了)  咱们看看第4个 包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00",再截获PK黄 狗的包,(狗会出来2只哦)看看包的格 式:SEND-> 0000 F4 44 1A DA 02 0B 4B 7D F6 05 02 27 35 01 00 00SEND-> 0010 EB 03 F8 05 02 27 36 01 00 00  根据上面的分析,黄狗的代码为"4B 7D F6 05"(100040011),不过两只黄狗服务器怎样分辨呢?看 看"EB 03 F8 05"(100140011),是上一个代码加上100000,呵呵,这样服务器就能够认出两只黄狗了。咱们再经过野外遇敌截获的 数据包来证明,果真如此。  那么,这个包的格式应该比较清楚了:第3个字节为包的长度,"DA"为指令,第5个字节为NPC个数,从第7个字节开始的10个字节表明一个NPC的信息,多一个NPC就多10个字节来表示。  你们若是玩过网金,必然知道随机遇敌有时会出现增援,咱们就利用游戏这个增援来让每次战斗都会出现增援的NPC吧。  经过在战斗中出现增援截获的数据包,咱们会发现服务器端发送了这样一个 包:F4 44 12 E9 EB 03 F8 05 02 00 00 03 00 00 00 00 00 00 第5-第8个字节为增援NPC的代 码(这里咱们就简单的以黄狗的代码来举例)。那么,咱们就利用单机代理技术来同时欺骗客户端和服务器吧!  好了,呼叫NPC的工做到这里算是完成了一小半,接下来的事情,怎样修改封包和发送封包,咱们下节继续讲解吧。  --------------------------------------------------------------------------------  四:怎么冒充"客户端"向"服务器"发咱们须要的封包?  这里咱们须要使用一个工具,它位于客户端和服务器端之间,它的工做就是进行数据包的接收和转发,这个工具咱们称为代理。若是代理的工做单纯就是接 收和转发的话,这就毫无心义了,可是请注意:全部的数据包都要经过它来传输,这里的意义就重大了。咱们能够分析接收到的数据包,或者直接转发,或者修改后 转发,或者压住不转发,甚至伪造咱们须要的封包来发送。  下面咱们继续讲怎样来同时欺骗服务器和客户端,也就是修改封包和伪造封包。 经过咱们上节的分析,咱们已经知道了打多个NPC的封包格式,那么咱们就动手吧!  首先咱们要查找客户端发送的包,找到战斗的特征,就是请求战斗的第1个包,咱们找"F4 44 1F 30"这个特征,这是不会改变的,固然是要 解密后来查找哦。 找到后,表示客户端在向服务器请求战斗,咱们不动这个包,转发。继续向下查找,这时须要查找的特征码不太好办,咱们先查找"DA",这 是客户端发送NPC信息的数据包的指令,那么可能其余包也有"DA",不要紧,咱们看前3个字节有没有"F4 44"就好了。找到后,咱们的工做就开始 了!  咱们肯定要打的NPC数量。这个数量不能很大,缘由在于网金的封包长度用一个字节表示,那么一个包能够有255个字节,咱们上面分析过,增长一个NPC要增长10个字节,因此你们算算就知道,打20个NPC比较合适。  而后咱们要把客户端原来的NPC代码分析计算出来,由于增长的NPC代码要加上100000哦。再把咱们增长的NPC代码计算出来,而且组合成新的封包,注意表明包长度的字节要修改啊,而后转发到服务器,这一步在编写程序的时候要注意算法,不要形成较大延迟。  上面咱们欺骗服务器端完成了,欺骗客户端就简单了,^-^  发送了上面的封包后,咱们根据新增NPC代码构造封包立刻发给客户端,格式就是"F4 44 12 E9 NPC代 码 02 00 00 03 00 00 00 00 00 00",把每一个新增的NPC都构造这样一个包,按顺序连在一块儿发送给客户端,客户端也就被我 们骗过了… 这只是理论上的东西,更多了解仍是要本身动手一遍一遍的失败后才能了解~再慢慢精通写出能用的东西~~呵呵~~