《网络分析技术揭秘:原理、实践与WinPcap深入解析》
作者:吕雪峰,彭文波,宋泽宇
出版时间:2012年7月
豆瓣收藏:
http://book.douban.com/subject/10830686/
【内容简介】
本书结合著名的开源软件库WinPcap来说明网络分析技术的实现原理及使用方法。其中包括WinPcap内核驱动,编译与使用,数据包的捕获、发送、内核过滤与接收,以及网络流量的统计与网络状态的分析等重要内容,而且作者还通过修改内核级的源代码解决了开源代码本身尚未完成的一个重要功能—数据包的内核转储。经过系统深入的分析,读者既能对WinPcap的架构、使用与实现机制有深入的理解,又能快速熟悉操作系统内核与用户层交互的实现机制,并全面了解网络分析专业各方面的技术,进而将相关知识运用到实际项目中。
如果您的工作与网络软件相关,无论是开发人员还是测试人员,我们都强烈建议您阅读这本书。
【作者简介】
吕雪峰,华中科技大学控制工程与控制理论专业硕士,资深软件工程师,国船电气(武汉)有限公司软件技术总监。是目前国内对WinPcap进行彻底分析研究 的先驱,活跃于51CTO、ChinaUnix、CSDN等社区。对WinPcap与网络分析具有深入的理解,在《计算机应用》等学术期刊上发表核心论文 多篇。尤精于嵌入式Linux。
彭文波,从事互联网产品工作,曾在省级电子商务认证中心从事安全开发工作,曾就职于多家专业网管软件公司,先后参与了电子商务认证系统、移动网络管理系统等产品的开发。
宋泽宇,七二二研究所数字通信专业硕士,高级工程师,国船电气(武汉)有限公司副总经理,曾参与多个大型项目的研制工作。
【样章试读】
网络分析技术揭秘:原理、实践与WinPcap深入解析.part1.rar
网络分析技术揭秘:原理、实践与WinPcap深入解析.part2.rar
【前言】
写本书的缘由
过去我一直在从事软件开发相关的工作,主要负责软件开发、软件测试及软件工程的研究。其中包括Windows操作系统应用软件的开发,Linux操作系统应用软件与驱动程序的开发,并且还做过一些嵌入式软件开发。在这些工作中,我会协助其他开发人员、测试人员构建达到工业级标准的软件,或者帮助他们提高软件开发或测试的技术水平。期间,我们不断遇到各种各样的问题,有的可以轻松解决,有的却要绞尽脑汁才能解决。在这个过程中,我也一直在思考一个问题,那就是:
软件开发人员与软件测试人员除了要对应用程序有清晰的理解外,是否还需要对支撑应用软件运行的操作系统、共享库等有深入的理解?
我想,可以以我亲身经历的两个案例为例来回答这个问题。
案例1:嗅探软件掉包问题
某自行开发的网络数据包嗅探软件在对被测设备进行数据包分析时、发现有掉包现象,但被测设备运行正常。经过我们仔细分析,发现该嗅探软件的设计有如下问题:在软件架构的设计上,没有考虑在高速网络流量情况下应该采取一定的措施来防止掉包现象。
软件测试人员对该嗅探软件进行了各种优化,比如增加缓冲区的大小、降低显示的复杂度、分析代码性能瓶颈等,但效果都不明显。后来,通过对所调用的WinPcap库的仔细分析,获得以下解决方案:让WinPcap的内核驱动程序NPF实现协议过滤,而不是通过嗅探软件进行过滤,同时在内核中实现数据包的存储,而不是导入应用层后进行存储。这样可显著地降低内核空间与用户空间进行数据交互的时间耗费。
该案例提醒我们,测试人员在开发测试工具时,需要对所使用的支撑软件有深入的理解,这样才能更好地解决所遇到的实际问题。内核层的过滤与转储功能是WinPcap库NPF驱动程序提供的优化功能,可以缓解捕获高速网络流量的掉包问题。
案例2:A/D转换器(模拟数字转换器)数据采集系统掉点问题
某基于嵌入式Linux系统实现的A/D转换器数据采集系统,在对所采集的数据进行存储时,出现掉点现象。经过仔细调试,我们发现采样率还不到所要求的一半时就开始出现掉点现象了,且采样率越高掉点现象越严重。
由于项目组相关人员对Linux驱动程序的机制了解不够深入,应用层软件开发人员对软件进行的各种调优都收效甚微。相关人员曾一度怀疑这一现象是文件系统存储速度慢导致的,即是硬件问题导致的,项目陷入困境。后来,在对A/D转换器驱动程序进行仔细分析后,发现导致问题的原因是:内核缓冲机制不对,同时内核向用户层提交数据耗时。最终的解决方案是:采用双缓冲机制,并直接在内核存储所采集的数据。
该案例提醒我们,开发人员开发软件时,需要对底层系统软件有深入的理解,这样才能有效地开发出高性能的软件。Linux驱动程序所采用的实现机制对用户层软件性能的影响非常大。Linux针对不同的应用类型提供了多种不同的解决方案,我们需要学会选择。
看了上述案例,再来回顾一下我前面提出的问题:软件开发人员与软件测试人员有必要对支撑应用软件运行的操作系统、共享库等有深入的理解吗?答案是肯定的,尤其对于从事软件系统架构设计与分析、软件故障问题定位与软件性能评测的高级开发人员与高级测试人员来说,这些都是一定要掌握的基础知识。在软件系统日益复杂的今天,浅尝辄止的人是不可能在技术上有所成就的。
但是,如何进行这种有效的、深入的学习呢?尤其是对于软件行业中的“菜鸟”而言。在Linux平台下,我们可以查看几乎所有的源代码,从资源的角度来说,学习相关知识并无太大难度。但是在Windows平台下,资源的不透明首先就阻止了你前进的脚步。
计算机网络的迅速发展,使网络安全、网络性能、网络软件质量等相关问题也随之凸显。这些问题也越来越受人们的关注,并且逐渐成为网络应用所面临的严重问题。正是在这种形势下,网络分析逐渐成为一门独立的、专门的学科,而市面上目前还没有该学科的相关书籍。
那么,如果把这两方面的问题进行有机的结合,这样可使读者既能深入地学习软件技能,又能全面了解网络分析专业各方面的技术,岂不是鱼肉熊掌可兼得?我经过长时间的探索发现,对WinPcap开源库的源代码进行深入的、仔细的分析,并熟悉网络分析专业知识,可显著加快学习的步伐。
本书十分重视实践性。除了使读者熟悉网络分析技术外,书中还以开源软件WinPcap为基础具体演示了网络分析各项技术的使用方法和实现原理,方便读者学习。这样安排是希望读者跟着书本内容进行实践,能尽快将所学知识运用到实际的工作中去。
读者对象
本书重点关注网络分析技术的使用和实现原理,并对其进行了透彻的分析,故可为想了解、使用甚至精通网络分析技术的人员提供全面的、详细的参考。
本书深入地、全面地叙述了网络分析的核心技术,并以大量示例演示了相关概念,其中包括进行网络分析必要的各种软硬件基础知识,网络数据包的捕获、发送、分析、文件转储等方面的内容。因此本书适合各层次的网络分析人员使用,例如网络软件开发人员与网络软件测试人员从中可获得许多网络分析与软件设计的知识;网络安全工程师可以从中获得网络攻击者所使用技术的一些细节知识。
同时,WinPcap本身就是一个非常优异的开源库,对这个库的源代码的学习非常有益于提高软件设计与编码能力,所以本书也适合作为软件开发人员学习的参考用书。
总而言之,如果您的工作与网络软件相关,无论是开发人员还是测试人员,我们都强烈建议您阅读本书,并希望大家都能够从本书中有所收获。
所需技术基础
为了更好地学习本书的内容,要求读者:
熟悉C语言。不要求能编写很棒的C代码,但是熟悉C语言的基础知识会对学习本书很有帮助。
有一些网络的基本知识。不要求熟悉网络的各个方面,但是对集线器、UDP等术语有一定的感性认识会对学习本书很有帮助。
本书的组织结构
为了帮助读者更好地使用本书,我对各章节的顺序进行了多次调整,以便能够让读者由浅入深地阅读。建议读者从第1章开始顺序阅读本书,当然,如果读者对某些内容已经了解,也可以根据个人情况有选择地阅读。
本书涉及网络协议、Windows内核驱动与网络协议驱动、网络分析、用户应用软件等诸多知识。为了防止大段大段的理论使读者望而却步,书中尽量从示例的演示开始讲解,只在必要的时候才插入必需的理论说明,以帮助读者理解。
本书的约定
书中并未严格区分数据包、数据报、数据帧的定义,同时对网络分析与网络嗅探的定义也未做严格区分,读者可从上下文内容加以理解。
代码及相关更新
本书基于目前WinPcap最新4.1.2版本的源代码进行分析,源代码可从官方网站http://www.winpcap.org获取。
本书示例代码下载地址:http://115.com/file/be3zm3eu,也可以发送邮件到winpcap@126.com直接获取示例代码。本书所有示例的源代码,以及对WinPcap源代码本身的修改仅仅是为了演示,作者并不对读者使用这些代码作任何限制,同时也不对读者使用这些代码所带来的问题与后果负任何责任。
其他
网络分析其实包含了很广泛的内容,希望本书能起到抛砖引玉的作用。由于篇幅有限,同时需要持续采用一个便于理解的主线来描述,再加上作者的知识、时间与经验有限,因此书中难免会有疏漏或者不妥之处,欢迎广大读者通过邮件进行交流,我们将尽量为您提供最满意的解答。本书专用服务邮箱是winpcap@126.com。
【目录】
前 言
第1章揭开网络分析的神秘面纱/ 1
1.1网络分析概述/ 1
1.2网络分析的主要用途/ 3
1.3黑客使用嗅探器的方法/ 4
1.4被嗅探数据的真面目/ 6
1.4.1使用嗅探器获得FTP的用户名和密码/ 6
1.4.2使用嗅探器分析冲击波蠕虫(Blaster Worm)/ 7
1.5常见的网络分析器/ 10
1.6网络分析器的工作原理/ 11
1.6.1以太网简介/ 11
1.6.2理解开放系统互连(OSI)模型/ 11
1.6.3了解CSMA/CD协议/ 15
1.6.4IP、ICMP、TCP与UDP协议/ 16
1.6.5硬件/ 17
1.6.6欺骗交换机/ 19
1.7嗅探器的检测/ 21
1.7.1检测嗅探器的原理/ 21
1.7.2防止网络嗅探可采取的安全措施/ 22
1.8网络分析工具的主要功能组成/ 22
1.9Wireshark的概述、安装与使用/ 24
1.9.1Wireshark的概述/ 24
1.9.2Wireshark的安装/ 24
1.9.3Wireshark的使用/ 26
1.10小结/ 30
第2章初识网络分析基础库WinPcap/ 31
2.1WinPcap概述/ 31
2.2WinPcap的优点/ 31
2.3WinPcap的使用者/ 32
2.4WinPcap的体系架构/ 33
2.4.1WinPcap的主要组成/ 33
2.4.2数据包捕获的基本过程/ 34
2.4.3WinPcap的驱动程序/ 35
2.4.4WinPcap内核驱动的主要功能/ 36
2.5用户空间库接口函数/ 39
2.5.1wpcap.dll库中的重要函数/ 39
2.5.2Packet.dll库中的重要函数/ 42
2.6小结/ 44
第3章网络分析工具的内核驱动基础知识/ 45
3.1Windows驱动程序基础知识/ 45
3.1.1驱动对象(DRIVER_OBJECT)/ 45
3.1.2设备对象(DEVICE_OBJECT)/ 46
3.1.3设备扩展(_DEVICE_EXTENSION)/ 48
3.1.4IRP与派遣函数/ 49
3.1.5同步处理/ 50
3.1.6内核的内存操作/ 55
3.1.7内存操作的运行时函数/ 56
3.1.8内核的注册表操作/ 57
3.2NDIS协议驱动程序/ 63
3.2.1三种类型的网络驱动程序/ 63
3.2.2协议驱动程序的特征结构体/ 64
3.3小结/ 67
第4章编译与使用WinPcap/ 68
4.1源代码目录结构/ 68
4.2构建驱动程序NPF/ 69
4.3构建Packet.dll库/ 70
4.4构建wpcap.dll库/ 72
4.5安装NPF驱动程序与各库文件/ 73
4.6使用WinPcap库进行程序开发的实例/ 73
4.7小结/ 83
第5章WinPcap驱动程序的初始化与清除/ 84
5.1驱动程序中的初始化函数DriverEntry/ 84
5.1.1DriverEntry函数的工作流程/ 84
5.1.2DriverEntry函数的具体实现/ 86
5.2驱动程序中的卸载函数DriverUnload/ 103
5.3小结/ 105
第6章获得与释放网络适配器设备列表/ 106
6.1使用WinPcap选择合适的适配器/ 106
6.1.1wpcap.dll库导出的相应函数/ 106
6.1.2获得与释放网络适配器列表的实例/ 107
6.1.3获取已安装设备高级信息的实例/ 109
6.2获得网络适配器列表的幕后/ 109
6.2.1wpcap.dll库中获得网络适配器列表的实现/ 109
6.2.2Packet.dll库中获得网络适配器列表的实现/ 122
6.2.3内核空间中获得网络适配器列表的实现/ 141
6.3释放网络适配器列表的实现/ 143
6.4小结/ 144
第7章打开与关闭适配器/ 145
7.1使用WinPcap打开与关闭适配器/ 145
7.1.1wpcap.dll库导出的相应函数/ 145
7.1.2关键数据结构pcap_t / 146
7.1.3打开与关闭网络适配器的实例/ 147
7.2打开与关闭适配器的幕后/ 151
7.2.1打开适配器的实现/ 151
7.2.2关闭适配器的实现/ 200
7.3小结/ 207
第8章数据包的发送/ 208
8.1使用WinPcap发送数据包/ 208
8.1.1wpcap.dll库导出的相应函数/ 208
8.1.2数据包发送实例/ 209
8.2数据包发送的幕后/ 217
8.2.1发送单个数据包的实现/ 219
8.2.2单个数据包发送多次的实现/ 236
8.2.3发送队列方式的实现/ 238
8.3小结/ 254
第9章数据包的内核过滤/ 255
9.1基础知识/ 255
9.1.1flex和bison简介/ 255
9.1.2#line宏/ 262
9.1.3以太网的典型帧结构/ 263
9.1.4数据包过滤的原理简介/ 264
9.1.5BPF虚拟机/ 265
9.1.6Tcpdump与WinDump / 268
9.1.7BPF指令集实例/ 269
9.1.8BPF过滤器的优化研究/ 270
9.1.9BPF系统架构/ 273
9.2WinPcap数据包过滤基础/ 274
9.2.1数据包过滤过程/ 274
9.2.2过滤表达式/ 274
9.2.3编译过滤表达式生成过滤器的字节码/ 275
9.2.4把过滤器字节码传递给内核/ 275
9.3使用WinPcap过滤数据包/ 275
9.3.1wpcap.dll库导出的相应函数/ 275
9.3.2使用过滤器的实例/ 276
9.4数据包过滤的幕后/ 279
9.4.1wpcap.dll库中相应函数的实现/ 279
9.4.2Packet.dll库对应的函数/ 287
9.4.3驱动程序中对应的函数/ 288
9.4.4NPF_tap函数的数据包过滤部分/ 297
9.5小结/ 300
第10章数据包的接收/ 301
10.1使用WinPcap接收数据包/ 301
10.1.1wpcap.dll库导出的相应函数/ 301
10.1.2数据包接收的实例/ 302
10.2数据接收的幕后/ 307
10.2.1wpcap.dll库中相应函数的实现/ 308
10.2.2Packet.dll库中相应函数的实现/ 314
10.2.3内核空间部分的实现/ 316
10.3小结/ 339
第11章统计网络流量与网络状态/ 340
11.1使用WinPcap进行网络统计的方法/ 340
11.1.1wpcap.dll库导出的相应函数/ 340
11.1.2统计实例/ 341
11.2网络统计的幕后/ 346
11.2.1工作模式/ 346
11.2.2模式设置函数/ 347
11.2.3网络流量统计的实现/ 350
11.2.4网络状态统计的实现/ 354
11.3小结/ 360
第12章文件的存储与读取/ 361
12.1libpcap文件存储格式/ 361
12.1.1转储文件的头信息/ 361
12.1.2每个数据包的头信息/ 363
12.2使用WinPcap进行文件存储与读取/ 364
12.2.1wpcap.dll导出的相应函数/ 364
12.2.2文件存储与读取的实例/ 364
12.3数据包文件存储的幕后/ 372
12.3.1pcap_dump_open函数/ 373
12.3.2pcap_dump函数/ 375
12.3.3pcap_dump_flush函数/ 375
12.3.4pcap_dump_close函数/ 376
12.4数据包文件读取的幕后/ 376
12.5内核文件转储的实现/ 382
12.5.1wpcap.dll库中相应函数的实现/ 382
12.5.2Packet.dll库中相应函数的实现/ 384
12.5.3驱动程序中对应的函数/ 387
12.6小结/ 389
第13章修改源代码/ 390
13.1给wpcap.dll增加设置重复发送次数的函数/ 390
13.1.1修改步骤/ 390
13.1.2测试结果/ 391
13.2修改WinPcap的内核驱动代码/ 392
13.2.1支持内核转储功能/ 392
13.2.2测试内核统计与转储模式/ 406
13.2.3支持大量数据包的转储/ 410
13.2.4内核驱动程序修改后的源文件/ 411
13.3小结/ 411
第14章性能测试与分析/ 412
14.1测试环境/ 412
14.2测试实例/ 413
14.2.1不同发送方式的比较/ 413
14.2.2发送不同数据包长度的比较/ 420
14.2.3不同接收方式的比较/ 423
14.3小结/ 430
附录A源语法规范/ 431
附录B过滤表达式规范/ 433
附录CSYN洪泛攻击的详细资料/ 438
附录DARP欺骗资料/ 442
参考文献/ 448
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!