wpcap pcap_open_live_ledlit的空间_百度空间
使用winpcap库打造网络端口监听程序(三)(2009-12-13 13:01:21)
标签:入侵检测 winpcap arp攻击 arp报文分析 tcp报文解析 udp报文解析     分类:网络编程
   上两节已经介绍了ARP协议、IP协议的一些理论内容,本节主要介绍winpcap库的安装与使用。
四、winpcap库用法
WinPcap驱动包,是本次实现网络检测的主打工具,WinPcap的主要功能在于独立于主机协议(如TCP-IP协议)而发送和接收原始数据报,主要为我们提供了四大功能:
     1、捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
     2、在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
     3、在网络上发送原始的数据报;
     4、收集网络通信过程中的统计信息。
   在运行用winpcap开发的程序以前,需要在主机上先安装winpcap的driver。
在实际操作之后发现,不但需要安装winpcap的驱动程序,还要安装winpcap的开发包。
winpcap驱动程序以及winpcap开发包下载地址:
      点此下载
下载之后还需要对开发环境做一些配置,本次软件实现所用的前期环境是VC6.0后期向VS2005平台进行了移植。
   配置方法如下:(针对VC6.0)
下载后可以看到两个文件,一个是WinPcap_4_0_2.exe这个是驱动程序,首先双击安装驱动程序。
另外一个文件是WpdPack_4_0_2dev.zip,这个是开发包,将其解压。
对于VC6.0环境,在Tools->options->Directories里面加入解压以后的include文件夹,在Tools->options->Directories的lib里面加入解压以后的lib文件夹。实际开发前还要对工程进行设置:在"Project->Settings"(Alt+F7),标签栏中选择"C/C++"标签,在"Preprocessor definitions"的输入框里添加"WPCAP",再选择"Link"标签,在"Object/library modules"的输入框里添加"wpcap.lib Packet.lib"。
好了,配置环境的工作到此就结束了,下面就是正式写代码了。
想对网卡操作,{dy}部就是打开网卡
枚举本机网卡的信息(主要是获得网卡的名称)
其中要用到pcap_findalldevs函数,它是这样定义的
*************************************************
int pcap_findalldevs ( pcap_if_t ** alldevsp,
char * errbuf
)
功能:
枚举系统所有网络设备的信息
参数: alldevsp:是一个pcap_if_t结构体的指针,如果函数pcap_findalldevs函数执行成功,将获得一个可用网卡的列表,而里面存储的就是{dy}个元素的指针。
Errbuf: 存储错误信息的字符串
返回值: int : 如果返回0 则执行成功,错误返回 -1。

打开相应网卡并设置为混杂模式:
在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。
我们主要是要用到 pcap_open_live 函数,不过这个函数winpcap的开发小组已经建议用pcap_open 函数来代替,不过因为我的代码里面用的就是pcap_open_live,所以也不便于修改了,不过pcap_open_live使用起来也是没有任何问题的,下面是pcap_open_live的函数声明:

虽然看起来比较复杂,不过用起来还是非常简单的,其实 1 行就OK了:
pcap_t* adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
// 打开网卡,并且设置为混杂模式
// pCardName是前面传来的网卡名字参数
adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);

编译过滤设备
pcap_compile(pcap_t* adhandle, struct bpf_program * fcode,
char *filter,int optimize,netmask)
               参数:adhandle: 类似于网卡句柄
                     filter:过滤规则,例如"host 222.26.193.117 and arp" :
                     netmask:接口掩码

设置过滤器
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
              fp参数是bpf_program结构指针
/***************************************************************
int pcap_next_ex ( pcap_t * p,
struct pcap_pkthdr ** pkt_header,
u_char ** pkt_data
)
功能:
从网卡或者数据包文件中读取数据内容
参数:
pcap_t * p: 网卡句柄
struct pcap_pkthdr ** pkt_header: 并非是数据包的指针,只是与数据包捕获驱动有关的一个Header
u_char ** pkt_data:指向数据包内容的指针 ,包括了协议头
返回值:
1 : 如果成功读取数据包
0 :pcap_open_live()设定的超时时间之内没有读取到内容
-1: 出现错误
-2: 读文件时读到了末尾

pcap_next_ex()不是基于回调机制的,直接调用这个函数就可以抓到一个数据包,如果我们把pcap_next_ex()嵌套在一个for循环或者while循环内的话,程序的结构会很明晰,而且不使用回调也会节省一些时间。

以上介绍了Winpcap库中的主要函数,具体实现请查看程序代码,后文将提供代码下载。下一节将主要介绍如何使用MFC实现本软件,以及在可视化实现时的几个“难点”。


原文地址


郑重声明:资讯 【wpcap pcap_open_live_ledlit的空间_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——