请选择 进入手机版 | 继续访问电脑版

Bacysoft.cn

 找回密码
 邀请注册
查看: 22251|回复: 0

网游辅助(外挂)程序开发教程及实例分析03 - 封包分析

[复制链接]
发表于 2014-9-3 22:09:01 | 显示全部楼层 |阅读模式
本帖最后由 bacy001 于 2016-6-24 14:52 编辑

关键字:网游辅助(外挂) Wireshark 封包分析

如果有人问我现在最好用的封包分析软件是什么?那我会毫不犹豫的告诉他:Wireshark!

Wireshark 的前身是 Ethereal,看名字就能知道,软件初衷就是为了探寻以太网里的真实情况,换句话说也就是以太网中真实的流量情况。当然 Wireshark 现在能支持多种数据链路层协议,几乎囊括所有你能接触到的类型:)

如果你还不怎么熟悉 Wireshark 的使用,我建议你赶快去下载一个,并尝试一下,看看网络底层的数据世界到底是怎么样的。本文不会介绍 Wireshark 具体用法,而将着重向读者展示使用 Wireshark 分析封包的数据结构的过程。

1、确定封包数据流的特征
说直白点,就是确定那些封包是我们需要的,哪些不是!基本思路是:先找到目标应用软件(游戏客户端)的进程号,然后通过进程号确定协议端口,最后在 Wireshark 中设置过滤器规则就好了!

如何获取进程号以及该进程对应的网络协议端口号呢?首先通过 Windows 的任务管理器(Ctrl + Alt + Del 呼出窗口),并选择“进程”页,PID 栏中的数字就是程序对应的进程号,见下图:



“7496” 就是我们需要的进程号,然后打开你的 CMD 窗口,运行命令:
  1. netstat -ano|findstr "7496"
复制代码
引号中的数字就是进程号,执行后得到如下信息,见下图:



第一项是协议类型,第二项是本地地址和端口,第三项是远端地址和端口,第四项是连接状态,第五项是进程号
显然我们需要的信息是: tcp 端口 4478,翻译成 Wireshark 可识别的过滤规则就是:
  1. tcp.port == 4478
复制代码
将其填入 Wireshark 窗口的过滤器栏然后点应用后,Wireshark 列出的数据包就都是从 TCP 端口 4478 发出或者进入的封包了。见下图:



2、封包分析的基本方法
点击任意一个由服务器发到客户端的封包,Wireshark 将自动为我们解析出封包数据中不同层次的内容,见下图:



我们可以看到,这里一共有5个层次,最上层的 Frame 1 表示整个数据帧,数字1表明这个数据帧是本次抓包所捕获的第一个数据帧,冒号后面的内容告诉我们,这个数据帧的大小,线路上一共传送了 327 字节(2616 比特),捕获了 327 字节(2616 比特),这说明 Wireshark 完整的捕获整个封包的内容;第二层是数据链路层的信息,共计 14 字节,包含源 MAC 地址 和 目的 MAC 地址(分别 6 字节)以及协议字段(2 字节);第三层就是 IP 头信息,包含了源目的 IP 地址,效验码等等信息;第四层是 TCP 协议的头部信息,包含了源目的端口,TCP 标志状态信息等等;通常 IP 头和 TCP 头都是 20 字节,最后的 Data 部分就是该封包所携带的应用层数据了,也就是网游的交互数据,而这部分数据才是我们最感兴趣的!

在分层信息的下方,我们还可以看到由 16 进制显示的完整封包内容,点击分层信息中的不同字段,Wireshark 将自动在下方 的封包内容区用蓝色背景标识出对应的数据,见下图:



3、应用层(游戏)数据分析
通常应用层数据都是采用的私有数据结构,不像 IP 、TCP 、UDP 等网络协议拥有标准的数据结构,因此 Wireshark 无法解析出应用层数据的含义。而要想知道这些数据所代表的含义,就只能靠不断的尝试和总结,尽管不同的应用程序其数据的含义可能完全不同,但还是能找出很多共性。

网络游戏有一个很重要的指标就是时延,网游开发商要尽可能降低时延以提高玩家的游戏体验,因此其数据的传输一般采用 PUSH 模式,也就是只要有数据就立刻发送,而不用等待缓冲区满才打包发送。这个特性通过 Wireshark 抓包可以很容易的看出来,所有服务器发送到客户端的封包都带有 PSH 标志,见下图:


同时,由上图可知:在客户端没有任何操作的情况下,客户端几乎不会主动发送数据给服务器。

我们选取其中一个数据长度为 10 字节的封包,内容如下:

“11 00 ff 18 00 00 4b 00 ee ee”,具体的含义我们目前不知道,但是看上去连续的两个 “ee” 还是挺醒目的!让我们再找一个数据多一点的封包看看。见下图:



