Winpcap学习笔记
Author: kagula
Date: 2018-9-1
Preface:
介绍如何成功搭建winpcap程序的开发环境,这里假设你已经安装了Visual Studio 2017 Community Edition。
Environment:
Windows 10 Pro 64bits, VS 2017 Community, winpcap 4.1.3
Content
Part1 搭建winpcap 64位开发环境
Step1 安装winpap虚拟驱动
Version 4.1.3 Installer for Windows
https://www.winpcap.org/install/bin/WinPcap_4_1_3.exe
安装成功后,你会找到带数字签名的
C:\Windows\System32\drivers\npf.sys
Step2 下载winpcap源码包
下载
https://www.winpcap.org/install/bin/WpcapSrc_4_1_3.zip
解压缩到
D:\workspace
Step3 编译packet.lib packet.dll
打开
D:\workspace\winpcap\packetNtx\Dll\Project\Packet.sln
[a]build方式设为Debug No NetMon, X64
[b]Output directory默认是带空格的,改为"$(ProjectDir)\DebugNoNetMon\x64\"
否则,其它项目会找不到你编译好的lib文件
[c]Packet32.h第51行,插入
#undef HAVE_AIRPCAP_API
否则 会提示找不到airpcap.h
[d]删除project中的资源文件version.rc,否则会提示找不到afxres.h
编译好后,会在
D:\workspace\winpcap\packetNtx\Dll\Project\DebugNoNetMon\x64
目录下,生成packet.lib packet.dll两个文件,编译wpcap需要packet.lib。
Step4 编译wpcap.lib wpcap.dll
打开
D:\workspace\winpcap\wpcap\PRJ\wpcap.sln
文件。
[a]build模式设为No Air Pcap, x64
[b]添加库文件search路径为
D:\workspace\winpcap\packetNtx\Dll\Project\Debug_No_NetMon\x64;
[c]删除不需要资源文件version.rc
build成功后在
D:\workspace\winpcap\wpcap\PRJ\DebugNoAirPcap\x64
路径下,生成wpcap.lib wpcap.dll文件,编译wpcap程序需要wpcap.lib。
Part2 第一个winpcap程序
列出所有的网络driver后程序返回,仅用于测试winpcap开发环境是不是已经搭建起来了。
新建win32 console solution,build选项设置为Debug, X64
添加WIN32;MSDOS;宏定义
添加头文件search path
D:\workspace\winpcap\wpcap\Win32-Extensions;D:\workspace\winpcap\wpcap\libpcap\Win32\Include;D:\workspace\winpcap\wpcap\libpcap;
添加库文件library path
D:\workspace\winpcap\wpcap\PRJ\DebugNoAirPcap\x64;
添加库文件引用
wpcap.lib
我们的第一个winpcap程序只有一个源文件,下面是源文件的内容
#include "pcap.h"
void main()
{
pcap_if_t *alldevs;
/*struct pcap_if_t{
pcap_if_t *next;
char *name;
char *description;
pcap_addr *addresses;
U_int falgs;
}
*/
pcap_if_t *d;
int i = 0;
char errbuf[PCAP_ERRBUF_SIZE];
/* Retrieve the device list */
if (pcap_findalldevs(&alldevs, errbuf) == -1)//返回网卡列表,alldevs指向表头
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
/* Print the list */
for (d = alldevs; d; d = d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else printf(" (No description available)\n");
}
if (i == 0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return;
}
/* We don't need any more the device list. Free it */
pcap_freealldevs(alldevs);
}
build成功后,运行,会列出当前计算机上已经安装的所有网络通讯设备。
Reference
[1]《How to compile WinPcap》
https://www.winpcap.org/docs/docs_40_2/html/group__compilation.html