用Python做个网络抓包工具之为Winpcapy写个过滤器filter

上一篇 / 下一篇  2012-08-06 22:53:18 / 个人分类:Winpcap

目前在完成一个网络抓包工具,用Python实现。在Windows上抓包首选的库或接口自然是Winpcap。自然Winpcap这种接近系统底层和硬件的程序一般都是c语言写的,他提供的开发接口原生也是c的。不过还好,人们已经为其他语言的使用提供了封装,比如java.net,好像连vb都有了,可以在winpcap官网上找找。

WinpcapyPython语言对Winpcap的封装,可以在google code上找到这个项目,并下载源代码。其实和winpcapc语言代码头文件对比可以发现,Winpcapy主要是用ctypewinpcap提供的c函数和一些数据结构转化成了Python的函数和数据结构,就像c语言是一个pcap.hwinpcapy就是一个winpcapy.py,只要在代码中导入这个模块,就能和c语言一样使用winpcap了。另外,源代码提供了winpcapy.py之外,也像winpcap开发包一样提供了几个sample。比较一下这两套sample会发现,winpcapysample基本上就是把c语言写的sample翻译成了Python语言的写法,对应关系是很显而易见的。不过,sample里面没有filter方面的代码,于是我就仿照winpcap sample中的pcap_filter.c,自己写一个Python版的pcap_filter

pcap_filter.c中关于过滤器filter的主要代码是这些:

?

//pcap_t *fp;

//struct bpf_program fcode;

//bpf_u_int32 NetMask;

//char *filter;

 

NetMask=0xffffff;

 

//compile the filter

if(pcap_compile(fp, &fcode, filter, 1, NetMask) < 0)

{

    printf(stderr,"\nError compiling filter: wrong syntax.\n");

 

    pcap_close(fp);

    return -3;

}

 

//set the filter

if(pcap_setfilter(fp, &fcode)<0)

{

    fprintf(stderr,"\nError setting the filter\n");

 

    pcap_close(fp);

    return -4;

}

  开始几行给出了几个参数的声明,具体请参见完整代码。下面给出我写的filter部分的代码:

?

fcode= bpf_program()

NetMask= 0xffffff

filter = "tcp"

 

## compile the filter

if pcap_compile(adhandle,byref(fcode),filter,1,NetMask) <0:

    print('\nError compiling filter: wrong syntax.\n')

    pcap_close(adhandle)

    sys.exit(-3)

 

## set the filter

 

if pcap_setfilter(adhandle,byref(fcode)) <0:

    print('\nError setting the filter\n')

    pcap_close(adhandle)

    sys.exit(-4)

  当然看上去基本上是对着翻译,没什么技术含量。这段代码可以放到winpcapy示例basic_dump_ex.py开始抓包的代码行之前(

?

res=pcap_next_ex( adhandle, byref(header), byref(pkt_data))

)就能设置过滤器是“tcp”了。

如果要验证的话,可以在用pcap_dump把抓包保存下来,然后用wireshark查看。稍后提供比较完整的一个代码文件。


TAG:

 

评分:0

我来说两句

日历

« 2024-04-27  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 19047
  • 日志数: 32
  • 建立时间: 2012-03-07
  • 更新时间: 2013-11-03

RSS订阅

Open Toolbar