分类: 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/