在网络流量分析领域,大多数解码软件能够对标准化协议做解码,但是很多业务系统中的网络通信使用的是私有协议。
为满足对私有协议解码需求,科来为广大IT人员提供了一款简单易用的解码脚本编辑器。科来解码脚本编辑器使用科来FPDL编写解码脚本,提供解码脚本即写即测即使用的能力。
上一篇内容《科来MAC地址扫描器:破解ARP病毒“伪装术”》我们介绍了科来MAC地址扫描器的妙用,本文将带大家共同编写一个自定义解码脚本,掌握科来解码脚本编辑器的使用方法,了解科来FPDL的基本使用。让您在需要自定义协议解码技术的时候稳如磐石。
本期互动问题,欢迎大家评论区一起聊聊: 试着用科来解码脚本编辑器解码一份HTTP流量,并成功将H会话的交互内容复现出来,在评论区说说你的心得吧。
术语解释
FPDE:快速协议解码引擎(Fast Protocol Decode
Engine)FPDE是科来专为协议解码设计的一种解释语言技术。运行稳定性高,解码灵活度高,具有解码执行速度快,解决方案实施快的性能优势。使用多层解释引擎实现无限种形式语言解释,使用多图引擎保障性能及健壮度。
FPDL:快速协议解码语言(Fast Protocol Decode Language)FPDL是科来快速协议解码引擎FPDE中设计使用的解释语言,是专门为网络协议解码设计的解释语言。具有语法简单易上手、解码颗粒度控制灵活、解码脚本制作速度快的特点。
使用科来FPDL编写的解码脚本也被称为“快速解码脚本”。 图1
如图1所示,快速解码脚本总体分为三个部分:头部部分、解码部分、解释部分。头部部分负责记录脚本的基本信息;解码部分使用FPDL编写,用于协议解码;解释部分用于对解码部分进行修饰。
头部部分
快速解码脚本的最前面是头部信息,记录着脚本的基本信息。代码解析如下:
[colasoft
protocol decode script ver 2.0] // 每个脚本开始必须有的一行。 proto_abbr =
TCP //协议名,通过这个值将协议和脚本对应起来,自定义协议的名字和脚本文件要对应。 name=Transmission
Control Protocol //自定义信息(注释/说明)。 layer=TRANSPORT // 自定义信息(注释/说明)。
解码部分
图1所示的解码脚本中解码部分对TCP头部前20字节进行了解码。
图2
TCP头部结构如图2所示,红色框中是TCP头部固定存在的字段,总计20字节长。
解码部分以[struct]标识。制作自定义协议解码脚本时,一般采用渐进式的办法,先组织协议结构,再逐渐细化解码更多字段。这里给大家的建议是组织架构从大到小的写,即从下往上写。
简单三个步骤编辑一个快速解码脚本:定义基本结构、定义层次化解码字段、定义解码字段。
1、定义基本结构 FPDL的语句分为注释语句和定义语句,注释语句仅用于描述,定义语句将被执行。每条注释语句由“#”开始,至“\n”结束。定义语句由语句定义引导词开始,至“;”结束。
通过定义语句定义出快速解码脚本的解析入口和要解码的数据片段的基本结构。 图3
如图3所示,先定义协议的组织结构。“root”是根,用于定义解析的入口,每个脚本有且仅有一行,这里代表TCP协议。“parser”定义了TCP结构体的结构由“Header”开始,后面跟着“ignoretoend”。“ignoretoend”表示头部之后的都忽略,如果需要解码更多内容,如TCP选项字段,就可以从这里进行修改。“struct”用于定义解码片段(FPDL将这样的片段称为“结构体”)的名字及其长度。
- struct Header
20; // 定义名为“Header”的结构体,长度20字节。
- parser TCP =
Header ignoretoend; //定义TCP结构,本例我们仅解码前20字节。
这样我们就定义好了要解码内容的基本结构,从根开始分为“Header”和“忽略的部分”。“Header”长度20字节。
2、定义层次化解码字段 科来网络分析系统或一些协议解码软件中看到的层次化字段显示,是为了在分析协议的时候更加清晰,在科来FPDL中可以通过解码字段层次化设计来实现如图4所示的层次化效果。
图4
图5
如图5所示,“groupfield”属于解码字段定义引导词,用于定义层次化解码字段。
- groupfield
Flags; // 所有被Flags字段范围覆盖的字段将归属于Flags层次。
- groupfield TCP; // 所有被TCP字段范围覆盖的字段将归属于TCP层次。
此处定义出两个层次化结构,一个是TCP总体层次化结构,另一个是Flags层次化结构即TCP首部的8个Flag位。
3、定义解码字段 图6
“structfield”属于解码字段定义引导词,用于定义结构体片段解码字段。在本文中意指将“Header”中的片段定义为解码字段。以图6所示“SrcPort”所在语句为例进行解析:语句以“structfield”作为定义引导词开始,“SrcPort”为自定义解码字段名,“=”后面的“Header”表示从名为“Header”的结构体中截取片段进行解码,“[0,2]”表示片段在“Header”中的偏移位置,其中“0”表示从第0个字节开始,“2”表示片段2字节长(默认单位为字节),“int”表示片段的数据类型为整型(即整数),“N2H”表示大小端字节序转换(当字段长度大于等于2字节时,需要转换)。
那么当解码字段不足1字节时,如何定义呢?如图6中所示的“DataOffset” 所在语句,偏移位置为“12:0,4”。其中“12”表示该片段从“Header”的第12字节开始(在计算的时候不要忘记计算机是从“0”开始计数的),“:”表示正在构建的片段以bit为单位,“0”表示片段从该字节第“0”个bit开始,“4”表示该片段长度4bit。
同上所述,如图6中所示的“Flags” 所在语句表示片段从“Header”的第13字节开始,长度1字节。“CWR”
所在语句表示片段从“Header”的第13字节开始,以bit为单位,从“Header”的第13字节的第0bit开始,长度1bit。基于如图5所示的“groupfield”定义,被Flags字段范围覆盖的字段将归属于Flags层次。 经过上述定义基本结构、定义层次化解码字段、定义解码字段三个简单步骤,一个快速解码脚本就完成了。
解释部分
图7
解释部分使用lua语言编写,用于对解码部分进行修饰,可以定义解码视图显示出的中英文名字、解释信息等等,效果如图7所示。本次自定义协议解码不涉及解释部分代码。
协议解码
从科来网络分析系统的数据包解码窗格中,复制一段TCP报文的内容,粘贴到解码脚本编辑器的数据流窗格进行解码测试。 图8
如图8所示,从科来网络分析系统中选取任意TCP数据包,从TCP头部第一个字节开始选择一段大于20字节的数据并复制。 图9
如图9所示,将复制的数据粘贴到解码脚本编辑器的数据流窗格,点击播放按钮,解码结果将出现在输出窗格。可以看到TCP首部前20字节所有字段都被解码了。
工具获取及打开方式
现在科来解码脚本编辑器已经整合到了最新版的科来网络分析系统(技术交流版)中,安装同时就可以获得。
可通过以下几种方式启动科来解码脚本编辑器: 1、开始->科来网络分析系统
技术交流版 菜单 -> 解码脚本编辑器; 图10
2、开始-> 运行 -> 输入CSDecodeEditor -> 点击确定; 图11
3、点击科来网络分析系统顶部的工具菜单 -> 选择“解码脚本编辑器”。 图12
科来编解码转换工具打开后如图13所示。 图13
总结
“工欲善其事,必先利其器”,科来网络分析系统和科来网络分析小工具是IT人员的必备神器。如果您有自定义协议解码方面的需求,请用科来解码脚本编辑器试试看吧。
还记得开篇的互动问题吗? 试着用科来解码脚本编辑器解码一份http流量,并成功将http会话的交互内容复现出来,在评论区说说你的心得吧。
看了这篇文章,你有什么新的想法?欢迎在评论区留言和我们交流~
|