一直以来对于Python下的网络抓包库很疑惑,搞不清楚pylibpcap、pypcap、pycap这些库之间是什么关系,混沌了很长时间,在网上G了很久慢慢搞清楚了,其实这些都是libpcap的Python绑定实现,libpcap才是真正的核心。
'k^%Kgs.|0$ay}'{b)t0pylibpcapPython学习 i#Ms$bSg
SQ"Mo2dDp1z5C0在http://pypi.python.org/pypi/pylibpcap/0.6.2登记,得分11
,l i:n1JZ0X"w,^Z|%|0,}4Xj4L.[0主页 http://pylibpcap.sourceforge.net/Python学习9u5q2~5snt&k c
Python学习nnJ)I9o9J r最后更新 Jan 26 2008
8Jg?|$kv0 Python学习#Y`!c|$je*KKoPcapyPython学习dZ$Uphx\+u5B0?7a
~'uG2zQ8`&M02003年开始,更新到March 27, 2007Python学习 G1T%PO%c KI|
3zM6N8d|9UR0在http://pypi.python.org/pypi/pcapy/0.10.2上有登记,得分16
V2Tq }8hU0 Python学习 `S$|J8X'nS%g6I~主页在http://oss.coresecurity.com/projects/pcapy.htmlPython学习`ke*G"c#[:[| [
*vcRd ~-xT1Lc@0最后更新 March 27, 2007
#{"E XUT B:O7d0 Python学习F;l TIrW B]pypcapPython学习(om u'ys:N#O&N
*F{C,O}?0http://code.google.com/p/pypcap/Python学习As,Qo P.R _&Yx
Python学习sn Tg7O6fN#Z-^http://www.monkey.org/~dugsong/pypcap/Python学习 K#cYf a
Python学习h6NoK.t4Q w更新日期为 Jan 2007
|T c.I)N8vn0y{&u$K PFp0pycapPython学习$C2i2TLh;FPs
Python学习-V(jCfJ.rgthttp://pycap.sourceforge.net/Python学习;Z"F0Q]4Q\,V~!{
Python学习&I ^6Ih*z0Ps-CAuthor:Mark Rowe
9nF8FGo!y0 Python学习'v\|&@H1@!h比较老,依赖libnet发包Python学习A%`G$F)_:d
K/z#J OXF!pT2L5UR$U V0相对而言,目前pypcap和pylibpcap比较流行,特别说一下pypcap在Linux上的编译安装时,首先用python setup.py config配置编译环境,然后使用python setup.py build或install进行编译安装。
:|pX i6km8O0 Python学习(z*e7Bn7Sl+pqIp顺便提一句,结合pypcap和dpkt进行网络抓包分析,将非常方便,下面是一个典型的范例(抓取80端口TCP包):Python学习^df0FS pk l:I
Python学习.N x6M8dYrimport pcapPython学习)xlJ YEDXY'V
Python学习7S fw/CI8X vEgimport dpktPython学习*LAYSX!{)lh
)E u kn a0p N5K0pc=pcap.pcap()Python学习|(S!clT(c4fk
b(i5X3^-\#xI0pc.setfilter('tcp port 80')Python学习2@"\2f^~T g7u
Ww,x4E+~wa0for ptime,pdata in pc:
P/F J'~:eR0 Python学习D"f!@I/V6HZprint ptime,pdataPython学习`|x5m h@{&Qo
Python学习E%@p8]o3MKV yVp=dpkt.ethernet.Ethernet(pdata)Python学习.b `-@@1u ]"UQ+i
a4J!C0kuFs0if p.data.__class__.__name__=='IP':Python学习 Tl,P0Pp+Y5{'yr
E9~#f[:X0ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))
h6}D|]?0f8\ H|"};Q0if p.data.data.__class__.__name__=='TCP':
6w9]]/y AV$bf5k0 Python学习{Q[)|W8`)D!z5Cif p.data.data.dport==80:Python学习8gKCKP(}/x%L9U
Python学习,tJO+Z2N1T6[print p.data.data.data
python抓包截取http记录日志
武星有个需求,需要记录所有内部上网访问网页的记录,原本他让青青在网关上安装Squid,因为代理的局限性,存在问题,我觉得可以使用抓包解决,就说让我来做吧,最终实现需求,代码如下:
#!/usr/bin/python
import pcap
import dpkt
import re
def main():
def main_pcap(p_time, p_data):
def match(pre, line):
# 脚本运行也达到了武星预期的要求,OK。
# 后续记录下referer 还是很有必要的。
======================================================================================
安装
1. python 2.5
2. pypcap
http://code.google.com/p/pypcap/downloads/list
3. dpkt
http://code.google.com/p/dpkt/downloads/list
4. winpcap
如果有wireshark的话,就直接安装wireshark吧,里面带着winpcap
在Linux中有个库叫做libpcap可以胜任。libpcap是一个简单而又强大的数据包捕获函数库,可以在多种操作系统上运行。
关于libpcap有几个很好的教程:
http://www.tcpdump.org/pcap.htm (官方向导,英文,写得很适合新手)
http://blog.csdn.net/bat603/archive/2006/09/04/1175729.aspx (主要函数中文说明)
http://blog.csdn.net/bat603/archive/2006/09/04/1176251.aspx (入门源码)
ip.py定义了IP class,应该是ip协议的实现部分。
1、IP class 继承自 dpkt.Packet
2、IP class实现的头结构为:
__hdr__ = (
('v_hl', 'B', (4 << 4) | (20 >> 2)), #版本:4bit,默认值4,左移4位,首部长度:4bit,默认值20,右移2位
('tos', 'B', 0), #服务类型TOS:8bit,默认值0
('len', 'H', 20), #总长度:16bit,默认值20
('id', 'H', 0), #标识:16bit,默认值0
('off', 'H', 0), #偏移(含3bit标志):16bit,默认值0
('ttl', 'B', 64), #生存时间TTL:8bit,默认值64
('p', 'B', 0), #协议:8bit,默认值0
('sum', 'H', 0), #首部校验和:16bit,默认值0
('src', '4s', '\x00' * 4), #源地址:4个字节,默认值0.0.0.0
('dst', '4s', '\x00' * 4) #目的地址:4个字节,默认值0.0.0.0
)
可参照经典教材《TCP/IP详解》中IP首部的定义框架:
+------------------------------------------------+
I IP 首部 I
+--------+------------+---------+--------------+
I 版本 I 4 I首部长度I 4 I
+--------+------------+---------+--------------+
I tos I 8 I 总长度 I 16 I
+--------+------------+---------+--------------+
I 标识 I 16 I标志 I 3 I
+--------+------------+---------+--------------+
I 片偏移I 13 I 生存时间I 8 I
+--------+--------+--------------+-------------+
I 协议 I 8 I 首部校验和 I 16 I
+-----------+-----+--------------+-------------+
I 源IP地址 I 32 I 目的IP地址 I 32 I
+-----------+-----+--------------+-------------+
3、IP报文的选项数据(一般没有)为opts成员变量
4、IP class重载了__str__(),并且在其中自动填充了IP首部的校验和以及IP数据部分的校验和
5、unpack(buf)函数对传入的buf中的内容进行解包,并将首部数据、报文体数据放到自身对象中
6、set_proto(pktclass)函数进行协议类型设置,get_proto()取得协议类型
举个例子:
import udp
s = 'E\x00\x00"\x00\x00\x00\x00@\x11r\xc0\x01\x02\x03\x04\x01\x02\x03\x04\x00o\x00\xde\x00\x0e\xbf5foobar'
ip = IP(id=0, src='\x01\x02\x03\x04', dst='\x01\x02\x03\x04', p=17)
u = udp.UDP(sport=111, dport=222)
u.data = 'foobar'
u.ulen += len(u.data)
ip.data = u
ip.len += len(u)
#此时str(ip)==s
ip = IP(s)
#此时str(ip)==s
相关资料:
- python|学习dpkt库-dpkt.py
- python|djangoAdmin管理界面的激活方法(Django最新版1.0)
- python|用karrigell进行快速web开发
- python|学习dpkt-ip.py
- python|学习dpkt-icmp.py
- python|Python3.0处理中文的方法
- python|wxPython--wxFramestyle設定語法