本站首页    管理页面    写新日志    退出


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7603002
建立时间:2006年5月29日




[Python]编写网络抓包脚本
软件技术

lhwork 发表于 2007/2/2 15:25:53

写网络程序,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件.Ethereal自带许多协议的 decoder,但是它的架构并不灵活,如何你要加入一个自己定义的的解码器,得去修改Ethereal的代码,再重新编译,相当的烦琐.对于一般的明文协议,没有什么问题,但是对于加密协议,比如网络游戏,客户端程序一般会在刚连接上的时候,发送一个随机密钥,而后的报文都会用这个密钥进行加密,诸如此类.要想破解,得要有一个可编程的抓包器.libpcap是一个不错的选择,但是对于抓包这样需要反复进行”试验->修改”这个过程的操作,c 语言显然不是明智的选择.Python提供了几个libpcapbind,http://monkey.org/~dugsong/pypcap/这里有一个最简单的。在windows平台上,你需要先安装winpcap,如果你已经安装了Ethereal,可以跳过这个步骤.非常好用 import pcap ,struct  pack=pcap.pcap()  pack.setfilter('udp port 8000')  print 'start capture....' for recv_time,recv_data in pack:     data=recv_data[42:]     if isqq(data):         packhead,ver,id,sequence = struct.unpack('>BHHH', data[0:7]) 简单说明一下 pcap还支持一些回调函数的用法,效率比较高,不过抓包不是为了效率,把事情做正确就行 调用pack.setfilter填写filter字符串,libpcap/WinPcap的filter language采用的tcpdump相同的格式,可以去看它的 man pageEthereal的帮助里面有一个简单的说明 data=recv_data[42:]这样做的原因是,recv_data 抓到的都是raw packet, tcp/ip是分了5层,一个udp包,会带有 14Bytes的Ethenet_II Frame的头,然后是20个字节的ip包头,而udp包头有8个字节,所以偏移量42之后的才是udp的实际内容,tcp包的包头大小为20Bytes,所以其实际内容在偏移量54之后 报文的解析,可以用python自带的struct,很容易使用,当然可以安装http://monkey.org/~dugsong/dpkt/这个包,已经帮你解析基本的报文信息


阅读全文(4906) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144774456 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号