- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章 基于Libpcap的网络编程技术 内容 常见的包捕获机制 BPF DLPI NIT SOCK-PACKET类型套接口 包过滤机制实际上是针对数据包的布尔值操作函数,如果函数最终返回 true,则通过过滤,反之则被丢弃。形式上包过滤由一个或多个谓词判断的并操作(AND)和或操作(OR)构成,每一个谓词判断基本上对应了数据包的协议类型或某个特定值,例如,只需要 TCP 类型且目的端口为 110 的数据包。 一个完整的包捕获和过滤机制包含三个主要部分: 最底层是特定操作系统的包捕获机制 中间是包过滤机制 最高层是针对用户程序的接口 Libpcap 软件包可从/下载,Libpcap 包含 20 多个 C 文件,但在 Linux 系统下不是所有文件都用到。 Libpcap库是基于BPF(Berkeley Packet Filter) 的。在BPF的基础上,Libpcap提供接口函数供其他程序调用,可以捕获、分析和过滤数据包,以获得感兴趣的数据包。 BPF的结构 1、检查网络设备 ? Libpcap 程序的第一步通常是在系统中找到合适的网络接口设备。在Linux 中最常见的接口设备名 eth0 和 lo。 Libpcap 调用 pcap_lookupdev() 函数获得可用网络接口的设备名。 char *pcap_lookupdev(char *errbuf),该函数用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络设备名(一个字符串指针)。如果函数出错,则返回NULL,同时errbuf中存放相关的错误消息。 检查网络设备中主要使用到的函数关系 首先利用函数 getifaddrs() 获得所有网络接口的地址,以及对应的网络掩码、广播地址、目标地址等相关信息,再利用 add_addr_to_iflist()、add_or_find_if()、get_instance() 把网络接口的信息增加到结构链表 pcap_if 中,最后从链表中提取第一个接口作为捕获设备。 /*libpcap自定义的接口信息链表*/ struct pcap_if { struct pcap_if *next; char *name; /* 接口设备名 */ char *description; /* 接口描述 */ /*接口的 IP 地址, 地址掩码, 广播地址,目的地址 */ struct pcap_addr addresses; bpf_u_int32 flags; /* 接口的参数 */ }; 2、打开网络设备 ? 当设备找到后,下一步工作就是打开设备以准备捕获数据包。打开网络设备的主函数是 pcap_open_live(),其任务就是通过给定的接口设备名,获得一个捕获句柄。 pcap_t *pcap_open_live(char *device, int snaplen,int promisc, int to_ms,char *ebuf) 参数说明: device:为指定打开的网络设备名。 snaplen:定义捕获数据的最大字节数。 promisc:指定是否将网络接口置于混杂模式,1混杂模式,0正常模式; to_ms:指定超时时间(毫秒)。 ebuf:仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。 3、获取网络号和掩码??? ? ? int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf) 获得指定网络设备的网络号和掩码。netp参数和maskp参数都是bpf_u_int32指针。如果函数出错,则返回-1,同时errbuf中存放相关的错误消息。 4、编译和设置过滤器 ? int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask) 该函数用于解析过滤规则串,填写bpf_program结构,将str参数指定的字符串编译到过滤程序中。fp是一个bpf_program结构的指针,在pcap_compile()函数中被赋值。optimize参数控制结果代码的优化。netmask参数指定本地网络的子网掩码。 ? int pcap_setfilter(pcap_t *p, struct bpf_program *fp
文档评论(0)