哇,这么多个“ee ee”!再对比下右侧可读字符区的信息,x 等于多少,y 等于多少,z 等于多少...很容易的让人联想到 3D 游戏中的坐标系统。而且对应着数据区从“1b” 开始到 “eeee” 结尾的数据!到这里虽然我们还清楚数据的具体含义,但是可以明确的一点是:连续出现的 “eeee”  就是应用层信息的分隔符,对于数据长度可变的信息,无论加密与否,一定是需要一个分隔符来帮助提取完整的信息的。

下面让我们来主动出击,使用客户端往服务器发送一些信息,然后看看封包交互的情况。通常最简单的办法就是在游戏中的聊天频道输入特定字符串,比如在游戏中的聊天频道输入字符串:Bacysoft.cn

请一定记住,在发送信息前确保 Wireshark 工作在封包捕获状态,并在确认消息发送成功后,停止捕获!这个过程中 Wireshark 会捕获到很多数据包,到底哪一个数据包才包含我们刚刚发布的消息 “Bacysoft.cn” 呢?别急,Wireshark 提供了强大的搜索功能,按下快捷键 Ctrl + F 可以呼出搜索对话框,见下图:



你可以选择搜索特定 Hex 值,也可以搜索字符串,显然现在我们应该选择字符串,点击 Find 后,奇迹发生了!





一共找到 2 个包含 “Bacysoft.cn” 的封包,前一个是客户端发给服务器的,后一个是服务器发给客户端的!在多次尝试后(发送有细微变化的不同的字符串(比如:“Bacysoft.com”),最终发现,客户端发送给服务器的信息的第一个字节一定是 “0x10”,然后在相对于数据字段首字节偏移量为 30 字节的地方,一定是“0x6332”(c2)然后紧随其后的便是我们输入的特定字符串 “Bacysoft.cn”,最后是分隔符 “0xeeee” 结尾;而服务器回应客户端的封包数据中则是“0x1b”开头,然后在偏移量为 10 的地方,一定是“0x63203220”(c 2 ),然后紧跟着服务器返回的字符串消息“AR2811 Wanderers Bacysoft.cn”,AR2811 正是笔者所用的游戏人物的名称,Wanderers 是人物的爵位,Bacysoft.cn 则是我们之前主动发送的消息。有了这些信息加上之前介绍的 WinPcap 编程方法,我想我们已经能够做一个监控聊天消息的功能了!

还记得我们决定要开发此款网游辅助(外挂)程序的初衷吗?是的,监控采集工具的耐久度,监控人物背包重量,当工具快要损坏了就更换新的工具,当背包满了,就清理背包!

那么如何从封包中获取采集工具的耐久度变化的信息呢?首先要搞清楚工具的耐久度在游戏中是如何变化的!此款网游的变化规则是这样,中级工具的耐久上限是 5000,也就是你从NPC买一把新的工具,那么它的耐久度就是 5000,当你开始采集工作的时候,工具的耐久度会依次递减,每次减少一点,时间间隔不固定,一般1分钟可能会下降10点左右。

知道这个规律以后,打开 Wireshark 并确保其工作在封包捕获状态,控制人物开始采集工作,持续一段时间,等工具耐久下降到一定程度后,退出采集状态,然后停止封包捕获。假设退出采集时的工具耐久度为:3280,换算成 16 进制则是 0x0CD0,和之前一样,使用 Wireshark 提供的查找功能,搜索 Hex 值:D00C,见下图:



我们在一条以“0x21”,开头的消息中找到了和当前工具耐久度相匹配的数值,这里需要注意的是数据在字节流中的顺序与我们平时的书写顺序相反,这也是为什么我们在搜索时,输入的 Hex 值是:D00C 而不是 0CD0。

根据工具耐久的变化情况,我们在封包中依次搜索:3279、3278、3277(请读者自行转换为十六进制数值)...等等,发现有关工具耐久的消息格式完全一样,即都是保存在以 “0x21” 开头,“0xeeee” 结尾,在偏移量为 2 的位置上始终是字段 “0401”,而耐久度数据则保存在偏移量为 11,长度 2 字节的地方。这样描述工具耐久度的消息也分析出来了。

使用类似的方法,最终可以把背包负重的数据也确定下来。需要说明的是本节所讨论的方法仅在数据未加密的状态下有效,如果数据被加密了,那你只有自认倒霉了!要么选择继续忍受游戏中非人的设定,要么选择彻底离开它,哈哈!当然即使游戏加密了封包数据,也是有可能被破解的,只不过加密解密所涉及的内容太过宽泛,技术难度也太高,有时还需要一定的运气,这些都超出了本教程所讨论的范围。但是一般来说,大多数的游戏除了在登录的部分做了比较充分的加密外,其他部分的数据大多都是采用明文传输,主要考虑的因素应该还是减少不必要的开销以提高服务器的响应速度吧!
您需要登录后才可以回帖 登录 | 邀请注册

本版积分规则



阿里云|腾讯云|联系方式|Bacysoft.cn ( 京ICP备08000958号-1 )

GMT+8, 2019-10-19 11:12 , Processed in 0.019242 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表