网络分析技术揭秘:原理、实践与WinPcap深入解析_吕雪峰;彭文波;宋泽宇_AZW3_MOBI_EPUB_PDF_电子书(无页码)_吕雪峰;彭文波;宋泽宇
内容节选
8.1使用WinPcap发送数据包 针对不同的应用情况,WinPcap提供了下列四种方式来把原始数据包发送到网络中。 ❑每次发送一个数据包一次。 ❑每次发送一个数据包,但在内核中重复发送多于一次,次数预先设定。 ❑每次发送一个发送队列(发送队列是一个容器,它能容纳不同数量的数据包),并根据每个数据包的时间戳严格按顺序发送各数据包(称为同步方式)。 ❑每次发送一个发送队列,但不根据每个数据包的时间戳发送各数据包,而是尽可能快速地发送各数据包(称为异步方式)。 用户可根据实际需要来选择合适的发送方式,具体的选择方法及有关各发送方式的性能比较可参见第13章。 8.1.1 wpcap.dll库导出的相应函数 WinPcap为了使用户能够顺利完成数据包的发送任务,在库wpcap.dll中提供了下列函数,用户可以很方便地使用它们。 pcap_sendpacket函数发送单个原始数据包一次或多次,其原型如下:int pcap_sendpacket(pcap_t*p,u_char*buf,int size); pcap_send_queue函数分配一个发送队列,其原型如下:pcap_send_queue*pcap_sendqueue_alloc(u_int memsize); pcap_sendqueue_queue函数把一个原始数据包添加到queue参数所指定的发送队列的尾部,其原型如下:int pcap_sendqueue_queue(pcap_send_queue*queue, const struct pcap_pkthdr*pkt_header, const u_char*pkt_data); pcap_sendqueue_transmit函数发送一个数据包队列到网络,其原型如下:u_int pcap_sendqueue_transmit(pcap_t*p, pcap_send_queue*queue,int sync); pcap_sendqueue_destroy函数释放与一个发送队列相关的所有资源其原型如下:void pcap_sendqueue_destroy(pcap_send_queue*queue) 8.1.2 数据包发送实例 为了更好地理解在网络分析中如何根据实际要求发送数据包,本节将使用WinPcap所提供的函数来演示各种发送方式,同时还分别提供了典型的使用实例程序与简单的测试结果。 1.发送单个数据包 下面的代码将演示如何通过WinPcap提供的pcap_sendpacket函数发送单个数据包一次,完整的代码见[ch8/send工程]。/* 生成数据包的函数*/ void gen_packet(unsigned char*buf,int len); int main() { /*获得系统的网络适配器设备列表,并选择一个的适配器设备,打开它*/ …… /*发送数据包*/ //生成数据包 int packetlen=100;//数据包长度为100字节 unsigned char*buf=(unsigned char*)malloc(packetlen); memset(buf,0x0,packetlen); gen_packet(buf,packetlen);//获得生成的数据包,长度为packetlen //开始数据包发送 if((ret=pcap_sendpacket(adhandle,buf,packetlen))==-1) { //发送失败,释放资源,程序返回 …… return-1; } /* *释放资源, *包括关闭打开的适配器,释放适配器设备列表,释放存储待发数据包的内存 */ …… return 0; } 此实例程序在打开了合适的网络适配器后,为了存储数据包,会执行内存分配并清零。然后调用gen_packet函数生成一个数据包,该数据包的长度为100字节。最后调用WinPcap库的pcap_sendpacket函数把该数据包发送到网络上。其中gen_packet函数负责生成数据包,其参数buf用来保存所生成数据包的内容,len为要求生成的数据包的长度。 注意 该函数所生成的数据包没有任何实际意义,仅起演示作用。 gen_packet函数的具体实现如下:void gen_packet(unsigned char*buf,int len) { int i=0; // 给数据包的第0到5字节填充目标MAC地址:01:01:01:01:01 for(i=0;i<6;i++) { buf[i]=0x01; } //给数据包的第6到11字节填充源MAC地址:02:02:02:02:02 for(i=6;i<12;i++) { buf[i]=0x02; } //给数据包的第12到13字节填充协议标识0xcd,无任何......
- 信息
- 前言
- 第1章 揭开网络分析的神秘面纱
- 1.1 网络分析概述
- 1.2 网络分析的主要用途
- 1.3 黑客使用嗅探器的方法
- 1.4 被嗅探数据的真面目
- 1.5 常见的网络分析器
- 1.6 网络分析器的工作原理
- 1.7 嗅探器的检测
- 1.8 网络分析工具的主要功能组成
- 1.9 Wireshark的概述、安装与使用
- 1.10 小结
- 第2章 初识网络分析基础库WinPcap
- 2.1 WinPcap概述
- 2.2 WinPcap的优点
- 2.3 WinPcap的使用者
- 2.4 WinPcap的体系架构
- 2.5 用户空间库接口函数
- 2.6 小结
- 第3章 网络分析工具的内核驱动基础知识
- 3.1 Windows驱动程序基础知识
- 3.2 NDIS协议驱动程序
- 3.3 小结
- 第4章 编译与使用WinPcap
- 4.1 源代码目录结构
- 4.2 构建驱动程序NPF
- 4.3 构建Packet.dll库
- 4.4 构建wpcap.dll库
- 4.5 安装NPF驱动程序与各库文件
- 4.6 使用WinPcap库进行程序开发的实例
- 4.7 小结
- 第5章 WinPcap驱动程序的初始化与清除
- 5.1 驱动程序中的初始化函数DriverEntry
- 5.2 驱动程序中的卸载函数DriverUnload
- 5.3 小结
- 第6章 获得与释放网络适配器设备列表
- 6.1 使用WinPcap选择合适的适配器
- 6.2 获得网络适配器列表的幕后
- 6.3 释放网络适配器列表的实现
- 6.4 小结
- 第7章 打开与关闭适配器
- 7.1 使用WinPcap打开与关闭适配器
- 7.2 打开与关闭适配器的幕后
- 7.3 小结
- 第8章 数据包的发送
- 8.1 使用WinPcap发送数据包
- 8.2 数据包发送的幕后
- 8.3 小结
- 第9章 数据包的内核过滤
- 9.1 基础知识
- 9.2 WinPcap数据包过滤基础
- 9.3 使用WinPcap过滤数据包
- 9.4 数据包过滤的幕后
- 9.5 小结
- 第10章 数据包的接收
- 10.1 使用WinPcap接收数据包
- 10.2 数据接收的幕后
- 10.3 小结
- 第11章 统计网络流量与网络状态
- 11.1 使用WinPcap进行网络统计的方法
- 11.2 网络统计的幕后11.2.1工作模式
- 11.3 小结
- 第12章 文件的存储与读取
- 12.1 libpcap文件存储格式
- 12.2 使用WinPcap进行文件存储与读取
- 12.3 数据包文件存储的幕后
- 12.4 数据包文件读取的幕后
- 12.5 内核文件转储的实现
- 12.6 小结
- 第13章 修改源代码
- 13.1 给wpcap.dll增加设置重复发送次数的函数
- 13.2 修改WinPcap的内核驱动代码
- 13.3 小结
- 第14章 性能测试与分析
- 14.1 测试环境
- 14.2 测试实例
- 14.3 小结
- 附录A 源语法规范
- 附录B 过滤表达式规范
- 附录C SYN洪泛攻击的详细资料
- C.1 SYN洪泛攻击原理
- C.2 使用WinPcap实现SYN洪泛攻击的方法
- C.3 SYN洪泛攻击的防御
- 附录D ARP欺骗资料
- D.1 ARP简介
- D.2 ARP工作原理
- D.3 常见ARP攻击类型
- D.4 局域网ARP欺骗的应对
- D.5 常用的防护方法
- D.6 ARP欺骗的正当用途
- 参考文献