一,建立开发环境,VS2015 + WinPCAP
1.安装WinPcap,底层驱动;
2.下载xcap库;http://download.csdn.net/download/sinat_27261621/10127370
3.配置开发环境,新建一个MFC项目,然后配置属性:
添加头文件目录
工具->属性->项目和解决方案-> VC++目录->包含文件->添加WinPcap开发包中的Include目录。
添加库文件目录
与上一个步骤一样,只有一小个变化,选择“库文件”,然后添加WinPcap开发包中的Lib目录。
增加与WinPCAP有关的预处理定义
项目->项目属性->配置属性->预处理定义->添加WPCAP和HAVE_REMOTE。
添加wpcap.lib
项目->项目属性->配置属性->连接器->命令行->附加选项框中加入wpcap.lib。
添加pcap.h头文件
#include “pcap.h”
4.开发环境搭好以后就可以开始编码了
5.我们来做个收集局域网内所有IP的小程序
首先需要枚举网卡,获取网卡的IP,mask,mac等信息,然后通过pcap的接口发送我们自定义的报文。
获取网卡信息的API:
GetAdaptersAddresses
GetAdaptersInfo
这两个都可以获取到网卡的信息,视情况而定;
获取到网卡信息后,然后就可以组包了;我们用ARP去获取局域网内的IP,收到ARP回复就是代表存在;
ARP报文数据结构:
#pragma pack(push)
#pragma pack(1)
//定义常量
#define EPT_IP 0x0800 /* type: IP */
#define EPT_ARP 0x0806 /* type: ARP */
#define EPT_RARP 0x8035 /* type: RARP */
#define ARP_HARDWARE 0x0001 /* Dummy type for 802.3 frames */
#define ARP_REQUEST 0x0001 /* ARP request */
#define ARP_REPLY 0x0002 /* ARP reply */
//定义以太网首部
typedef struct ehhdr
{
unsigned char eh_dst[6]; /* destination ethernet addrress */
unsigned char eh_src[6]; /* source ethernet addresss */
unsigned short eh_type; /* ethernet pachet type */
}EHHDR, *PEHHDR;
//定义以太网arp字段
typedef struct arphdr
{
//arp首部
unsigned short arp_hrd; /* format of hardware address */
unsigned short arp_pro; /* format of protocol address */
unsigned char arp_hln; /* length of hardware address */
unsigned char arp_pln; /* length of protocol address */
unsigned short arp_op; /* ARP/RARP operation */
unsigned char arp_sha[6]; /* sender hardware address */
unsigned long arp_spa; /* sender protocol address */
unsigned char arp_tha[6]; /* target hardware address */
unsigned long arp_tpa; /* target protocol address */
}ARPHDR, *PARPHDR;
//定义整个arp报文包,总长度42字节
typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
} ARPPACKET, *PARPPACKET;
#pragma pack(pop)
组包后调用pcap的接口发送请求:
调用pcap_open_live打开网卡;
调用pcap_next_ex发包;
另外起一个线程接收报文并过滤;
将过滤后的信息在ListCtrl中列出来: