赞
踩
学习通过侦听网卡获取报文的程序,遇到部分pacp抓包库中的函数,在查阅资料后,作以下整理说明:
1. pcap_next_ex(): 基于非回调函数的捕获数据包,参数有三个,一个网卡描述符,两个指针,两个指针会被初始化并返回给用户,一个是pcap_pkthdr结构,一个是接收数据的缓冲区。pcap_pkthdr结构如下所示:
struct pcap_pkthdr
{
struct timeval ts; ts是一个结构struct timeval,它有两个部分,第一部分是1900开始以来的秒数,第二部分是当前秒之后的毫秒数
bpf_u_int32 caplen; 表示抓到的数据长度
bpf_u_int32 len; 表示数据包的实际长度
}
2.pcap_open():
pcap_t *pcap_open(const char * source,
int snaplen,
int flags,
int read_timeout,
struct pcap_rmtauth * auth,
char * errbuf
)
为捕获/发送数据打开一个普通的源,pcap_open()能够替代所有的pcap_open_xxx()函数,它隐藏了不同的pcap_open_xxx()之间的差异,所以程序员不必使用不同的open函数。
source:的是包含要打开的源名称的以’\0’结尾的字符串。源名称得包含新的源规范语法(Source Specification Syntax),并且它不能为NULL。为了方便的使用源语法,请记住:(1)pcap_findalldevs_ex()返回的适配器(网卡)可以直接被pcap_open()使用;(2)万一用户想传递他自己的源字符串给pcap_open(),pcap_createsrcstr()可以创建正确的源标识。
snaplen:需要保留的数据包的长度。对每一个过滤器接收到的数据包,第一个‘snaplen’字节的内容将被保存到缓冲区,并且传递给用户程序。例如,snaplen等于100,那么仅仅每一个数据包的第一个100字节的内容被保存。简言之就是从每一个包的开头到snaplen的那段内容将被保存。
flags:保存一些由于抓包需要的标志。Winpcap定义了三种标志:
l PCAP_OPENFLAG_PROMISCUOUS:1,它定义了适配器(网卡)是否进入混杂模式(promiscuous mode)。
l PCAP_OPENFLAG_DATATX_UDP:2,它定义了数据传输(假如是远程抓包)是否用UDP协议来处理。
l PCAP_OPENFLAG_NOCAPTURE_RPCAP:4,它定义了远程探测器是否捕获它自己产生的数据包。
read_timeout:以毫秒为单位。read timeout被用来设置在遇到一个数据包的时候读操作不必立即返回,而是等待一段时间,让更多的数据包到来后从OS内核一次读多个数据包。并非所有的平台都支持read timeout;在不支持read timeout的平台上它将被忽略。
auth:一个指向’struct pcap_rmtauth’的指针,保存当一个用户登录到某个远程机器上时的必要信息。假如不是远程抓包,该指针被设置为NULL。
errbuf:一个指向用户申请的缓冲区的指针,存放当该函数出错时的错误信息。
返回值是一个’pcap_t’指针,它可以作为下一步调用(例如pcap_compile()等)的参数,并且指定了一个已经打开的Winpcap会话。在遇到问题的情况下,它返回NULL并且’errbuf’变量保存了错误信息。
3.pcap_datalink():
返回链路层的类型,链路层的类型包括:
DLT_NULL: BSD回路封装;链路层协议头是一个4字节的域,以主机字节顺序(host byte order),包含一个从socket.h来的PF_value。主机字节顺序(host byte order)是捕获数据包的机器的字节顺序,而PF_value是捕获数据包的机器的OS。如果一个读取一个文件,字节顺序和PF_value不一定是抓取文件的那些机器。
DLT_EN10MB: 以太网(10Mb, 100Mb, 1000Mb, 或者更高)。
DLT_IEEE802: IEEE802.5令牌环网。
DLT_ARCNET:ARCNET。
DLT_SLIP:SLIP。
DLT_PPP:PPP;如果第一个字节是0xff或0x03,它是类HDLC帧上的PPP。
DLT_FDDI:FDDI
DLT_ATM_RFC1483:RFC1483LLC/SNAP ATM;数据包以IEEE802.2 LLC头开始。
DLT_RAW:原始IP(raw IP);数据包以IP头开始。
DLT_PPP_SERIAL:按照RFC1662,基于类HDLC帧的PPP,或者按照RFC1547的4.3.1,基于HDLC帧的Cisco PPP;前者的第一个字节是0xFF,后者的第一个字节是0x0F或0x8F。
DLT_PPP_ETHER:按照RFC2516,PPPoE;数据包以PPPoE头开始。
DLT_C_HDLC:按照RFC1547的4.3.1,基于HDLC帧的Cisco PPP。
DLT_IEEE802_11:IEEE 802.11无线局域网。
DLT_FRELAY:帧中继(Frame Relay)。
DLT_LOOP:OpenBSD回路封装。
DLT_LINUX_SLL:Linux抓包封装。
DLT_LTALK:苹果的LocalTalk,数据包以AppleTalk LLAP头开始。
DLT_PFLOG:OpenBSD pflog。
DLT_PRISM_HEADER:后接802.11头的棱镜监视器模式(Prism monitor mode)信息。
DLT_IP_OVER_FC:RFC2625 IP-over-Fiber 频道,以RFC2625中定义的Network_Header开始。
DLT_SUNATM:SunATM设备。
DLT_IEEE802_11_RADIO:后接802.11头的链路层信息。
DLT_ARCNET_LINUX:没有异常帧的ARCNET。
DLT_LINUX_IRDA:Linux-IrDA数据包,DLT_LINUX_SLL头后接IrLAP头。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。