python
主页 > 脚本 > python >

使用Python分析wireshark文件

2024-12-01 | 佚名 | 点击:

1 pyshark库

支持wireshark的解析等。

安装pyshark

1

pip install pyshark

2 dpkt库

这也是一个用于分析pcap文件的库,是所有分析pcap库中最快的一个。

官方参考文档:

https://dpkt.readthedocs.io/en/latest/print_packets.html

https://dpkt.readthedocs.io/en/latest/examples.html#examples-in-dpkt-examples

安装

1

pip install dpkt

3 应用实例

dpkt读pcap文件

1

2

3

4

5

f = open('new1.pcap','rb')

pcap = dpkt.pcap.Reader(f)

# ts是timestemp时间戳,buf(二进制数据)是主体的数据包信息。

for ts,buf in pcap:

    pass

获取每个数据包的ip地址

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#由buf这个二进制数据转化为Ethernet类的对象

eth = dpkt.ethernet.Ethernet(buf)

  

ip_src = eth.data.src #这里是获取这个数据包的源ip

#要注意的是,这里的源ip是以二进制的方式返回的,如果我们要获取点分十进制的ip地址

#可以这样做

def inet_to_str(inet):

    try:

        return socket.inet_ntop(socket.AF_INET,inet)

    except:

        return False#这里因为具体需要把IPv6给丢弃了

        #如果希望IPv6也能获取可以这样

        #return socket.inet_ntop(socket.AF_INET6,inet)

ip_src = inet_to_str(eth.data.src)

ip_dst = inet_to_str(eth.data.dst)#目的ip\

获取报文中的ip

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#coding=utf-8

import dpkt

import socket

import time

  

def inet_to_str(inet):

    try:

        return socket.inet_ntop(socket.AF_INET,inet)

    except:

        return False

  

def getip():

    f = open('new1.pcap','rb')#要以rb方式打开,用r方式打开会报错

    pcap = dpkt.pcap.Reader(f)

    for ts,buf in pcap:

        print(ts)打印时间戳

        eth=dpkt.ethernet.Ethernet(buf)

  

        #这里也是对没有IP段的包过滤掉

        if eth.type != dpkt.ethernet.ETH_TYPE_IP:

            continue

  

        ip = eth.data

        ip_src = inet_to_str(ip.src)

        ip_dst = inet_to_str(ip.dst)

        print(ip_src+'-->'+ip_dst)

  

if __name__=='__main__':

getip()

修改报文中的源ip和目的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import dpkt

import os

import socket

 

test = open("new.pcap","wb")

writer = dpkt.pcap.Writer(test)

f=open("old.pcap",'rb')

packets = dpkt.pcap.Reader(f)

for ts,buf in packets:

    eth = dpkt.ethernet.Ethernet(buf)

 

    # 这里是将点分十进制转化成二进制

    eth.data.src = socket.inet_pton(socket.AF_INET, "192.168.1.1")

    eth.data.dst = socket.inet_pton(socket.AF_INET, "192.168.1.2")

    writer.writepkt(eth,ts=ts)#不加ts参数,数据包时间戳会默认为当前时间

    test.flush()

test.close()

原文链接:
相关文章
最新更新