linux下libpcap抓包分析.doc_第1页
linux下libpcap抓包分析.doc_第2页
linux下libpcap抓包分析.doc_第3页
linux下libpcap抓包分析.doc_第4页
linux下libpcap抓包分析.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

linux下libpcap抓包分析一、首先下载libpcap包/#latest-release然后安装,安装完成后进入安装根目录的tests文件夹,编译运行findalldevstest.c(编译时加上-lpcap),查看是否发现所有网络设备。二、下载wireshark观察抓包软件的各种功能三、熟悉libpcap工作原理:四、了解libpcap抓包基本流程:H五、编程实现未完待续。PS:整理了一下libpcap常用的数据类型定义 libpcap的类型定义:0)、typedef int bpf_int321)、typedef u_int bpf_u_int32 32bit 的无类型整形;2)、typedef pcap pcap_t Descriptor of an open capture instance(一个打开的捕获实例的描述符?)这个结构对用户是不透明的。3)、typedef pcap_dumper pcap_dumper_tlibpcap保存文件的描述符。4)、typedef pcap_if pcap_if_t网卡链表的一个元素;5)、typedef pcap_addr pcap_addr_t网卡地址的表示;6)、typedef void (*pcap_handler)(u_char *args, const struct pcap_pkthdr *header, const u_char *packet); 其中agrs是从pcap_dispatch()函数传递过来的第四个形参 ,一般我们自己的包捕捉程序不需要提供它,总是为NULL ;header指向pcap_pkthdr结构,该结构位于真正的物理帧前面,用于消除不同链路层支持的差异 ;packet指向所捕获报文的物理帧。 libpcap结构体Libpcap库函数所必须的数据结构定义主要包含在pcap.h和pcap-int.h两个头文件中1)、pcap结构在pcap-int.h头文件中被定义:编程时需要涉及到的成员有:int fd; 打开设备的描述符;u_char *buffer; 是指向所捕获到数据的缓冲区指针struct pcap int fd; /* 文件描述字,实际就是 socket */ int selectable_fd; /* 在 socket 上,可以使用 select() 和 poll() 等 I/O 复用类型函数 */ int snapshot; /* 用户期望的捕获数据包最大长度 */ int linktype; /* 设备类型 */ int tzoff; /* 时区位置,实际上没有被使用 */ int offset; /* 边界对齐偏移量 */ int break_loop; /* 强制从读数据包循环中跳出的标志 */ struct pcap_sf sf; /* 数据包保存到文件的相关配置数据结构 */ struct pcap_md md; /* 具体描述如下 */ int bufsize; /* 读缓冲区的长度 */ u_char buffer; /* 读缓冲区指针 */ u_char *bp; int cc; u_char *pkt; /* 相关抽象操作的函数指针,最终指向特定操作系统的处理函数 */ int (*read_op)(pcap_t *, int cnt, pcap_handler, u_char *); int (*setfilter_op)(pcap_t *, struct bpf_program *); int (*set_datalink_op)(pcap_t *, int); int (*getnonblock_op)(pcap_t *, char *); int (*setnonblock_op)(pcap_t *, int, char *); int (*stats_op)(pcap_t *, struct pcap_stat *); void (*close_op)(pcap_t *); /*如果 BPF 过滤代码不能在内核中执行,则将其保存并在用户空间执行 */ struct bpf_program fcode; /* 函数调用出错信息缓冲区 */ char errbufPCAP_ERRBUF_SIZE + 1; /* 当前设备支持的、可更改的数据链路类型的个数 */ int dlt_count; /* 可更改的数据链路类型号链表,在 linux 下没有使用 */ int *dlt_list; /* 数据包自定义头部,对数据包捕获时间、捕获长度、真实长度进行描述 pcap.h */ struct pcap_pkthdr pcap_header;/* 包含了捕获句柄的接口、状态、过滤信息 pcap-int.h */struct pcap_md /* 捕获状态结构 pcap.h */struct pcap_stat stat; int use_bpf; /* 如果为1,则代表使用内核过滤*/ u_long TotPkts; u_long TotAccepted; /* 被接收数据包数目 */ u_long TotDrops; /* 被丢弃数据包数目 */ long TotMissed; /* 在过滤进行时被接口丢弃的数据包数目 */ long OrigMissed; /*在过滤进行前被接口丢弃的数据包数目*/#ifdef linux int sock_packet; /* 如果为 1,则代表使用 2.0 内核的 SOCK_PACKET 模式 */ int timeout; /* pcap_open_live() 函数超时返回时间*/ int clear_promisc; /* 关闭时设置接口为非混杂模式 */ int cooked; /* 使用 SOCK_DGRAM 类型 */ int lo_ifindex; /* 回路设备索引号 */ char *device; /* 接口设备名称 */* 以混杂模式打开 SOCK_PACKET 类型 socket 的 pcap_t 链表*/struct pcap *next;#endif;(2)bpf_program结构该结构在pcap_compile()函数中被使用,在bpf.h头文件中定义。/* pcap-bpf.h */struct bpf_program u_int bf_len; /* BPF 代码中谓词判断指令的数目 */struct bpf_insn *bf_insns; /* 第一个谓词判断指令 */;/* 谓词判断指令结构 */struct bpf_insn u_short code;u_char jt;u_char jf;bpf_int32 k;(3)/usr/include/net/bpf.h/* Structure prepended to each packet.*/内核过滤器每输出一个包,将在输出的数据前加了20字节的数据,这就是 struct bpf_hdrstruct bpf_hdr struct timeval bh_tstamp; /* time stamp */ bpf_u_int32 bh_caplen; /* length of captured portion数据长度*/ bpf_u_int32 bh_datalen; /* original length of packet实际包长度 */ u_short bh_hdrlen; /* length of bpf header (this struct plus alignment padding) */;(4)pcap_stat结构调用函数 pcap_stats() 可以返回一个该结构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 */;5)、struct pcap_addr:网卡地址描述pcap_addr *next;如果非空,指向链表中一个元素的指针;空表示链表中的最后一个元素sockaddr *addr; 指向包含一个地址的sockaddr的结构的指针sockaddr *netmask;如果非空,指向包含相对于addr指向的地址的一个网络掩码的结构sockaddr *broadaddr;如果非空,指向包含相对于addr指向的地址的一个网络掩码的结构sockaddr *dstaddr; 如果非空,指向一个相对于addr指向的源地址的目的地址,如果网络不支持点对点通讯,则为空;6)、dump文件格式首先是Dump文件头struct pcap_file_header bpf_u_int32 magic;u_short version_major;u_short version_minor;bpf_int32 thiszone; /* 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_*) */;然后是每一个包的包头和数据pcap_pkthdr结构/usr/include/pcap.h/* Each packet in the dump file is prepended with this generic header.* This gets around the problem of different headers for different* packet interfaces.*/* 自定义头部在把数据包保存到文件中也被使用 */struct pcap_pkthdr struct timeval ts; /* 捕获时间戳 */ bpf_u_int32 caplen; /* 捕获到数据包的长度 */ bpf_u_int32 len; /* 数据包的真正长度 */* 单个数据包结构,包含数据包元信息和数据信息 */struct singleton pcap.cstruct pcap_pkthdr hdr; /* libpcap 自定义数据包头部 */const u_char *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论