《网络数据包的获取与libpcap应用.ppt》由会员分享,可在线阅读,更多相关《网络数据包的获取与libpcap应用.ppt(35页珍藏版)》请在三一办公上搜索。
1、网络数据获取方法,1 网络信息获取,网络信息获取是指通过物理线路接入到实际的网络中,实现获取该网络当前传输的所有信息,即获取当前传输的数据包,并根据信息的源主机、目标主机、服务协议和端口等信息简单过滤掉不关心的垃圾数据,然后提交给上层应用程序进行进一步处理。,一、TCP/IP体系结构,-|SMTP|DNS|HTTP|FTP|TELNET|应用层-|TCP|UDP|传输层-|IP|ICMP|ARP RARP|网络层-|IEEE 802 以太网 SLIP/PPP PDN etc|数据链路层-,数据包接收过程,二、以太网 以太网最初是由XEROX公司研制,并且在1980年由数据设备公司DEC(DIG
2、IAL EQUIPMENT CORPOR ATION)、INTEL公司和XEROX公司共同使之规范成形。后来它被作为802.3标准为电气与电子工程师协会(IEEE)所采纳。以太网是最为流行的网络传输系统之一。以太网的基本特征是采用一种称为载波监听多路访问/冲突检测CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的共享访问方案。,TCP/IP与以太网,以太网和TCP/IP可以说是相辅相成的。以太网在一二层提供物理上的连线,使用48位的MAC地址 TCP/IP工作在上层,使用32位的IP地址两者间使用ARP和RARP协议进行相互转
3、换。,载波监听指在以太网中的每个站点都具有同等的权利,在传输自己的数据时,首先监听信道是否空闲,如果空闲,就传输自己的数据,如果信道被占用,就等待信道空闲。,冲突检测为了防止发生两个站点同时监测到网络没有被使用时而产生冲突。以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。,CSMA/CD过程,以太网的广播通讯,在以太网中,所有的通讯都是广播的,通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据,网卡的MAC地址每一个网络接口都有一个唯一的硬件地址,这个硬件地址也就是网卡的MAC地址。大多数系统使用48比特的地址,这个地址用来表示网络中的每一个设备一般来说每
4、一块网卡上的MAC地址都是不同的每个网卡厂家得到一段地址,然后用这段地址分配给其生产的每个网卡一个地址。,在正常的情况下,网络接口应该只响应这样的两种数据帧:1.与自己硬件地址相匹配的数据帧。2.发向所有机器的广播数据帧。,数据的收发是由网卡来完成的网卡接收到传输来的数据,网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收。认为该接收就接收后产生中断信号通知CPU认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道.CPU得到中断信号产生中断,操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据驱动程序接收
5、数据后放入信号堆栈让操作系统处理。,网卡来说一般有四种接收模式:广播方式:该模式下的网卡能够接收网络中的广播信息。组播方式:设置在该模式下的网卡能够接收组播数据。直接方式:在这种模式下,只有目的网卡才能接收该数据。混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。,总结一下首先,我们知道了在以太网中是基于广播方式传送数据的,也就是说,所有的物理信号都要经过我的机器,其次,广播模式下,网卡的一种模式叫混杂模式(promiscuous),在这种模式下工作的网卡能够接收到一切通过它的数据,而不管实际上数据的目的地址是不是它。再次,通过设置交换机监听端口。监听端口带宽要
6、大于所监听的端口带宽,防止丢包。,2 网络数据包捕获技术,不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异。数据包常规的传输路径依次为网卡接口、设备驱动层、数据链路层、IP层、传输层、最后到达应用程序。而包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤/缓冲等相关处理,最后直接传递到应用程序。,2 网络数据包捕获技术,旁路处理机制,基于socket的网络的编程方法,数据链路提供者接口(DLPI),伯克利数据包过滤器(BPF)Lipcap,零拷贝技术,libnet 提供的接口函数主要实现和封装了数据包的构造和发送过程。libpcap 提供的接口函数主要
7、实现和封装了与数据包截获有关的过程。libnids 提供的接口函数主要实现了开发网络入侵监测系统所必须的一些结构框架。libicmp 等相对较为简单,它封装的是ICMP数据包的主要处理过程(构造、发送、接收等)。,数据包捕获流程,一、libpcap的数据类型定义,struct pcap_addr:网卡地址描述 pcap_addr*next;sockaddr*addr;sockaddr*netmask;sockaddr*broadaddr;sockaddr*dstaddr;pcap_addr*next;如果非空,指向链表中一个元素的指针;空表示链表中的最后一个元素。sockaddr*addr;指
8、向包含一个地址的sockaddr的结构的指针。sockaddr*netmask;如果非空,指向包含相对于addr指向的地址的一个网络掩码的结构。sockaddr*broadaddr;如果非空,指向包含相对于addr指向的地址的一个广播地址,如果网络不支持广播可能为空。sockaddr*dstaddr;如果非空,指向一个相对于addr指向的源地址的目的地址,如果网络不支持点对点通讯,则为空。,struct pcap_file_header bpf_u_int32 magic;u_short version_major;u_short version_minor;bpf_int32 thiszon
9、e;/*gmt to local correction*/bpf_u_int32 sigfigs;/*accuracy of timestamps*/bpf_u_int32 snaplen;/*max length saved portion of each pkt*/bpf_u_int32 linktype;/*data link type(LINKTYPE_*)*/;u_short version_major;Libpcap的主版本号。u_shart version_minor;Libpcap的从版本号。bpf_u_int32 sigfigs;时间戳描述。bpf_u_int32 snapl
10、en;保存的每个pkt的分片号的最大值。bpf_u_int32 linktype;数据链的类型。细节说明:libpcap dump文件头;libpcap dump文件中的第一个记录包含了一些标志的保存值,这些标志在打印阶段用到。这儿的很多域都是32位的int,所以compilers不用进行转化;这些文件需要具有跨层次的可交换性。无论如何不要改变结构的层次(包括仅仅改变这个结构中域的长度);,struct pcap_if/*网卡数据链的一个元素*/struct pcap_if*next;char*name;/*name to hand to pcap_open_live()*/char*desc
11、ription;/*textual description of interface,or NULL*/struct pcap_addr*addresses;u_int flags;/*PCAP_IF_ interface flags*/;pcap_if*next;如果非空,指向链的下一个元素。如果为空是链的最后一个元素。char*name;指向一个字符串,该字符串是传给pcap_open_live()函数的设备名;char*description;如果非空,指向一个对设备的人性化的描述字符串。pcap_addr*addresses;指向网卡地址链中的第一个元素。u_int flags;PCA
12、P_IF_ 网卡的标志。现在唯一可用的标识是PCAP_IF_LOOKBACK,它被用来标识网卡是不是lookback网卡。,struct pcap_pkthdr/*dump 文件中的数据包头*/struct timeval ts;/*time stamp*/bpf_u_int32 caplen;/*length of portion present*/bpf_u_int32 len;/*length this packet(off wire)*/;timeval ts;数据报时间戳;bpf_u_int32 caplen;当前分片的长度;dpf_u_int32 len;这个数据报的长度;细节描述
13、:在dump文件中的每个数据报都有这样一个报头。它用来处理不同数据报网卡的不同报头问题。,struct pcap_stat/*用来保存网卡静态变量的结构*/u_int ps_recv;/*number of packets received*/u_int ps_drop;/*number of packets dropped*/u_int ps_ifdrop;/*drops by interface XXX not yet supported*/;u_int ps_recv;接受数据报的数目;u_int ps_drop;被驱动程序丢弃的数据报的数目;u_int ps_ifdrop;被网卡丢弃的
14、数据报的数目;,struct pcap_sf/pacap的savefile结构 定义 FILE*rfile;/该指针指向savefile文件 int swapped;/?int hdrsize;/头大小吗?int version_major;/主版本号 int version_minor;/从版本号 u_char*base;/?;,二、Libpcap过滤规则,过滤规则是一个包含过滤表达式的ASCII码字符串,此规则表达式在程序中作为pcap_compile()函数的参数被编译,并用于内核级的包过滤机制使用.表达式决定哪种包将被捕获,如果表达式为空,所有网卡捕获到的数据包都会提交给内核过滤引擎,
15、否则,只有满足表达式中关键字的数据包才会被捕获.表达式是由一个或者多个原语组成,而关键字通常是被一个或多个修饰词修饰的标识符(名称或序号)下面是三种不同类型的修饰词:,type:此类修饰词决定哪种类型的标识符被引用,常用的修饰词有host,net and port.例如,host foo,net 128.3,port 20.在没有此类修饰符的情况下,默认使用host.dir:此修饰符类型从标识符指定了一个详尽的数据传输方向(使用and和or),常用的方向指示修饰符有src,dst,src or dst and src and dst.等.例如,src foo,dst net 128.3,src
16、 or dst port ftp-data.在没有指定此类修饰符时,默认使用src or dst.protol:此类修饰符的作用是过滤指定协议数据包,常见的协议有:ether,ip,ip6,arp,rarp,tcp and udp,例如,ether src foo,arp net 128.3,tcp port 21.,三、Libpcap函数网络接口函数,1、函数名称:char*pcap_lookupdev(char*errbuf)函数功能:用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络设备名指针。获得本机的网络接口名称。参数说明:如果函数执行成功,
17、则返回一个用于描述系统上的一个网卡的描述符的指针。如果失败,返回null,errbuf中存放出错信息。,2、函数名称:int pcap_lookupnet(char*device,bpf_u_int32*netp,bpf_u_int32*maskp,char*errbuf)函数功能:获得指定网络设备的网络号和掩码。参数说明:char*devic:网卡的描述符指针,由pcap_looupdev函数获取;netp参数和maskp参数都是bpf_u_int32指针。如果函数出错,则返回-1,同时errbuf中存放相关的错误消息。,3、函数名称:pcap_t*pcap_open_live(char*d
18、evice,int snaplen,int promisc,int to_ms,char*ebuf)函数功能:打开一个网络接口进行数据包捕获。参数说明:char*device:网卡的描述符指针,由pcap_looupdev函数获取;int snaplen:规定捕获的每个数据报的最大字节数;int promisc:1为混杂模式;0为非混杂模式;int to_ms:规定读超时的微秒(milliseconds)数;char*ebuf:存放错误信息,只有在pcap_open_live失败时才被设置;返回值:如果函数成功执行,则返回一个指向数据报捕获的指针;如果错误,返回null,ebuf存放出错信息。
19、,4、函数名称:pcap_t*pcap_open_offline(char*fname,char*ebuf)函数功能:打开以前保存捕获数据包的文件,用于读取。参数说明:fname参数指定打开的文件名。该文件中的数据格式与tcpdump和tcpslice兼容。-为标准输入。ebuf参数则仅在pcap_open_offline()函数出错返回NULL时用于传递错误消息。,5、函数名称:pcap_dumper_t*pcap_dump_open(pcap_t*p,char*fname)函数功能:打开用于保存捕获数据包的文件,用于写入。参数说明:p参数为调用pcap_open_offline()或pca
20、p_open_live()函数后返回的pcap结构指针。fname参数指定打开的文件名。如果返回NULL,则可调用pcap_geterr()函数获取错误消息。,四、Libpcap函数规则函数,1、函数名称:int pcap_setfilter(pcap_t*p,struct bpf_program*fp)函数功能:指定一个过滤程序。设置BPF过滤规则,由参数fp确定。参数说明:参数p表示Libpcap句柄;fp参数是bpf_program结构指针,表示BPF过滤规则;通常取自pcap_compile()函数调用。出错时返回-1;成功时返回0。,2、函数名称:int pcap_compile(p
21、cap_t*p,struct bpf_program*fp,char*str,int optimize,bpf_u_int32 netmask)函数功能:该函数用于将str指定的规则整合到fp过滤程序中去,并生成过滤程序入口地址,用于过滤选择期望的数据报。参数说明:pcap_t*p:pcap_open_live返回的数据报捕获的指针;struct bpf_program*fp:指向一个子函数用于过滤,在pcap_compile()函数中被赋值;char*str:该字符串规定过滤规则;int optimize:规定了在结果代码上的选择是否被执行;bpf_u_int32 netmask:该网卡的子
22、网掩码,可以通过pcap_lookupnet()获取;返回值:如果成功执行,返回0,否则返回-1;,五、Libpcap函数捕获函数,1、函数名称:int pcap_dispatch(pcap_t*p,int cnt,pcap_handler callback,u_char*user)函数功能:捕获并处理数据包参数说明:cnt参数指定函数返回前所处理数据包的最大值。cnt=-1表示在一个缓冲区中处理所有的数据包。cnt=0表示处理所有数据包,直到产生以下错误之一:读取到EOF;超时读取。callback参数指定一个带有三个参数的回调函数,这三个参数为:一个从pcap_dispatch()函数传递
23、过来的u_char指针,一个pcap_pkthdr结构的指针,和一个数据包大小的u_char指针。如果成功则返回读取到的字节数。,2、函数名称:int pcap_loop(pcap_t*p,int cnt,pcap_handler callback,u_char*user)函数功能:循环捕获网络数据 包,直到遇到错误或满足条件。每捕获一个数据包就调用callback指示的回调函数,所以可以在回调函数中对捕获的数据包进行操作。既可以用来处理事先捕获的保存在文件中的数据报,也可以用来处理实时捕获的数据报参数说明:参数p表示Libpcap句柄;参数cnt表示捕获数据包的个数;参数callback表示
24、回调函数;参数user表示向回调函数中传输的参数,2、函数名称:int pcap_loop(pcap_t*p,int cnt,pcap_handler callback,u_char*user)参数说明:这个函数类似于pcap_dispatch函数,除了它继续读取数据报直至完成cnt个报的处理,或者文件处理完(在offline情况下),或者有错误 发生为止。它不会在实时读超时时返回(而如果为pcap_open_live()函数指定了一个非零值的超时设置,然后调用pcap_dispatch()函数,则当超时发生时pcap_dispatch()函数会返回。),2、函数名称:int pcap_loo
25、p(pcap_t*p,int cnt,pcap_handler callback,u_char*user)参数说明:注意第三个参数,callback是pcap_handler类型的变量。这是一个用户提供的有着三个参数的子函数。定义为:void user_routine(u_char*user,struct pcap_pkthdr*phrd,u_char*pdata)这三个参数中,user,是传递给pcap_dispatch()的那个参数;phdr,是个pcap_pkthdr类型的指针,是savefile中的数据报的头指针,pdata,指向数据报数据;这个函数允许用户定义子集的数据报过滤程序;参
26、数:pcap_t*p:pcap_open_live返回的数据报捕获的指针;int cnt:规定了函数返回前应处理的数据报数目;pcap_handler callback:指向一个用户自定义的函数,在处理每个报后自动调用该函数进行再处理;u_char*user:该指针用于传递给callback.(不知道有什么用?)返回值:如果函数成功执行(包括读文件时读到EOF),则返回0.否则返回-1,那么错误信息将由函数pcap_geterr或pcap_perror给出;,3、函数名称:u_char*pcap_next(pcap_t*p,struct pcap_pkthdr*h)函数功能:捕获一个网络数据包,然后返回此数据包。参数说明:参数p表示Libpcap句柄;参数h表示数据包头部信息4、函数名称:int pcap_datalink(pcap_t*p)函数功能:返回数据链路层类型。5、函数名称:void pcap_close(pcap_t*p)函数功能:关闭Libpcap 操作,并释放资源。,七、示例,获取接口名称和掩码等信息捕获一个数据包捕获多个数据包一个以太网数据包的捕获多个以太网数据包的捕获ARP数据包的捕获IP数据包的捕获TCP数据包的捕获综合实例,