分享
 
 
 

网络数据包截获机制

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

网络数据截获方法

网络数据包截获机制是网络入侵检测系统的基础组件。一般指通过截获整个网络的所有信息流量,根据信息源主机,目标主机,服务协议端口等信息简单过滤掉不关心的数据,再将用户感兴趣的数据发送给更高层的应用程序进行分析。流程图如下:

一方面要,网络截取模块要能保证截取到所有网络上的数据包,尤其是检测到被分片的数据包(这可能蕴涵着攻击)。

另方面,数据截取模块截取数据包的效率也是很重要的。

它直接影响整个入侵检测系统的运行速度。

5.2各种数据流截获方法

5.2.1 利用广播截取网络数据流

数据包的截取技术是依赖网卡的。而网卡可以通过广播监听到以太网络上的数据包,这就是数据包截取技术的基础。

要想截获不是给自己数据流,就必须绕开系统正常工作的机制,直接通过网卡的混杂模式,使之可以接受目标地址不是自己的MAC地址的数据包,直接访问数据链路层,取数据。

5.2.2各系统截取数据包机制

Linux系统为用户提供一种在理论上是数据链路层的,基于网卡驱动程序的,可以不用操作系统自身协议栈的接口(也称套接字)-SockPacket. 这种套接字可以从数据链路层(就是网线)上直接截取所有链路层数据包。而Unix则是通过Libpcap库直接与内核交互,实现网络截取。如:Libpcap,Tcpdump等。如图:

BSD Packet Filter(BPF)机制来截取数据包。BPF可以说是各系统中最棒的截获方式。很多开源嗅探工具就是基于它而开发的。Windows系统也有类似情况,如:win系列上有*.vxd (VxD,VirtualDeviceDrive)(packet*.vxd) 和 网卡.sys(为网卡芯片所开发)来驱动网卡截取数据包。

5.2.3 BPF过滤

Unix&Linux系统有两种数据链路层截取机制,分别是BSD系列系统(NetBSD,OpenBSD,FreeBSD等)的BPF和Linux的SOCKET_PACKET。

BPF过滤

BPF主要由两大部分组成:

网络头接口

数据包过滤器。

网络头接口从网络设备驱动程序处收集数据包复制(在提交给系统协议栈之前),并传递给正在截获数据包的应用程序。而过滤器决定某一数据包是被接受或者拒绝以及如果被接受,数据包的那些部分会被复制给应用程序。BPF结构图如下:

如:TCPDump注:(1), Libpcap, Sniffer, eeye,等。一般情况,网卡驱动通过网卡把网络上的电平信号转化成数据包,再把截取到的数据传给系统自带的协议栈,然后在交由系统处理。这种方式与Unix下的BPF不同,它使得网卡驱动在把从网络截取的数据提交给系统之前,先拷贝一份给BPF,再由BPF 决定是否符合规则,不符合则丢弃,符合则存放到内存指定区,等待处理。

当然,BPF对网卡驱动交给系统协议栈的数据包不做任何干涉。

注1:TCPDump是伯克利实验室的Van Jacobson,Craig Leres和Stenven McCanne为分析TCP性能问题而写的跨平台的监听程序。

5.3基于Libpcap库的通用数据截获技术

Libpcap是用户态的数据包截获API函数接口,有独立和可移植行。最初,Libpcap是为了强大的,健壮TCPDump而编写的。它支持BPF过滤机制。Snort就是依赖于libpcap库进行数据包截取的程序之一(还有Ethereal,eeye等)。 它的优点是可以从任何Unix内核平台上截取数据包,而不考虑什么芯片类型的网卡和驱动程序。更重要的是,它可以使开发人员编写自己的解码,显示,记录等程序。

5.2.2.1 Libpcap库主要函数

1. 头文件特征(pcap.h)

Libpcap库(数据流存储头文件 的结构定义如下图)。前半部分是数据库存储文件头的数据结构定义。

后半部是信息包头文件数据结构定义。

2. 打开并读取设备,设置过滤器部分

与最基层设备打交道。有三个函数:pcap_read() pcap_open_live 和 pcap_setfilter()

3. 脱机方式截取数据

及读取存储在营盘上的文件。有两个Pcap_open_offline()和Pcap_offline_read().

4. 本地网络设置检测部分

主要检测网络设置的函数有几个,包括Pcap_lookupdev() pcap_lookupnet()等。 因为前面提过,Libpcap可移植。所以各种平台的Socket借口都是兼容的。

5. 主程序

都在Pcap.c中,该文件定义了读取数据的统一接口函数pcap_next(),调用此函数获取下一个数据包。

5.4 Snort调用Libpcap

在Snort运行启动时,Snort调用Libpcap库。当调用libpcap函数并初始化接口时,进入截取数据的循环模块―pcap循环。

在这个主循环―Pcaploop(),当网卡从网络介质上接收数据开始,Pcap_loop便对采集来的每个数据包都ProcessPacket()函数处理,如果出错或达到指定的处理包数就退出。(相关代码如下)

具体就是,Pcap_loop()最后根据数据链路类型来选择数据包,然后由ProcessPacket()来进行协议分析,实施信息流的匹配。

如:ProcessPaceket函数调用DecodeEthPkt函数来对以太网数据进行解码。其中DecodeEthPkt()函数再调用子函数Decode IP来对IP协议进行解码……

Libpcap函数功能列举:

Pcap_open_live(): 获得数据包通用句柄。

Pcap_lookup_dev(): 指向网络可用设备。

Pcap_looknet(): 初步判断网络设备本身的IP & netmask。

Pcap_Dump(): 基于TCPDump的,将网络数据包保存成文件。

程序部分代码如下:

/* Read all packets on the device. Continue until cnt packets read */

pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

{

register int n;

for (; { //for循环

if (p-sf.rfile != NULL) {

n = pcap_offline_read(p, cnt, callback, user);

} else {

// XXX keep reading until we get something

do {

n = p-read_op(p, cnt, callback, user);

} while (n == 0);

}

if (n <= 0)

return (n); //遇错误,返回

if (cnt 0) {

cnt -= n;

if (cnt <= 0)

return (0); //达到制定数量,返回

}

}

}

pcap_loop()有几个重要参数:

参数是pv.pkt_cnt,表示总共要捕捉的包的数量。在main函数初始化时,缺省设置为-1,成为永真循环,一直捕捉直到程序退出:

/* initialize the packet counter to loop forever */

pv.pkt_cnt = -1;

或者在命令行中设置要捕捉的包的数量。ParseCmdLine函数的调用中,遇到参数n,重新设定pv.pkt_cnt的值。ParseCmdLine中相关语句如下:

case 'n': /* grab x packets and exit */

pv.pkt_cnt = atoi(optarg);

Snort.c主程序中,Pcap_loop()函数有两种提取数据模式:

打开网卡和打开文件。

/* get the device file descriptor,打开网卡接口 */

pd = pcap_open_live(pv.interface, snaplen,

pv.promisc_flag ? PROMISC : 0, READ_TIMEOUT, errorbuf);

或者

/* open the file,打开文件 */

pd = pcap_open_offline(intf, errorbuf);

只有以上两种返回情况。

Snort把真实的数据包存储在内存中指针指向的数据结构中。在decode.h中,定义了所有Snort要使用到的数据结构,包括Tcp,Ip,以太桢,vlan桢等。Snort的这些结构将指针指向截获的包上来代表相应的协议。如指向以太桢用数据指针使用_EthrHdr头。

数据结构:

Typededf struct _etherhdr

{

u_int8_t ether_dst[6]; //目的地址;

u_int8_t ether_src[6]; //源地址;

u_int16_t ether_type; //协议类型;

}

typedef struct _Tcphdr

{

u_int16_t th_sport; //源端口;

u_int16_t th_dport; //目端口;

u_int32_t th_seq; //sequence number;

u_int32_t th_ack; //acknowledgement number;

u_int8_t th_offx2; //offset and reserved;

u_int8_t th_flags; //flags;

u_int16_t th_win; //window;

u_int16_t th_sum; //checksum;

u_int16_t th_urp; //urgent pointer;

}

小结

网络数据的截取是入侵检测系统的基础。本节从网络数据截取机制开始讲,讲述了常见的两种机制。重点讲述了Libpcap库的网络数据包截取机制.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有