MFC+WinPCAP自定义报文开发环境

一,建立开发环境,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中列出来:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sinat_27261621/article/details/78594731