当前位置:编程学习 > 网站相关 >>

基于Winpcap的原始数据包发送

转载请注明版权

文/图 Hokkien
上期我的文章《Windows环境下实现原始UDP数据包发送》讨论了用原始套接字实现发送原始数据包的例程,但是这有很多限制,比如Windows XP SP2只能发送UDP原始数据包,不能发送原始TCP数据包,还有伪造不了源IP地址等等诸多限制,这使得在Windows下玩黑玩得很是不爽啊!上次我们说过要突破这一限制只有写驱动,可驱动这么复杂的东西我等小菜哪懂啊!不过不要紧,我们有Winpcap,虽然上期文章提示它有些小漏洞,但总体来说还是一比较安全的。应用该开发包编写的软件也有很多,比如著名的协议分析工具Ethereal。
好了,现在我们来看看读懂本文你需要具备哪些知识。C应该熟悉,基本的TCP/IP知识。如果你已经具备以上知识,那么恭喜你,你可以出发啦,呵呵,Let’s GO!
Winpcap简介
我们在学习任何一项技术之前,都应该对该项知识的背景有一定的了解,因此,本文也不例外。在介绍Winpcap之前,我们来认识它一下。
Winpcap(windows packet capture)是Windows平台下一个免费的公共网络访问系统。开发Winpcap这个项目的目的在于为Win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;在网络上发送原始的数据报;收集网络通信过程中的统计信息。
Winpcap的主要功能在于独立于主机协议(如TCP/IP)发送和接收原始数据报。也就是说,Winpcap不能阻塞、过滤或控制其他应用程序数据报的收发,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。
Winpcap提供给用户两个不同级别的编程接口:一个基于libpcap的wpcap.dll,另一个是较底层的packet.dll。对于一般的要与Unix平台上libpcap兼容的开发来说,使用pacap.dll是当然的选择。
上面简要介绍了一些Winpcap知识,如果还有什么不清楚的话,大家可以到网上看看,有很多资料介绍,这里就不再赘述了。
                    Winpcap编程
我们首先来看看Winpcap为我们提供的几个重要函数。
char* pcap_lookupdev(char * errbuf),这个函数的功能是查询本机的网络接口名字,后面有用。
pcap_t* pcap_open_live(const char *device,int snaplen,int promisc,int to_ms,char *ebuf),该函数的功能是打开一个网络接口进行数据包捕获。Device就是上面的函数返回的结果,Promisc为1表示以混杂模式打开。
下面这个函数是最关键的,大家注意一下。
pcap_sendpacket(pcap_t p,int nonblock,char*errbuf),顾名思义,这个函数是发送数据包的。
上面简要介绍了关键的几个函数,下面介绍一下用Winpcap编写发送数据包程序的一般流程:通过名字打开一个设备;自己构造一个原始数据包(这个数据包会不经过任何处理就发送出去,所以必须把包中的各个字段设置好。另外,这个数据包是包含数据链路层报头的。);使用pcap_sendpacket()发送数据包。
下面我们就遵守上面的开发流程编写一个发送数据包代码。

#include "pcap.h"  //WinPcap头文件
void main()
{
pcap_t *pcap_handle;
/* winpcap句柄 */
char *net_interface;
/* 网络接口 */
char error_content[PCAP_ERRBUF_SIZE];
/* 存储错误信息 */
u_int8_t packet_content[94] = "x00x10x67x00xB1x86x0Dx0Ex0Ax0Dx00x00x08x00x45x00x00x50x00xF2x00x00x40x06xF8x60xC0xA8x00x02xC0xA8x00x03x00x63x00x50x01x01x01x01x02x02x02x02xA0x02x7FxFFxB6xF4x00x0Ax03x03x0Ax01x02x04x01x09x08x0Ax3Fx3Fx3Fx3Fx00x00x00x00x00x00x30x31x32x33x34x35x36x37x38x39x30x31x32x33x34x35x36x37x38x39";
/* 要发送的原始数据包 */
net_interface = pcap_lookupdev(error_content);
/* 获得网络接口 */
pcap_handle = pcap_open_live(
net_interface,  /* 网络接口 */
94,  /* 数据包大小 */
1,  /* 混杂模式 */
1,  /* 等待时间 */
error_content); /* 错误信息 */
/* 打开网络接口 */
pcap_sendpacket(
pcap_handle,  /* winpcap句柄 */
packet_content,  /* 数据包缓存内容 */
94); /* 数据包长度 */
/* 发送网络数据包 */
pcap_close(pcap_handle);
/* 关闭Winpcap操作 */
}

怎么样,很简单吧?呵呵,不错,就是这么简单。现在,大家就尽情享受发送原始数据不受限制的乐趣吧。最后,祝大家学习愉快
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,