网络数据流分析工具TcpEngine V1.0.0教程-1
概述
目前主流的网络数据分析工具主要有两类,一类是http协议分析工具,如fiddler,这类工具擅长对字符串类型协议分析;另一类是原始网络数据包的监听分析,如Wireshark,这类工具擅长分析网络底层行为。这两类工具一类擅长字符串协议分析,另一类擅长网络底层行为分析,但是上述两类工具分析二进制流类型协议时,就显得力不心了,TcpEngine (官网:http://www.tcpengine.cn/)补充上述两类工具的空白,提供了二进制流协议分析的方法。
TcpEngine擅长分析数据流协议,适合在数据流协议出现数据错误时使用,比如使用了tcp|websocket协议的网络游戏出现数据错误时,使用本工具对游戏网络数据分析,查找数据错误原因。这款工具不但可以在发开环境中使用,也可以在非开发环境中使用,比如网络数据错误发生在测试环境或用户环境,可以使用本工具在发生错误环境中监听拷贝网络数据,保存到文件再交给技术开发人员慢慢分析。
目前只支持在win32平台运行,工具分两部分,应用软件部分和系统内核WFP模块,WFP(Windows Filtering Platform) 是windows推出的用于TCP/IP协议栈五层各层里面对数据包进行交互操作的基础框架,这里用于监听拷贝指定的网络数据。使用前需要安装WFP,由于WFP内核模块还没有数据签名,使用前需要按下面链接指导步骤重启和设置系统http://www.xitongcheng.com/jiaocheng/win10_article_10547.html
二进制流协议是由我们根据业务需求自定义且没有统一固定格式的网络通信协议,这种特性决定了协议格式是多种多样的,面对多变的协议,解析工具必须提供灵活多变的解析方法,灵活多变就决定了解析方法使用难度会相应的增加。
初识解析规则
面对这些特点,TcpEngine提供的解析方案是提供类似于编程的解析方法,让您根据自己的协议格式编写对应的解析规则,比如一个典型的协议是:固定的消息头 + 可变的消息体。
- 消息头 = 两个字节的指令id + 四个字节消息长度,消息长度值等消息头长度加上消息体长度。
- 消息体长度 = 由消息头的四个字节消息长度 - 6指定。如下图所示。
初步对应的解析规则如下。
int16 msgId; // 消息id
int32 msgLen; // 消息长度,值是消息体长度 + 消息头长度
byte[msgLen-6] msgBody; // 消息体长度 = msgLen - 6
如果我们全部的消息都是这样固定的格式,那么可以通过死循环来使用同样的格式解析所有消息,对应的解析规则如下。
while(1 == 1){
int16 msgId; // 消息id
int32 msgLen; // 消息长度,值是消息体长度 + 消息头长度
byte[msgLen-6] msgBody; // 消息体长度 = msgLen - 6
}
如果我们前3个消息是上述格式,后续所有消息是另外如下格式。
对应的解析规则如下。
int32 loop = 3;
while(loop > 0){ // 循环三次
loop--;
int16 msgId; // 消息id
int32 msgLen; // 消息长度,值是消息体长度 + 消息头长度
byte[msgLen-6] msgBody; // 消息体长度 = msgLen - 6;
}
while(1 == 1){ // 死循环解析后续所有消息
int16 msgId; // 消息id
int32 msgLen; // 消息长度,值是消息体长度 + 消息头长度
int16 msgKey; // 消息key
byte[msgLen-8] msgBody; // 消息体长度 = msgLen - 8;
}
初识解析消息体
我们以上述举例开始三条消息举例,如果msgId=1000的消息体前一个字节是用户名长度 + 字符串用户名 + 两个字节密码长度 + 字符串密码,如下图所示。
对应解析规则如下。
int32 loop = 3;
while(loop > 0){
loop--;
int16 msgId;
int32 msgLen;
byte[msgLen-6] msgBody;
if(1000 == msgId) {
int8 userNameLen = msgBody.split(); // 用户名长度
text[userNameLen] userName = msgBody.split(); // 用户名
int16 pwdLen = msgBody.split(); // 密码长度
text[pwdLen] = msgBody.split(); // 如不对变量再引用,可定义匿名变量
}
}
while(1 == 1){
int16 msgId;
int32 msgLen;
int16 msgKey;
byte[msgLen-8] msgBody;
}
如果我们的还有一个消息是1001,按如下方式解析。
int32 loop = 3;
while(loop > 0){
loop--;
int16 msgId;
int32 msgLen;
byte[msgLen-6] msgBody;
if(1000 == msgId) {
int8 userNameLen = msgBody.split(); // 用户名长度
text[nameLen] userName = msgBody.split(); // 用户名
int16 pwdLen = msgBody.split(); // 密码长度
text[pwdLen] = msgBody.split(); // 对变量没有再使用,可不指定变量名
}
if(1001 == msgId) {
// 解析规则列表....
}
// 更多的解析规则....
}
参数设置
通信数据都以某种数据格式在网络中传输,因此在解析数据前,先要指定数据是以哪种格式在传输,TcpEngine支持三种网络参数,以指定按哪种格式解析原始网络数据,分别是:字节序;字符串编码;网络传输协议。
- 字节序:不了解的请自行网上搜索,这个参数影响多字节的数值类型,如int32,设置指令如下。
set endian = big; // 大端,目前主流,也叫网络字节序
set endian = little; // 小端
- 字符串编码:设置字符串数据编码,这个参数影响字符串数据类型,设置指令如下。
set encoding = utf-8;
set encoding = local; // 使用系统当前默认编码
- 网络传输协议:暂只支持tcp原始协议和websocket协议,这个参数设置工具以哪种协议识别网络数据,设置指令如下。
set protocol = tcp; // 指定原始tcp传输方式
set protocol = websocket; // 指定websocket传输方式
set protocol = auto; // 让工具根据数据特征自动先择
数据类型
char 字符型,一个字节,显示ASCII 字符。
byte 字节型,一个字节,以十六进制显示。
int8 有符号整型,一个字节,以十进制显示。
int16 有符号整型,两个字节,以十进制显示。
int32 有符号整型,四个字节,以十进制显示。
int64 有符号整型,八个字节,以十进制显示。
float32 有符号浮点型,四个字节,以十进制显示。
float64 有符号浮点型,八个字节,以十进制显示。
text 字符串型,可变长度,如果指定了长度,则按指定长度划分字节数,如果不指定长度,遇到零就停止划分,如果没有遇零,遇到一行结束就停止划分(建议使用这个字符串类型)。
string 字符串型,可变长度,如果指定了长度,则按指定长度划分字节数,如果不指定长度,一直划分到遇到零为(建议少用可不用这个类型)。
运行TcpEngine
TcpEngine擅长解析二进流网络协议,为了监听拷贝指定网络数据,采用了微软的WFP内核模块实现,使用前需要在系统安装WFP内核模块。因为WFP内核模块未数据签名(模块源代码可在官网下载),需要先按本链接http://www.xitongcheng.com/jiaocheng/win10_article_10547.html。指导重启电脑,然后再以管理员权限运行工具。如果工具未安装WFP,在“系统设置”中安装,工具启动正常如下图所示。
监听拷贝网络数据
TcpEngine支持先监听拷贝网络数据再分析,也可以边监听网络数据,边分析,当前版本只支持通过ipv4地址和端口的方式监听指定网络数据,执行“新建”功能,生成一个解析规则文件,如下图所示。
点击“开始”,弹出配置监听网络数据端口,填入我们想监听的网络地址和端口,我们以监听分析百度举例, 百度的IP地址是14.215.177.38(IP地址可能会变),把14.215.177.38:80如下图所示填写,并点击“接收不解析”按钮。
在浏览器访问http://14.215.177.38/,如下图所示是工具监听到的网络数据,未解析将以二进制显示。
初识解析过程
网站传输的http协议有文本和二进制流数据(图片,声音等),使用TcpEngine初步解析http协议,我们以上述接收的http网络数据为例,按下列步骤编写最简单的解析规则。处理http协议并不是TcpEngine擅长领域,这里只为简单入门演示。
- 设置好参数,发送数据和接收数据都要设置,如下图所示。
- 编写解析规则,解析规则执行过程跟过程语言执行顺序类似,按顺序顺序执行网络数据,编写好解析规则并执行“刷新”,保存解析规则到文件后,并执行解析刷新,解析结果如下图所示,因为没有编写解析规则,还是以二进制数据显示。
- 以字符串解析发送和接收的网络数据,字符串变量是text和string,这里使用text,以字符串解析网络数据写法如下。
text tt; // 以字符串数据类型解析网络数据
把所有数据都以字符串解析如下。
while(1 == 1){
text tt; // 以字符串数据类型解析网络数据
}
执行解析规则结果如下图所示。