WinPcap编程——发送数据包

Home / Hackintosh MrLee 2015-6-11 3592

惯例简单介绍一下WinPcap。
WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。要进行WinPcap编程需要先下载好WinPcap和开发的SDK,我已经下载好了。 安装程序:WinPcap_4_1_3开发包:WpdPack_4_1_2开发包的include目标包含到VS工程中即可,如下图:

QQ截图20150611102703


然后把lib目录下面的wpcap.lib文件复制到工程目录下,是编译目录,然后用#pragma comment(lib,"wpcap.lib")加载即可。 发送数据包和获取网关源码如下:

// PcapDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include#include#define HAVE_REMOTE
#include#include#pragma comment(lib,"wpcap.lib")
char* pName = NULL;
void getAdapter()
{
	pcap_if_t *alldevs;
	pcap_if_t *d;
	int i=0;
	char errbuf[PCAP_ERRBUF_SIZE];
	/* 获取本地机器设备列表 */
	if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
	{
		fprintf(stderr,"Error in pcap_findalldevs_ex: %sn", errbuf);
		exit(1);
	}
	/* 打印列表 */
	for(d= alldevs; d != NULL; d= d->next)
	{
		printf("%d. %sn", ++i, d->name);
		if(pName == NULL)
		{
			int nLen = strlen(d->name);
			pName = new char[nLen<<1];
			strcpy_s(pName,nLenname);
		}
		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;
	}
	/* 不再需要设备列表了,释放它 */
	pcap_freealldevs(alldevs);
}
void sendPacket()
{
	pcap_t *fp;
	char errbuf[PCAP_ERRBUF_SIZE];
	byte packet[60] = {0};
	int p_size = sizeof(packet);

	/* 打开输出设备 */
	if ( (fp= pcap_open(pName,            // 设备名
		100,                // 要捕获的部分 (只捕获前100个字节)
		PCAP_OPENFLAG_PROMISCUOUS,  // 混杂模式
		1000,               // 读超时时间
		NULL,               // 远程机器验证
		errbuf              // 错误缓冲
		) ) == NULL)
	{
		fprintf(stderr,"nUnable to open the adapter. %s is not supported by WinPcapn", pName);
		system("pause");
		return;
	}
	/* 假设在以太网上,设置MAC的目的地址为 01:01:05:01:00:00 */
	//01:01:05:01:00:00
	//00:1d:72:50:16:c6
	packet[0]=0x01;
	packet[1]=0x01;
	packet[2]=0x05;
	packet[3]=0x01;
	packet[4]=0x00;
	packet[5]=0x00;
	/* 设置MAC源地址为 00-23-24-53-74-B0 */
	//00 1d 72 50 16 c6 88 a4        ........rP....
	packet[6]=0x00;
	packet[7]=0x1D;
	packet[8]=0x72;
	packet[9]=0x50;
	packet[10]=0x16;
	packet[11]=0xC6;
	byte data[48] = {
		0x88,0xa4,0x29,0x10
		,0x05,0x9e,0xe9,0x03,0x00,0x13,0x10,0x80,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x03
		,0x00,0x20,0x2b,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0xe9,0x03
		,0x7f,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
	/* 填充剩下的内容 */
	for(int i=12;i<p_size;i++)
		packet[i]=data[i-12];
	/* 发送数据包 */
	if (pcap_sendpacket(fp, packet, p_size /* size */) != 0)
	{
		fprintf(stderr,"nError sending the packet: n", pcap_geterr(fp));
		system("pause");
		return;
	}
	system("pause");
}
void main(int argc, char **argv)
{
	getAdapter();
	printf("n---%s---n",pName);
	sendPacket();
	if(pName != NULL)
		delete pName;
	system("pause");
	return;
}

本文链接:https://www.it72.com/3384.htm

推荐阅读
最新回复 (0)
返回