edit_note帖子
244
stars积分
262,219
event加入
2011-01-27
休闲灌水
wpe封包的使用详细教程 .
schedule发表于 2011-06-12 19:51:00
visibility查看 1,887
chat_bubble回复 2
#1 楼主
本教程来自网络,想学习就慢慢的看吧,够长而且不是一般的难,够得你看的,哈哈。。。。附带TXT,可下载到手机慢慢看。
wpe 封包的使用详细教程 现在我们开始!
首先,你要知道游戏中储存数据的几种格式,这几种格式是: 字节(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 会有下列几项功能可选择: 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 1B SEND-> 0010 17 12 DD 34 12 12 12 12 17 12 0E 12 12 12 9B SEND-> 0000 E6 56 1E F1 29 06 17 12 3B 0E 17 1A SEND-> 0000 E6 56 1B C0 68 12 12 12 5A SEND-> 0000 E6 56 02 C8 13 C9 7E 6B E4 17 10 35 27 13 12 12 SEND-> 0000 E6 56 17 C9 12 第二个文件: 复制内容到剪贴板 代码: 代码 SEND-> 0000 83 33 68 47 1B 0E 81 72 76 76 77 76 77 76 02 7E SEND-> 0010 72 77 07 1C 77 77 77 77 72 77 72 77 77 77 6D SEND-> 0000 83 33 7B 94 4C 63 72 77 5E 6B 72 F3 SEND-> 0000 83 33 7E A5 21 77 77 77 3F SEND-> 0000 83 33 67 AD 76 CF 1B 0E 81 72 75 50 42 76 77 77 SEND-> 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 09 SEND-> 0010 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 08 3 SEND-> 0000 F4 44 09 D2 7A 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00 5 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 09 SEND-> 0010 05 00 70 6B 00 00 00 00 05 00 05 00 00 00 1A 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 84 3 SEND-> 0000 F4 44 09 D2 56 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 B8 6C 79 F6 05 02 27 35 01 00 00 5 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 09 SEND-> 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
[*『韩雅』优乐美于2011-6-12 19:56:53续贴]:
在后面第 4 个包“SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00“里我们又看到了“6C 79 F6 05“,初步断定店小二的代码就是它了! (这分析里边包含了很多工作的,大家可以用 WPE 截下数据来自己分析分析) 第一个包的分析暂时就到这里(里面还有的信息我们暂时不需要完全清楚了) 我们看看第 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 00 SEND-> 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 都构造这样一个包,按顺序连在一起发送给客户端,客户端也就被我们 骗过了,很简单吧。 以后战斗中其他的事我们就不管了,尽情地开打吧,呵呵。 上面讲的需要一定的编程基础,但是不难,即使你不会编程,相信你继续看下去 就会有收获了。
[*『韩雅』优乐美于2011-6-12 19:57:41续贴]:
五:怎么用计算机语言去写一个单机代理? 在上一章,我们已经对于代理的原理进行了讲解,大家对于代理已经有了 一个初步的认识,现在我教大家如何用计算机语言编写一个自己的代理,我们考 虑到简单明了,我们选用 VB,因为用 VB 编写代理只需要很少的代码。 代码如下: 复制内容到剪贴板 代码: 代码 Private Sub form_Load() DaiLi.LocalPort = “1234“ Server.RemotePort = “1234“ Server.RemoteHost = “211.100.20.26“ DaiLi.Listen End Sub Private Sub DaiLi_ConnectionRequest(ByVal requestID As Long) Server.Connect Client.Accept requestID End Sub Private Sub Client_DataArrival(ByVal bytesTotal As Long) Dim ClientToServer() As Byte Client.GetData ClientToServer Server.SendData ClientToServer End Sub Private Sub Server_DataArrival(ByVal bytesTotal As Long) Dim ServerToClient() As Byte Server.GetData ServerToClient Client.SendData ServerToClient End Sub form_Load()这个过程表示在程序启动的时候要做的一些初始化操作。 DaiLi.LocalPort = “1234“ 设定监听端口 Server.RemotePort = “1234“ 设定象游戏服务器连接的端口(和监听端口是相 同的) Server.RemoteHost = “211.100.20.26“ 设定游戏服务器的 IP 地址 DaiLi.Listen 监听本地的连接请求 这时你只要将游戏的服务器列表的 IP 改成 127.0.0.1,那么游戏的客户端程序就 会来连接我们的代理,我们的代理会调用如下的过程: Private Sub DaiLi_ConnectionRequest(ByVal requestID As Long) Server.Connect 代理客户端向服务器连接 Client.Accept requestID 接受客户端的连接请求 End Sub 当客户端向服务器发送数据时,就会调用下边的过程 Private Sub Client_DataArrival(ByVal bytesTotal As Long) Dim ClientToServer() As Byte 变量定义,请求了一个用于存放数据的空间 6 wpe 封包的使用详细教程-转。 Client.GetData ClientToServer 客户端的连接接收这些数据 在这里我们可以添加自己的代码,对封包进行修改,然后再发向服务器。 Server.SendData ClientToServer 服务器的连接把这些数据发向服务器 End Sub 用其他语言编写基本的原理也是差不多的,不过可能稍微要麻烦一些,因为 VB 本身有一个 MSWINSCK.OCX 控件,这个控件封装了 WINDOWS 的网络操作, 而且接口很简单,推荐大家使用 .
[*『韩雅』优乐美于2011-6-12 19:58:19文件续贴]:
wpe 封包的使用详细教程
--------
续贴1个附件:
1.wpe 封包的使用详细教程.txt(13K)
点击下载
wpe 封包的使用详细教程 现在我们开始!
首先,你要知道游戏中储存数据的几种格式,这几种格式是: 字节(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 会有下列几项功能可选择: 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 1B SEND-> 0010 17 12 DD 34 12 12 12 12 17 12 0E 12 12 12 9B SEND-> 0000 E6 56 1E F1 29 06 17 12 3B 0E 17 1A SEND-> 0000 E6 56 1B C0 68 12 12 12 5A SEND-> 0000 E6 56 02 C8 13 C9 7E 6B E4 17 10 35 27 13 12 12 SEND-> 0000 E6 56 17 C9 12 第二个文件: 复制内容到剪贴板 代码: 代码 SEND-> 0000 83 33 68 47 1B 0E 81 72 76 76 77 76 77 76 02 7E SEND-> 0010 72 77 07 1C 77 77 77 77 72 77 72 77 77 77 6D SEND-> 0000 83 33 7B 94 4C 63 72 77 5E 6B 72 F3 SEND-> 0000 83 33 7E A5 21 77 77 77 3F SEND-> 0000 83 33 67 AD 76 CF 1B 0E 81 72 75 50 42 76 77 77 SEND-> 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 09 SEND-> 0010 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 08 3 SEND-> 0000 F4 44 09 D2 7A 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00 5 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 09 SEND-> 0010 05 00 70 6B 00 00 00 00 05 00 05 00 00 00 1A 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 84 3 SEND-> 0000 F4 44 09 D2 56 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 B8 6C 79 F6 05 02 27 35 01 00 00 5 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 09 SEND-> 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
[*『韩雅』优乐美于2011-6-12 19:56:53续贴]:
在后面第 4 个包“SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00“里我们又看到了“6C 79 F6 05“,初步断定店小二的代码就是它了! (这分析里边包含了很多工作的,大家可以用 WPE 截下数据来自己分析分析) 第一个包的分析暂时就到这里(里面还有的信息我们暂时不需要完全清楚了) 我们看看第 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 00 SEND-> 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 都构造这样一个包,按顺序连在一起发送给客户端,客户端也就被我们 骗过了,很简单吧。 以后战斗中其他的事我们就不管了,尽情地开打吧,呵呵。 上面讲的需要一定的编程基础,但是不难,即使你不会编程,相信你继续看下去 就会有收获了。
[*『韩雅』优乐美于2011-6-12 19:57:41续贴]:
五:怎么用计算机语言去写一个单机代理? 在上一章,我们已经对于代理的原理进行了讲解,大家对于代理已经有了 一个初步的认识,现在我教大家如何用计算机语言编写一个自己的代理,我们考 虑到简单明了,我们选用 VB,因为用 VB 编写代理只需要很少的代码。 代码如下: 复制内容到剪贴板 代码: 代码 Private Sub form_Load() DaiLi.LocalPort = “1234“ Server.RemotePort = “1234“ Server.RemoteHost = “211.100.20.26“ DaiLi.Listen End Sub Private Sub DaiLi_ConnectionRequest(ByVal requestID As Long) Server.Connect Client.Accept requestID End Sub Private Sub Client_DataArrival(ByVal bytesTotal As Long) Dim ClientToServer() As Byte Client.GetData ClientToServer Server.SendData ClientToServer End Sub Private Sub Server_DataArrival(ByVal bytesTotal As Long) Dim ServerToClient() As Byte Server.GetData ServerToClient Client.SendData ServerToClient End Sub form_Load()这个过程表示在程序启动的时候要做的一些初始化操作。 DaiLi.LocalPort = “1234“ 设定监听端口 Server.RemotePort = “1234“ 设定象游戏服务器连接的端口(和监听端口是相 同的) Server.RemoteHost = “211.100.20.26“ 设定游戏服务器的 IP 地址 DaiLi.Listen 监听本地的连接请求 这时你只要将游戏的服务器列表的 IP 改成 127.0.0.1,那么游戏的客户端程序就 会来连接我们的代理,我们的代理会调用如下的过程: Private Sub DaiLi_ConnectionRequest(ByVal requestID As Long) Server.Connect 代理客户端向服务器连接 Client.Accept requestID 接受客户端的连接请求 End Sub 当客户端向服务器发送数据时,就会调用下边的过程 Private Sub Client_DataArrival(ByVal bytesTotal As Long) Dim ClientToServer() As Byte 变量定义,请求了一个用于存放数据的空间 6 wpe 封包的使用详细教程-转。 Client.GetData ClientToServer 客户端的连接接收这些数据 在这里我们可以添加自己的代码,对封包进行修改,然后再发向服务器。 Server.SendData ClientToServer 服务器的连接把这些数据发向服务器 End Sub 用其他语言编写基本的原理也是差不多的,不过可能稍微要麻烦一些,因为 VB 本身有一个 MSWINSCK.OCX 控件,这个控件封装了 WINDOWS 的网络操作, 而且接口很简单,推荐大家使用 .
[*『韩雅』优乐美于2011-6-12 19:58:19文件续贴]:
wpe 封包的使用详细教程
--------
续贴1个附件:
1.wpe 封包的使用详细教程.txt(13K)
点击下载
全部回复 (2)
2012-10-07 03:47:00
沙发
⑧爱┨┠伱Lǒvの无
2014-03-20 20:41:00
板凳
hbbh
登录 后才能回复
flag举报帖子