鉴于目前企事业单位存在FTP协议还原的需求,提出一种基于ring3层FTP协议还原的方法。传统做法基本上都基于winpcap/libpcap,但因工作于ring0层,从一定程度上来说存在不稳定因素。原始套接字是基于IP数据包的编程,可以自行组装IP数据包,可以直接用于接收IP层的报文数据,因此原始套接字理论上可以接收TCP/UDP报文。
原始套接字技术原理介绍:
下面以linux平台tcp协议为例说明原始套接字报文接收流程:
linux 收流程图.png
匹配系统已注册的原始套接字,若匹配成功则调用skb_clone()拷贝网络数据包至原始套接字处理。
创建原始套接字伪代码如下:
sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
FTP协议还原整体流程如图2:
整体模块流程图.png
整体模块说明:
1, 原始套接字抓取模块通过混杂模式抓取网卡收发网络数据报文,为保证性能,抓取的数据立即通过put()存储至缓存数据队列,并设置event;
2, 业务线程池等待到event,触发某一线程(线程池其他线程无业务处理时处于休眠状态)通过get()获取新增的网络数据报文信息;
3, 业务线程池拿到数据后通过WM算法匹配”stor”/”retr”等关键字信息以识别当前数据报文对应的具体操作行为;
原始套接字抓取数据模块伪代码如下:
while(1){
recv(sock, recvBuf, sizeof(recvBuf), 0);
if(recvBuf-> proto== IPPROTO_TCP){
put();
setevent();
}
}
业务线程池模块伪代码如下:
while(1){
result=waitevent(event);
if(result==0){
wm_match(get());
del();
//record
}
}
引入WM算法意义说明:
WM算法采用坏字符表跳转与字符块技术,增大了目的字符串与模式串不匹配的可能性,从而加快了匹配速度。本文为基础框架,后续可能引入其他业务协议的识别,故协议识别引擎采用WM算法而不是单模匹配算法诸如KMP、BF等。WM算法一般由三个表构成,SHIFT,HASH,PREFIX。SHIFT表:用于记录文本串向右移动的长度,即一张跳转表。 HASH表:HASH表记录了所有模式串后缀(长度为B)与模式串本身的映射关系。当SHIFT [h]=0时,B与对应模式串P的映射关系,但是存在一对多的映射,因为模式串集合中存在相同后缀的模式串,所以HASH表的value应该是一个链表的形式,存储多个模式串。PREFIX表:PREFIX记录了所有模式串前缀(长度为B)与模式串本身的映射关系。同HASH表一样,B与对应模式串P的映射关系存在一对多,所以PREFIX表存储多个模式串。
网友评论