<Kxing 原创,水平有限、欢迎批评和指正。如需转载请注明作者与出处> 一 libpcap是一个C语言库,其功能是通过网卡抓取网络以太网中的数据包,在windows系统下有相应的winpcap库。 要想使用这个库自然先要知道它在哪里,怎么安装就不废话了。在/usr/local/lib下有libpcap.a和libpcao.so,在/usr/local/include下有pcap.h,打开手册的命令是man pcap,而不是man libpcap,如果觉得在字符模式下查看man太麻烦也可以baidu或者google一下"man pcap"会又可读性更高的手册。要写一个使用libpcap的程序只需要在代码中加上#i nclude <pcap.h>,然后在编译时使用-lpcap选项就可以了,例如: $>gcc -o test1 test1.c -lpcap 二 如果能正确的编译通过使用libpcap的代码,那么便可以进入第二步了,写一个最简单的抓包程序。 先来介绍第一个类型:pcap_t。要抓包就要首先生成一个抓包的描述符(或称句柄),后来的很多操作都需要用这个描述符做参数。pcap_t就是由pcap.h定义的抓包描述符的类型,函数pcap_open_live返回指向该类型的指针: pcap_t *pd = pcap_open_live ("eth0", 68, 0, 1000, ebuf); 其中第一个参数表示用来抓包的设备;第二个参数定义了抓包的最大字节数,如果这个值小于包的大小(如定义为68,包大于68),那么则只抓这个包的前68个字节;第三个参数把网卡设置为混杂模式,以便抓取以太网中的数据包;第四个参数是一个以毫秒为单位的读取超时时间,如果设置为0则超时时间为无限大;第五个参数为出错信息,需要这样声明(第一个简单的程序不需要出错处理,只知道这样声明就够了): char ebuf[PCAP_ERRBUF_SIZE]; 好了,现在生成了一个描述符了,现在我们可以用它来做一点什么事情了。开始一个抓包的循环,然后关闭抓包过程(释放描述符): pcap_loop (pd, 7, printer, NULL); pcap_close (pd); 这里的pd就是我们刚刚生成的描述符;pcap_loop的第二个参数表示抓多少个包,设置为-1表示不定义数量,抓取所有的包;第三个参数是一个回调函数,每当抓到一个数据包之后程序将自动调用这个函数;第四个参数是一个指针,可以为空,将在下面详细讲解。 下面我们来详细的实现这个回调函数,使其每抓到一个包则打印一次: void printer() 当程序成功编译以后执行,则每抓到一个包后输出一行"A packet is captured! ",输出7行以后退出程序。 这样,一个最简单的抓包程序诞生了!
参考源码:
compile command:"$>gcc -o exe_file_name this_file_name -lpcap" written by Kxing <S.Kxing@gmail.com>
int main (int argc, char* argv[])
pcap_close (pd); return 0; |
|