探索黑客技术攻防,实战研究与安全创新

导航菜单

简单抓包工具的实现

今天危险漫步教给大家通过C语言编程实现简单的抓包工具,编译平台为vc6.O,在开始写代码之前我们需要安装一个开发包WpdPack以及WinPcap驱动,这里面包含了我们需要用到的头文件以及相关的函数。将解压之后,需要设置vc6的头文件目录以及1ib文件目录。安装设置完毕后就可以进行代码编写了。

blob.png

首先我们需要包含头文件#include <pcap.h>,然后在“工程”“设置”里面增加lib库文件。首先我们需要获取我们本地计算机上的网卡列表,因为一台计算机可能会安装很多的网卡,也可能有一些虚拟网卡,所以首先我们需要枚举出所有的网卡来。这里需要用到函数pcap_findalldevs,这个函数位于WpdPack开发包中,声明如下:

int pcap_findalldevs(pcapjf_t**,char+);

两个参数分别是pea p_if_t结构以及char 4类型,所以在这之前我们需要声明这个结构pc ap_if_t*alldevs,char errbuf[PCAP_ERRBUF_SIZE];然后就可以使用这个函数了:


如果函数执行成功,那么本机所有安装的网卡都会被检测出来并存放到pcap if_t结构中。如果很多网卡的话,我们需要用循环来列举出来。


获得了所有的网卡之后,我们下一步就需要选择需要进行数据包捕获的网卡,这里我们直接用网卡序号进行选择就可以了。


如果用户输入的序号错误,那么我们就提示一下输入错误,然后用pcap_freealldevs(pcap if_t**)函数将获取的结构释放,这个函数也是WpdPack开”发包中的函数,如果输入正确,那么我们就用函数pcap_t  *pcap_open_live(const cbar *,int,int, int,char*):打开指定的设备,进行网络数据读取。其中参数d->name表示该网卡的名称:65536iaoshi不限定端口号,就是全部读取的意思:1表示使用混杂模式,0表示不采用混杂模式;1OOO表示读取超时时间,单位为ms; errbuf表示读取的网络数据包存放的缓冲区。

指定的设备打开之后,下面就开始正式的数据包读取了:


函数pcap_next_ex()是一个非回调函数的捕包函数,其中含有另个函数pcap_loop()也可以使用,这两个函数的效果一样,但这个函数是回调的,在一些情况下使用起来会比较麻烦,所以建议使用pcap_next_ex()这个函数。成功能够捕获数据包之后,我们用16进制的形式将数据打印出来,程序运行效果。

如果程序无法读取数据的话,我们就需要关闭pcap,使用函数pcap_close(),不过一般情况下不会出错。本文的代码已经为读者打包,读者可以根据将这些代码加以修改,变成扩展性更强的代码,嵌入到自己的程序中。