zoukankan      html  css  js  c++  java
  • python实现抓包、解析流程,超过瘾!

    今日又无聊~~~感觉浏览器检查太麻烦,于是乎想搞个抓包脚本监听本地网卡~~~~代码贴上,复制即可使用~不行那就装个包哦!嘿嘿

    import os
    import dpkt
    import socket
    import datetime
    import uuid
    
    from scapy.sendrecv import sniff
    from scapy.utils import wrpcap
    
    def get_local_ip():
    
        hostname = socket.gethostname()
        # 获取本机内网ip
        local_ips = socket.gethostbyname_ex(hostname)[-1]
    
        return local_ips
    
    def body_transfer(body):
    
        str_body = body.decode()
    
        body_ls = str_body.split("&")
    
        for item in body_ls:
            key_, value_ = item.split("=")
            print("   %s: %s"% (key_, value_))
    
    def get_dpkt():
    
        dpkt_ = sniff(count = 100)  #这里是针对单网卡的机子,多网卡的可以在参数中指定网卡,例:iface=Qualcomm QCA9377 802.11ac Wireless Adapter
        _uuid = uuid.uuid1()
        filename = f"{_uuid}.pcap"
        wrpcap(filename, dpkt_)
    
        return filename
    
    def print_pcap(pcap):
        try:
            local_ips = get_local_ip()
    
            for timestamp, buf in pcap:
                eth = dpkt.ethernet.Ethernet(buf) #获得以太包,即数据链路层包
                # print("ip layer:"+eth.data.__class__.__name__) #以太包的数据既是网络层包
                # print("tcp layer:"+eth.data.data.__class__.__name__) #网络层包的数据既是传输层包
                # print("http layer:" + eth.data.data.data.__class__.__name__) #传输层包的数据既是应用层包
                #
                # print('Timestamp: ',str(datetime.datetime.utcfromtimestamp(timestamp))) #打印出包的抓取时间
    
                if not isinstance(eth.data, dpkt.ip.IP):
                    print('Non IP Packet type not supported %s' % eth.data.__class__.__name__)
                    continue
                ip = eth.data
                src_ip = socket.inet_ntoa(ip.src)
                dst_ip = socket.inet_ntoa(ip.dst)
                do_not_fragment =bool(ip.off & dpkt.ip.IP_DF)
                more_fragments =bool(ip.off & dpkt.ip.IP_MF)
                fragment_offset = ip.off & dpkt.ip.IP_OFFMASK
    
                if isinstance(ip.data, dpkt.tcp.TCP):
    
                    # Set the TCP data
                    tcp = ip.data
    
                    # Now see if we can parse the contents as a HTTP request
                    # 看看是否可以将内容解析为HTTP请求
                    try:
    
                        request = dpkt.http.Request(tcp.data)
    
                        print('IP: %s -> %s (len=%d ttl=%d DF=%d MF=%d offset=%d)' % (src_ip + "(本机)" if src_ip in local_ips else src_ip, dst_ip, ip.len, ip.ttl, do_not_fragment, more_fragments,fragment_offset))
    
                        print("URL: %s" % request.headers.get("host") + request.uri)
                        print("METHOD: %s" % request.method.upper())
                        print("Headers: ")
                        for key, value in request.headers.items():
                            print("   %s: %s" %(key, value))
    
                        print("Body:")
                        body_transfer(request.body)
                        print("Data:")
                        body_transfer(request.data)
                        # print('HTTP request: %s
    ' % repr(request))
    
                        print()
                    except (dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError):
                        continue
    
                    # Pull out fragment information (flags and offset all packed into off field, so use bitmasks)
    
        except Exception as error:
            pass
    
    def main():
    
        while True:
            filename = get_dpkt()
            with open(filename, "rb") as f:
                pcap = dpkt.pcap.Reader(f)
                print_pcap(pcap)
    
            os.remove(filename)
    
    if __name__ =='__main__':
        main()

    实现输出:

    IP: 192.168.8.4(本机) -> 101.226.211.223 (len=770 ttl=128 DF=1 MF=0 offset=0)
    URL: client.show.qq.com/cgi-bin/qqshow_user_props_info
    METHOD: POST
    Headers: 
       accept: */*
       accept-language: zh-CN
       x-flash-version: 32,0,0,330
       content-type: application/x-www-form-urlencoded
       content-length: 115
       accept-encoding: gzip, deflate
       user-agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E)
       host: client.show.qq.com
       connection: Keep-Alive
       cache-control: no-cache
       cookie: pgv_pvid=3799000690; euin_cookie=640439D46CDC58665AB4F5F3B323373956EAFBBF9BF51FDF; ptcz=5d07117027510d320908125b0ef4126ddda91a6d014acaf2f052391f96270a23; pgv_pvi=2758768640; uin_cookie=207223216; RK=3QRly54pcL
    Body:
       senduin: 24350438
       uin: 20722321
       sVersion: 2014
       ckey: B2A96E6CCA568A891AA2FEFF214DC03A73FC7D583079467F01117641FAD33BA9
    Data:
    

     客官点个赞呗~

  • 相关阅读:
    hdu 1823 Luck and Love 二维线段树
    UVA 12299 RMQ with Shifts 线段树
    HDU 4578 Transformation 线段树
    FZU 2105 Digits Count 线段树
    UVA 1513 Movie collection 树状数组
    UVA 1292 Strategic game 树形DP
    【ACM】hdu_zs2_1003_Problem C_201308031012
    qsort快速排序
    【ACM】nyoj_7_街区最短路径问题_201308051737
    【ACM】nyoj_540_奇怪的排序_201308050951
  • 原文地址:https://www.cnblogs.com/dongxixi/p/13193572.html
Copyright © 2011-2022 走看看