精华内容
下载资源
问答
  • 今天小编就为大家分享一篇利用Python库Scapy解析pcap文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Python解析pcap文件

    2021-04-08 23:01:58
    Python解析pcap文件 近期做一些基于TCP协议的项目,跟其他接口方调试时经常出现不一致的问题,而程序日志又不能完成保证公正,就只能通过tcpdump抓包的方式来排查问题了。 由于是自定义的协议,用wireshark只能解析...

    Python解析pcap文件

    近期做一些基于TCP协议的项目,跟其他接口方调试时经常出现不一致的问题,而程序日志又不能完成保证公正,就只能通过tcpdump抓包的方式来排查问题了。
    由于是自定义的协议,用wireshark只能解析成16进制的报文,排查起来并不方便,而实现相关的插件又要用到C++或者LUA语言,这两者我都极少接触,因此,只能临时用Python写程序来解析了~

    首先,需要安装对应的依赖:

    pip install dpkt
    

    我们用tcpdump或者wireshark抓到对应的内容后,保存为 tcp-log.pcap 文件,然后就可以解析了(以下代码基于Python3):

    import dpkt
    import socket
    
    file = 'tcp-log.pcap'
    with open(file, 'rb') as fr:
        pcap = dpkt.pcap.Reader(fr)
        for timestamp, buffer in pcap:
            ethernet = dpkt.ethernet.Ethernet(buffer)
            # 我们仅需要TCP的包
            if not isinstance(ethernet.data, dpkt.ip.IP):
                continue
            ip = ethernet.data
            if not isinstance(ip.data, dpkt.tcp.TCP):
                continue
            tcp = ip.data
            # 过滤掉内容为空的包
            if len(tcp.data) == 0:
                continue
            # 发送方的IP
            src = socket.inet_ntoa(ip.src)
            # 接收方的IP
            dst = socket.inet_ntoa(ip.dst)
            # 报文内容(byte数组)
            byteArray = tcp.data
            # TODO 根据自定义的协议内容,解析bytes数组
    
    展开全文
  • 从上一篇博客可以看到pcap文件的格式,前面24字节是不用管的,而每一个数据包前都有16字节的说明,其中第8-11字节是caplen字段,也就是这个数据包的长度信息,不包含这16个字节。我们打开文件读取时可以直接seek()到...

    上一篇博客可以看到pcap文件的格式,前面24字节是不用管的,而每一个数据包前都有16字节的说明,其中第8-11字节是caplen字段,也就是这个数据包的长度信息,不包含这16个字节。我们打开文件读取时可以直接seek()到第32(24+8)字节,去读取第一个数据包的长度,然后再回退12个字节,读取(caplen+16)个长度,作为整个数据包的数据。

    读取之后的数据包时,用同样的方法先向后 seek 8个字节,读取caplen后在回退12个字节,读取(caplen+16)的长度,即为数据包数据。

    读取pcap文件

    用open()、read()就可以读取pcap文件,但注意open时要用'rb'模式

    import struct
    
    fd_read = open(read_path, 'rb')
    fd_read.seek(32, 0)                         # skip pcap head and packet head
    len_sec = fd_read.read(4)          # caplen
    if not len_sec:              # read fail or zero
        break
    

    转码

    读取到caplen后,需要对数据进行格式转换,原本是类似 b'\xde\x3d'的格式,我们的目的是16进制数,所以用到struct模块中的unpack()函数

    seclen = struct.unpack('i', len_sec)
    caplen = seclen[0] & 0xFFFFFFFF

    struct.unpack()的参数中,第一个是指解码的模式,有很多种,需要的可以自行查看,但是有一个大小端的问题,这里涉及到了,如果使用'i'(感叹号加小写字母i),那么得到的数据包packet串就会是逆序的16进制数的排列,如原本应是“68 ca e4 e6”,会变成“e6 e4 ca 68”。而在读取数据包前16字节的说明字段时,只有不加感叹号才能得到正确的caplen和时间戳。

    具体细节就不多说了,更多的都是简单的处理,可以在评论区交流

    #! /usr/bin/env python3
    import getopt
    import sys
    import struct
    import re
    
    
    def symbol_split(ss):
        if "&" in ss:
            cdt = ss.split('&')
        else:
            cdt = [ss]
        return cdt
    
    
    def compare_operate(filter, packet):
        result = 1
        for ft in filter:
            ft_item = ft.split()
            offset = int(ft_item[0]) * 2 + 32
            length = int(ft_item[1]) * 2
            s = packet[offset:offset + length]  # original value
            d = int(s, 16) & int(ft_item[2], 16)  # after mask
            
            cdt = symbol_split(ft_item[3])
    
            for i in cdt:
                if (('>' in i) and (d <= int(i[1:], 16))) or (('<' in i) and (d >= int(i[1:], 16))) or \
                        (('==' in i) and (d != int(i[2:], 16))) or (('!=' in i) and (d == int(i[2:], 16))):
                    result = 0
    
        return result
    
    def range_operate(pct_range, packet_num):
        range_flag = 1
        for r in pct_range:
            if (('>' in r) and (packet_num <= int(r[1:]))) or (('!=' in r) and (packet_num == int(r[2:]))) \
                    or (('==' in r) and (packet_num < int(r[2:]))):
                range_flag = 0
                break
            if (('<' in r) and (packet_num >= int(r[1:]))) or (('==' in r) and (packet_num > int(r[2:]))):
                range_flag = 2
                break
        return range_flag
    
    
    def decode_pcap(read_path, opt_dict):
        packet_num = 0
        filter_num = 0
        fd_read = open(read_path, 'rb')
    
        if '--save' in opt_dict:
            pcap_head = fd_read.read(24)
            fd_write = open(opt_dict['--save'][0], 'wb')
            fd_write.write(pcap_head)
        else:
            fd_read.seek(24, 0)                         # skip pcap head
    
        while True:
            # one packet
            # packet head write
            packet = ''
            packet_num += 1
            head_lseek = fd_read.seek(8, 1)             # -->8 bytes
            if not head_lseek:
                break
            len_sec = fd_read.read(4)          # caplen
            if not len_sec:              # read fail or zero
                break
            seclen = struct.unpack('i', len_sec)
            caplen = seclen[0] & 0xFFFFFFFF
    
            # range_flag = 1 ===>filter
            # range_flag = 0 ===>less, skip and continue
            # range_flag = 2 ===>more, stop and break
            if '--pcap_range' in opt_dict:
                pct_range = symbol_split(opt_dict['--pcap_range'][0])
                range_flag = range_operate(pct_range, packet_num)
    
                if range_flag == 0:
                    skip_lseek = fd_read.seek(caplen + 4, 1)
                    if not skip_lseek:
                        break
                    continue
                elif range_flag == 2:
                    break
                # print("%d come in"%packet_num)
    
            packet_lseek = fd_read.seek(-12, 1)
            if not packet_lseek:
                break
            head_sec = fd_read.read(16)
            if len(head_sec) != 16:
                break
    
            # print(head_sec)
            for k in range(4):
                s = struct.unpack('i', head_sec[k*4:(k+1)*4])
                head = s[0] & 0xFFFFFFFF
                packet += str("%08x" % head)
    
            # packet write
            pkt_sec = fd_read.read(caplen)          #caplen
            read_num = len(pkt_sec)
            if read_num != caplen:
                print("Here Read fail")
                break
            if not pkt_sec:              #read fail or zero
                print("Read Null")
                break
    
            for i in range(0, (caplen+3)//4-1):
                sec_tuple = struct.unpack('!i', pkt_sec[i*4:(i+1)*4])
                sec_four = sec_tuple[0] & 0xFFFFFFFF
                packet += str("%08x" % sec_four)
    
            looptime = caplen % 4
            j = caplen - looptime
            while(looptime):
                one_byte = pkt_sec[j]
                saveData = one_byte & 0xFF
                packet += str("%02x" % saveData)
                j += 1
                looptime -= 1
            # print(len(packet))
    
            filter_item = opt_dict['--filter']
    
            if compare_operate(filter_item, packet):                     # filter success
                check_flag = 1
                filter_num += 1                                  # go check
                # print(packet)
                if '--check' in opt_dict:
                    check = opt_dict['--check']
                    if not compare_operate(check, packet):
                        check_flag = 0
    
                if '--format' in opt_dict:
                    result = opt_dict['--format'][0]
    
                    if '&(index)' in result:
                        result = result.replace('&(index)', str(packet_num))
                    if '&(filter_index)' in result:
                        result = result.replace('&(filter_index)', str(filter_num))
                    if '&(time)' in result:
                        result = result.replace('&(time)', str(int(packet[0:8], 16))+'.'+str(int(packet[8:16], 16)))
                    if '&(result)' in result:
                        result = result.replace('&(result)', str(bool(check_flag)))
    
                    offset_item = re.findall(r'&[(](.*?)[)]', result, re.S)
                    # print(format)
    
                    for fmt in offset_item:
                        fmt_item = fmt.split()
                        offset = int(fmt_item[0]) * 2 + 32
                        length = int(fmt_item[1]) * 2
                        result = result.replace('&('+fmt+')', str("%x" % (int(packet[offset:offset + length], 16) & int(fmt_item[2], 16))))
    
                    if '--filter_range' in opt_dict:
                        flt_range = symbol_split(opt_dict['--filter_range'][0])
                        flt_range_flag = range_operate(flt_range, filter_num)
                        if flt_range_flag == 1:
                            print(result)
                        elif flt_range_flag == 2:
                            break
                    else:
                        print(result)
                else:
                    print(str(filter_num)+"  "+str(packet_num)+"  "+str(bool(check_flag)))
    
                if '--save' in opt_dict:
                    save_seek = fd_read.seek(-(caplen+16), 1)
                    if not save_seek:
                        break
                    save_sec = fd_read.read(caplen+16)
                    if len(save_sec) != caplen+16:
                        break
                    fd_write.write(save_sec)
    
        # print('filter ', filter_num, ' packets')
        fd_read.close()
        if '--save' in opt_dict:
            fd_write.close()
    
    
    opt_dict = {}
    long_args = ['filter=', 'save=', 'check=', 'format=', "pcap_range=", "filter_range="]
    opts, args = getopt.getopt(sys.argv[2:], '', long_args)
    
    for opt, val in opts:
        if opt in opt_dict:
            opt_dict[opt].append(val)
        else:
            opt_dict[opt] = [val]
    
    
    decode_pcap(sys.argv[1], opt_dict)
    
    
    

     

    展开全文
  • python读取pcap文件

    2020-12-04 05:55:17
    0x01FF 实验 0x0600 XEROX NS IDP 0x0660 0x0661 DLOG 0x0800 网际协议( IP ) 0x0801 X.75 Internet 0x0802 NBS Internet 0x0803 ECMA Internet 0x0804 Chaosnet 0x0805 X.25 Level 3 0x0806 地址解析协议...

    Ethertype(

    十六进

    )

    协议

    0x0000 - 0x05DC

    IEEE 802.3

    长度

    0x0101

    0x01FF

    实验

    0x0600

    XEROX NS IDP

    0x0660 0x0661

    DLOG

    0x0800

    网际协议(

    IP

    )

    0x0801

    X.75 Internet

    0x0802

    NBS Internet

    0x0803

    ECMA Internet

    0x0804

    Chaosnet

    0x0805

    X.25 Level 3

    0x0806

    地址解析协议(

    ARP

    Address Resolution Protocol

    )

    0x0808

    帧中继

    ARP

    (

    Frame Relay ARP

    )

    [RFC1701]

    0x6559

    原始帧中继(

    Raw Frame Relay

    )

    [RFC1701]

    0x8035

    动态

    DARP

    (

    DRARP

    Dynamic RARP

    )

    反向地址解析协议(

    RARP

    Reverse Address Resolution

    Protocol

    )

    0x8037

    Novell Netware IPX

    0x809B

    EtherTalk

    0x80D5

    IBM SNA Services over Ethernet

    0x 80F 3

    AppleTalk

    地址解析协议(

    AARP

    AppleTalk Address

    Resolution Protocol

    )

    0x8100

    以太网自动保护开关

    (

    EAPS

    Ethernet

    Automatic

    Protection

    Switching

    )

    0x8137

    因特网包交换(

    IPX

    Internet Packet Exchange

    )

    展开全文
  • 使用scapy、scapy_http就可以方便的对pcap包中的http数据包进行解析scapy_http可以在https://github.com/invernizzi/scapy-http下载,该地址下也给出了简单的示例程序,按照此示例程序我修改了一个输出pcap包中http...

    使用scapy、scapy_http就可以方便的对pcap包中的http数据包进行解析

    scapy_http可以在https://github.com/invernizzi/scapy-http下载,该地址下也给出了简单的示例程序,按照此示例程序我修改了一个输出pcap包中http包的源目的地址、payload的小程序,如下所示:

    L3Byb3h5L2h0dHBzL2ltYWdlczIwMTguY25ibG9ncy5jb20vYmxvZy8xMjQ3MDQ0LzIwMTgwNy8xMjQ3MDQ0LTIwMTgwNzMwMDkyNDE1NTczLTEwNjAyMjgxNjkucG5n.jpg

    其中,p为数据包,scapy_http将其分为:

    Ethernet->TCP->RAW三个层次,

    使用p.show()函数可以打印出如下结果:

    ###[ Ethernet ]###

    dst = 02:00:00:00:00:39

    src = 00:00:00:01:02:09

    type = 0x800

    ###[ IP ]###

    version = 4L

    ihl = 5L

    tos = 0x0

    len = 1014

    id = 7180

    flags =

    frag = 0L

    ttl = 45

    proto = tcp

    chksum = 0xbbf9

    src = 126.209.59.13

    dst = 121.113.176.25

    \options \

    ###[ Raw ]###

    load = '.....'

    第一层是网络层,包含源、目的mac、ip协议号,第二层是tcp层,第三层包含端口号、http报文

    其中每一层均为上一层的payload成员

    在运行程序的过程中,如果提示dnet或pcap库异常,需要到这里下载并重新安装相应的库:

    从pcap文件中分析出数据包

    import dpkt import struct import sys,os f=file(sys.argv[1],"rb") pcap=dpkt.pcap.Reader(f) ...

    python解析发往本机的数据包示例 &lpar;解析数据包&rpar;

    tcp.py # -*- coding: cp936 -*- import socket from struct import * from time import ctime,sleep from ...

    Python解析Pcap包类源码学习

    0x1.前言 ​ 在现场取证遇到分析流量包的情况会比较少,虽然流量类设备原理是把数据都抓出来进行解析,很大一定程度上已经把人可以做的事情交给了机器自动完成. ​ 可用于PCAP包分析的软件比如科来,W ...

    python dpkt 解析 pcap 文件

    dpkt Tutorial #2: Parsing a PCAP File 原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2 ...

    python操作txt文件中数据教程&lbrack;4&rsqb;-python去掉txt文件行尾换行

    python操作txt文件中数据教程[4]-python去掉txt文件行尾换行 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文章 python操作txt文件中数据教程[1]-使用pyt ...

    python操作txt文件中数据教程&lbrack;3&rsqb;-python读取文件夹中所有txt文件并将数据转为csv文件

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...

    python操作txt文件中数据教程&lbrack;2&rsqb;-python提取txt文件

    python操作txt文件中数据教程[2]-python提取txt文件中的行列元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果-将txt中元素提取并保存在c ...

    python操作txt文件中数据教程&lbrack;1&rsqb;-使用python读写txt文件

    python操作txt文件中数据教程[1]-使用python读写txt文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果 程序实现 filename = '. ...

    &lbrack;Python&rsqb;将Excel文件中的数据导入MySQL

    Github Link 需求 现有2000+文件夹,每个文件夹下有若干excel文件,现在要将这些excel文件中的数据导入mysql. 每个excel文件的第一行是无效数据. 除了excel文件中已 ...

    随机推荐

    js获取url地址中的参数

    QRCode&period;js 生成二维码

    QRCode.js 是一个用于生成二维码图片的插件. github地址 在线实例 实例预览 基础示例 实例预览 API 接口 使用方法 载入 JavaScript 文件

    2014/10/15 Leetcode第一刷总算结束,时间拖太长了,希望第二遍能快一点,争取一个月能刷完第二遍??哈哈哈哈

    教你区分LVDS屏线及屏接口定义

    现在碰到液晶屏大多是LVDS屏线,经常碰到什么单6,双6 单8双8.如何区分呢?我以前也不知道,后在网上收集学习后才弄明白方法1数带 “ -”的这种信号线一共有几对,有10对的减2对就是双8,有8对的 ...

    Linux中的简单命令

    history:打印你输过的命令      1.用户在shell中输入的命令会自动保存到内存缓冲区      2.在退出shell的时候,内存中的数据会刷新到磁盘文件:~/.bash_history ...

    oc调用c&plus;&plus;接口时 报错 Undefined symbols for architecture i386&colon;

    当在oc中调用c++中的方法时,发现说c++中的方法没定义或是找不到 Undefined symbols for architecture i386: "_desTYData", ...

    C语言和C&plus;&plus;篇

    C语言和C++篇 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的.想想我们至今的代码,到底生成和使用了多少String!标题上所罗列的语言,可以看成 ...

    深入浅出数据结构C语言版(15)——优先队列(堆)

    在普通队列中,元素出队的顺序是由元素入队时间决定的,也就是谁先入队,谁先出队.但是有时候我们希望有这样的一个队列:谁先入队不重要,重要的是谁的"优先级高",优先级越高越先出队.这样 ...

    CUDA程序的调试总结【不定时更新】

    1 )CUDA的程序,经常犯,但是很难发现的一个错误就是同步问题. 描述下实例 for (k = 0; k < N; k+=BS) { sda[tx] = gda[tx+index]; __sy ...

    展开全文
  • python 解析pcap报文

    2018-06-06 16:30:46
    本代码能对抓包工具抓下来的pcap包各个字段进行精确的解析,包括文件头,报文头,协议头,数据内容等的解析。。
  • python解析pcap文件

    2021-01-07 19:51:19
    packets = scapy.rdpcap("/Users/didi/Documents/sec-eva-agent.pcap") # 读取pcap文件 ''' rdpcap(filename, count=-1) Read a pcap file and return a packet list count: read only <count> packets ''' ...
  • Python读取pcap文件

    2020-11-30 10:10:07
    想试一试读取pcap文件的内容,并且分析出pcap文件头,每一包数据的pcap头,每一包的数据内容(暂时不包括数据包的协议解析),关于pcap文件的格式,可以参看:http://blog.sina.com.cn/s/blog_4b5039210100fzrt.html搞...
  • PYTHON读取PCAP文件

    2020-11-30 10:10:12
    0x05DCIEEE802.3长度0x0101–0x01FF实验0x0600XEROXNSIDP0x06600x0661DLOG0x0800网际协议(IP)0x0801X.75Internet0x0802NBSInternet0x0803ECMAInternet0x0804Chaosnet0x0805X.25Level30x0806地址解析协议(AR...
  • 想试一试读取pcap文件的内容,并且分析出pcap文件头,每一包数据的pcap头,每一包的数据内容(暂时不包括数据包的协议解析),关于pcap文件的格式,可以参看:http://blog.sina.com.cn/s/blog_4b5039210100fzrt.html搞...
  • 今天小编就为大家分享一篇使用PYTHON解析Wireshark的PCAP文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 本文代码都由python编写,无需安装第三方拓展库,代码更新:...可以看到.pcap文件,就由一个pcap文件头+无数个(pcap包头+包数据组成),我们只需要一个个解析即可,文件头用于描述.pcap...
  • python读取pcap文件.pdf

    2021-09-30 18:34:53
    python读取pcap文件.pdf
  • 从今天开始准备试一试对pcap文件数据报的协议解析。首先从最简单的以太网层开始。我们知道,目前常用的以太网帧结构有两种,一个是IEEE802.3,一个是EthernetII,两者的区别也很清楚,就是在目的Mac地址和源Mac地址...
  • Python读取pcap

    千次阅读 2019-03-19 16:09:03
    #读取pcap文件解析相应的信息,为了在记事本中显示的方便,把二进制的信息 import struct fpcap = open('test.pcap','rb') ftxt = open('result.txt','w') string_data = fpcap.read() #pcap文件包头解析 pcap...
  • Python处理pcap文件

    千次阅读 2020-07-14 10:22:12
    利用python处理pcap文件
  • pythonpcap转txt工具

    2018-11-01 09:46:20
    这个工具可以将pcap文件的中的关键信息解析出来 格式如下 源IP 目标IP 源端口 目标端口 协议类型 时间 包大小格式化以后输出出来 一共输出两个文件 一个txt文件 一个sql文件,方便存入到数据库中 源IP: 111.10.121....
  • Python按连接拆分pcap文件,将文件拆成一个一个的小包(按照连接)
  • 我有一个大的pcap文件,我正在使用下面的python代码进行解析。代码可以工作,但有一个问题。当我解析pcap文件时,如下面的代码所示,我将这些值存储在另一个名为filename的文件中pkts=rdpcap("MyFile.pcap")def ...
  • pcap文件python解析实例

    万次阅读 多人点赞 2016-07-23 18:44:31
    正文首先要说的是,我知道python有很多解析pcap文件的库,这里不使用它们的原因是为了理解pcap文件的格式细节。使用tcpdump你可以很容易抓取到一系列的数据包,然而tcpdump并没有分析数据包的功能,如果想从这个抓包...
  • 利用Python库Scapy解析pcap文件

    万次阅读 2018-06-11 19:52:21
    每次写博客都是源于纳闷,python解析pcap这么常用的例子网上竟然没有,全是一堆命令行执行的python,能用吗?玩呢?pip安装scapy,然后解析pcap:import scapy from scapy.all import * from scapy.utils import ...
  • 对pcap文件中每个包进行内容.../usr/bin/env python#coding=utf-8#读取pcap文件解析相应的信息,为了在记事本中显示的方便,把二进制的信息import structimport time, datetimedef time_trans(GMTtime):#print(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,838
精华内容 735
关键字:

python解析pcap文件

python 订阅