Python下的网络抓包库

一直以来对于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*KKo

PcapyPython学习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)N8vn0

y{&u$K PFp0pycapPython学习$C2i2TLh;FPs

Python学习-V(jCfJ.rgt

http://pycap.sourceforge.net/Python学习;Z"F0Q]4Q\,V~!{

Python学习&I ^6Ih*z0Ps-C

Author: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 x6M8dYr

import pcapPython学习)xlJ YEDXY'V

Python学习7S fw/CI8X vEg

import 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/V6HZ

print ptime,pdataPython学习`|x5m h@{&Qo

Python学习E%@p8]o3MKV yV

p=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|]?0

f8\ H|"};Q0if p.data.data.__class__.__name__=='TCP':

6w9]]/y AV$bf5k0 Python学习{Q[)|W8`)D!z5C

if 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():

        pc=pcap.pcap(name="eth1")                                             # 抓取 eth1

        pc.setfilter('tcp port 80')                                                       # 过滤表达式 tcp port 80

 

        for p_time, p_data in pc:                                                      

                  ret = main_pcap(p_time, p_data)

                        if ret:

                                print ret 

               

def main_pcap(p_time, p_data):                                                 # 解码

        out_format = "%s\t%s\t%s\t%s\t%s\tHTTP/%s"

        p = dpkt.ethernet.Ethernet(p_data)                                    

        ret = None

        if p.data.__class__.__name__ == 'IP':

                ip_data = p.data

                src_ip = '%d.%d.%d.%d' % tuple(map(ord,list(ip_data.src)))

                dst_ip = '%d.%d.%d.%d' % tuple(map(ord,list(ip_data.dst)))

                if p.data.data.__class__.__name__=='TCP':

                        tcp_data = p.data.data

                        if tcp_data.dport==80:

                                if tcp_data.data:

                                        h = dpkt.http.Request(tcp_data.data)                                            # http解码

                                        pre = "^/.*$"

                                        if match(pre, h.uri):                                                                           # url 重写

                                                http_headers = h.headers

                                                host = h.headers['host']

                                                url = "http://" + host + h.uri

                                        else:

                                                url = h.uri

 

                                        # datetime srcip dstip GET /index.htm HTTP/1.1                       # 输出日志格式

                                        ret = out_format % (p_time, src_ip, dst_ip, h.method, url, h.version)

 

        

        return ret

 

def match(pre, line):

        p = re.compile(pre)

        m = p.match(line)

        return m


# 脚本运行也达到了武星预期的要求,OK。

# 后续记录下referer 还是很有必要的。

======================================================================================

安装

1. python 2.5

2. pypcap               python的抓包函数库

http://code.google.com/p/pypcap/downloads/list

3. dpkt                     python的解包函数库

http://code.google.com/p/dpkt/downloads/list

4. winpcap             python支持pacp的驱动

如果有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.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

相关资料:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值