本节主要说明了在各种Win32平台上如何编译WinPcap[1],包括内核层与用户层两部分。所有的源代码可从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上进行。
 
深度剖析WinPcap之(五)——编译与使用WinPcap(1) _编译
图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库上开发所需的库文件。


 

深度剖析WinPcap之(五)——编译与使用WinPcap(1) _WinPcap_02
图5-2 WpdPack 开发包目录结构
 

1.2.      构建驱动程序NPF

在开始编译之前,我们需要注意NPF是依赖于平台的。所以强烈建议编译驱动程序的操作系统与将要使用NPF的操作系统一致。此处我们以Windows XP(x86架构)平台下驱动程序NPF的构建为例,来说明构建的过程。
此处使用WDK 6001.18002[2]编译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的构建环境。
对于构建release版本的操作总结如下:
[开始]-> [所有程序]-> [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所示。
[2]WDK 6001的下载参见下一篇博文的说明
深度剖析WinPcap之(五)——编译与使用WinPcap(1) _编译_03
图5-3 Windows XP x86 Free Build Environment命令行窗口
深度剖析WinPcap之(五)——编译与使用WinPcap(1) _休闲_04图5-4执行CompileDriver脚本命令
3)      该脚本执行过程如图5-5所示,最终生成驱动程序(npf.sys),该二进制文件存在F:\winpcap\PacketNTx\driver\bin\i386目录下(Free与Checked Build方式构建的npf.sys文件都在该目录下)。
深度剖析WinPcap之(五)——编译与使用WinPcap(1) _剖析_05
图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_p_w_picpath.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目录下,替换原有文件。

本文出自 “千江月” 博客,请务必保留此出处http://eslxf.blog.51cto.com/918801/198999