Python编写网络抓包脚本

  Python编写网络抓包脚本  2009-03-13 22:29:17
http://blog.chinaunix.net/uid-16865301-id-97371.html

分类: Python/Ruby

Ethereal 自带许多协议的 decoder,简单,易用,基于winpcap的一个开源的软件.但是它的架构并不灵活,如何你要加入一个自己定义的的解码器,得去修改 Ethereal的代码,再重新编译,很烦琐.对于一般的明文 协议,没有什么问题,但是对于加密协议,比如网络游戏,客户端程序一般会在刚连接上的时候,发送一个随机密钥,而后的报文都会用这个密钥进行加密,如此. 要想破解,得要有一个可编程的抓包器.

libpcap是一个不错的选择,但是对于抓包这样需要反复进行”试 验->修改”这个过程的操作,c 语言显然不是明智的选择.

Python提供了几个libpcapbind,http://monkey.org/~dugsong/pypcap/这里有 一个最简单的。在windows平台上,你需要先安装winpcap,如果你已经安装了Ethereal非常好用

Google code地址:http://code.google.com/p/pypcap/

>>> import dpkt, pcap
>>> pc = pcap.pcap()
>>> pc.setfilter(’icmp’)
>>> for ts, pkt in pc:
…     print `dpkt.ethernet.Ethernet(pkt)`

Ethernet(src=’\x00\x03G\xb2M\xe4′, dst=’\x00\x03G\x06h\x18′, data=IP(src=’\n\x00\x01\x1c’, dst=’\n\x00\x01\x10′, sum=39799, len=60, p=1, ttl=128, id=35102, data=ICMP(sum=24667, type=8, data=Echo(id=512, seq=60160, data=’abcdefghijklmnopqrstuvwabcdefghi’))))
Ethernet(src=’\x00\x03G\x06h\x18′, dst=’\x00\x03G\xb2M\xe4′, data=IP(src=’\n\x00\x01\x10′, dst=’\n\x00\x01\x1c’, sum=43697, len=60, p=1, ttl=255, id=64227, data=ICMP(sum=26715, data=Echo(id=512, seq=60160, data=’abcdefghijklmnopqrstuvwabcdefghi’))))
^CTraceback (most recent call last):
File ‘<stdin>’, line 1, in ?
File ‘pcap.pyx’, line 298, in pcap.pcap.__next__
KeyboardInterrupt
>>>
>>> pc.stats()
(4851, 0, 0)

1. pcap还支持一些回调函数的用法,效率比较高,不过抓包不是为了效率,把事情做正确就行
2. 调用pc.setfilter填写filter字符串,libpcap/WinPcap的filter language采用的tcpdump相同的格式,可以去看它的 man page
Ethereal的帮助里面有一个简单的说明

3. 报文的解析,可以用python自带的struct,很容易使用,当然可以安装http://monkey.org/~dugsong/dpkt/这个包,已经帮你解析基本的报文信息

dpkt在Google code的地址:http://code.google.com/p/dpkt/

你可能感兴趣的:(Python编写网络抓包脚本)