本节主要说明了在各种
Win32
平台上如何编译
WinPcap
,包括内核层与用户层两部分。所有的源代码可从
http://www.winpcap.org
网站获取。同时也对
WinPcap
的使用作了简单介绍,并给出一个简单的使用实例。
1.1. 源代码目录结构
WinPcap的所有源代码都可从http://www.winpcap.org网站获取,此处采用的源代码包为WpcapSrc_4_1_beta5.zip,源代码目录结构如图5-1所示。其中:
Common目录下为几个共用的头文件。
dox 目录下为一些说明文档。
Examples-pcap与Examples目录下为一些示例代码,两个目录的区别在于前者是采用libpcap库接口的示例程序,后者为采用wpcap库接口的示例程序。
Packet9x目录下为Windows 9x平台的驱动程序NPF的源代码与Packet.dll库的源代码,分别放置在VXD与DLL目录下。
PacketNtx目录下为Windows NTx平台的驱动程序NPF的源代码与Packet.dll库的源代码,分别放置在driver与DLL目录下。
wpcap目录下为wpcap.dll库的源代码。
[1]
此处我们只关注Windows 2000/XP/2003/Vista/2008 (x86架构)下WinPcap相关的问题,不关注Windows NT4、Windows 9x及x64架构的问题。同时所有的实际操作都在Window XP上进行。
图5-1 WinPcap源代码目录结构
可从http://www.winpcap.org网站获取开发包WpdPack_4_1_beta5.zip,便于WinPcap的软件开发,该软件包的目录结构如图5-2所示,其中:
docs目录下为详细的用户使用手册。
Examples-pcap与Examples-remote目录下为一些示例代码,两个目录的区别在于前者是采用libpcap库接口的示例程序,后者为采用wpcap库接口的示例程序。
Include目录下为在WinPcap库上开发所需的头文件。
Lib目录下为在WinPcap库上开发所需的库文件。
图5-2 WpdPack 开发包目录结构
1.2. 构建驱动程序NPF
在开始编译之前,我们需要注意NPF是依赖于平台的。所以强烈建议编译驱动程序的操作系统与将要使用NPF的操作系统一致。此处我们以Windows XP(x86架构)平台下
驱动程序NPF的构建为例,来说明构建的过程。
此处使用WDK 6001.18002编译WinPcap 4.1 beta5。WinPcap 4.1 beta5的文档要求采用Microsoft Windows Driver Kit (WDK) 6000 or 6001进行编译。使用老的DDK编译WinPcap也应该可以,但是可能需要手动修改编译脚本,为了禁止PREfast(PREfast是一个静态代码分析工具,在最近的DDK/WDK版本附带)。
接着就可按下列步骤开始NPF的构建:
1)
从Windows[开始]菜单选择[所有程序],然后选择[Windows Driver Kits],接下来选择[WDK 6001.18002],接着选择[Build Environments],选择[Windows XP]。
如果需要编译一个release版本,就选择[Windows XP x86 Free Build Environment]
,如果需要编译一个debug版本,就选择[Windows XP x86 Checked Build Environment]。因为我们的CPU是x86架构,所以选择x86的构建环境。
[开始]-> [所有程序]-> [Windows Driver Kits]-> [WDK 6001.18002]->
[Build Environments]-> [Windows XP]->
[Windows XP x86 Free Build Environment]
对于构建debug版本的操作总结如下:
[开始]-> [所有程序]-> [Windows Driver Kits]-> [WDK 6001.18002]->
[Build Environments]-> [Windows XP]->
[Windows XP x86 Checked Build Environment]
2)
构建环境接着出现如图5-3所示的命令提示窗口。切换路径到WinPcap源代码的PacketNTx目录,执行CompileDriver脚本命令,如图5-4所示。
图5-3 Windows XP x86 Free Build Environment命令行窗口
图5-4执行CompileDriver脚本命令
3)
该脚本执行过程如图5-5所示,最终生成驱动程序(npf.sys),该二进制文件存在F:\winpcap\PacketNTx\driver\bin\i386目录下(Free与Checked Build方式构建的npf.sys文件都在该目录下)。
图5-5 CompileDriver脚本执行过程
1.3. 构建packet.dll
构建库packet.dll的源代码在PacketNTx\dll\目录下,要求在Microsoft Visual Studio 2005 SP1版本的环境中构建,理论上可以在Visual Studio 6环境下编译x86版本的,但是工程文件不再进行维护支持。
我们采用Microsoft Visual Studio 2005构建,同时不需要AirPcap适配器的支持。在Microsoft Visual Studio 2005中打开F:\winpcap\packetNtx\Dll\Project\ Packet.sln工程,选择Release配置构建PACKET.DLL库,如果为了调试也可以选择Debug配置。
选择Release配置,开始构建,在
Microsoft Visual Studio 2005中选择菜单[Build]执行菜单项[Rebuild Packet],执行结果如下:
1>------ Rebuild All started: Project: Packet, Configuration: Release Win32 ------
1>Deleting intermediate and output files for project 'Packet', configuration 'Release|Win32'
1>Compiling...
1>win_bpf_filter.c
1>Packet32.c
1>f:\winpcap\Common\packet32.h(53) : fatal error C1083: Cannot open include file: 'airpcap.h': No such file or directory
1>NpfImExt.c
1>AdInfo.c
1>f:\winpcap\Common\packet32.h(53) : fatal error C1083: Cannot open include file: 'airpcap.h': No such file or directory
1>Build log was saved at "file://f:\winpcap\packetNtx\Dll\Project\Release\x86\BuildLog.htm"
1>Packet - 2 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
编译出错,无法打开
airpcap.h文件,此处
不需要支持AirPcap适配器,所以
在文件Packet32
-Int.h的第50行添加#undef HAVE_AIRPCAP_API,再重新构建,执行结果如下:
1>------ Rebuild All started: Project: Packet, Configuration: Release Win32 ------
1>Deleting intermediate and output files for project 'Packet', configuration 'Release|Win32'
1>Compiling...
1>win_bpf_filter.c
1>Packet32.c
1>Compiling Packet.dll with support for WanPacket (aka Dialup thru NetMon)
1>Compiling Packet.dll with support from IP helper API for API addresses
1>NpfImExt.c
1>AdInfo.c
1>Compiling...
1>WanPacket.cpp
1>Compiling resources...
1>Linking...
1> Creating library f:\winpcap\packetNtx\Dll\Project\\Release\x86\Packet.lib and object f:\winpcap\packetNtx\Dll\Project\\Release\x86\Packet.exp
1>Generating code
1>Finished generating code
1>Embedding manifest...
1>Build log was saved at "file://f:\winpcap\packetNtx\Dll\Project\Release\x86\BuildLog.htm"
1>Packet - 0 error(s), 0 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
构建成功,在F:\winpcap\packetNtx\Dll\Project\Release\x86下生成Packet.dll与Packet.lib
文件。
1.4. 构建wpcap.dll
wpcap.dll能够在任何Win32平台下被构建生成dll,它是独立平台的。
构建库wpcap.dll的源代码在F:\winpcap\wpcap目录下,要求在Microsoft Visual Studio 2005 SP1版本的环境中构建。理论上可以在Visual Studio 6环境下编译x86版本的,但是工程文件不再进行维护支持。
为了编译wpcap.dll,把F:\winpcap\wpcap\PRJ目录下的wpcap.sln加载到Microsoft Visual Studio 2005中。这儿有几个不同的工程配置,每一个对x86 (Win32) 与 x64平台都可用。
Ø
Release
: 标准release配置
Ø
Debug
: 标准debug配置
Ø
Release No AirPcap
: 不支持AirPcap 适配器的release配置
Ø
Debug No AirPcap
: 不支持AirPcap 适配器的debug配置
选择所需的配置并构建工程获得二进制文件
wpcap.dll。
注意
:wpcap.dll包含了libpcap的源代码,可从www.tcpdump.org网站获取, 不过对远程捕获部分进行了部分修改。也能够包含与构建一个不同版本的libpcap,仅需简单的把它复制到WinPcap
源代码的winpcap\wpcap目录下,但是必须使用
"Debug" 或 "Release"配置选项构建。
选择Release配置,开始构建,在
Microsoft Visual Studio 2005中选择菜单[Build]执行菜单项[Rebuild wpcap],执行结果如下:
1>------ Rebuild All started: Project: wpcap, Configuration: Release Win32 ------
1>Deleting intermediate and output files for project 'wpcap', configuration 'Release|Win32'
1>Compiling...
1>Win32-Extensions.c
1>sockutils.c
1>scanner.c
1>savefile.c
1>pcap.c
…
1>etherent.c
1>bpf_image.c
1>bpf_filter.c
1>Compiling...
1>bpf_dump.c
1>Compiling resources...
1>Linking...
1> Creating library f:\winpcap\wpcap\PRJ\\Release\x86\wpcap.lib and object f:\winpcap\wpcap\PRJ\\Release\x86\wpcap.exp
1>Generating code
1>Finished generating code
1>Embedding manifest...
1>Build log was saved at "file://f:\winpcap\wpcap\PRJ\Release\x86\BuildLog.htm"
1>wpcap - 0 error(s), 303 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
构建成功,在F:\winpcap\wpcap\PRJ\Release\x86下成功生成wpcap.dll与wpcap.lib文件
1.5. 安装NPF驱动程序与各个库文件
把生成的NPF驱动程序与各个库文件安装到操作系统,此处假设操作系统安装在C盘下,具体的操作步骤如下:
1)
把生成的驱动程序二进制文件npf.sys从F:\winpcap\PacketNTx\driver\bin\i386目录下复制到C:\WINDOWS\system32\drivers目录下。
2)
把F:\winpcap\packetNtx\Dll\Project\Release\x86下生成的Packet.dll文件复制到C:\WINDOWS\system32目录下。
3)
把F:\winpcap\packetNtx\Dll\Project\Release\x86下生成的Packet.lib文件复制到F:\WpdPack\Lib目录下,替换原有文件。
4)
把F:\winpcap\wpcap\PRJ\Release\x86下生成的wpcap.dll文件复制到C:\WINDOWS\system32目录下。
5)
把F:\winpcap\wpcap\PRJ\Release\x86下生成的wpcap.lib文件复制到F:\WpdPack\Lib目录下,替换原有文件。