zoukankan      html  css  js  c++  java
  • Python3+pyshark捕获数据包并保存为文件

    一、直接使用wireshark捕获数据包并保存为文件

    可以使用wireshark通过图形界面的操作来实现捕获数据包并保存为文件。

    wireshark默认捕获的数据包保存为临时文件,如果最后退出时不选择保存那么临时文件将会被删除。

    可以在“菜单栏----捕获----选项----输出”窗口进行配置,指示wireshark直接将捕获结果保存为文件。

    文件----数据包要保存到的文件

    输出格式----数据包保存成的文件的文件格式

    自动创建新文件----指示当当前文件达到某个指标后,就把后续数据包另存到另一个文件。(本质是通过关闭当前监听新启一个监听来实现)

    使用一个环形缓冲器----只保存为那么多个文件,数量用完后从头形始覆盖。

    以如上配置为例,截获结果如下:

     二、使用tshark捕获数据包并保存为文件

    tshark就是命令行版的wireshark(基于wireshark的多种表示,感觉wireshark部份功能也是调用tshark来实现的),所以也可以通过tshark来实现同样的效果。

    使用-i指定网卡,使用-w实现文件,使用-F实现指定格式,使用-b实现自动创建新文件。

    -i使用的网卡名,控制面版中看到的是什么就是什么,wireshark列出来的是什么就是什么。

    Linux版形如:

    tshark -i eth0 -b filesize:1024 -F pcap -w test_pcap.pcap

    Windows版形如:

    tshark -i "本地连接 2" -b filesize:1024 -F pcap -w test_pcap.pcap

    三、使用pyshark捕获数据包并保存为文件

    3.1 直接无法捕获数据包

    pyshark本质是调用tshark,理论上捕获代码应形如下:

    import pyshark
    
    tshark_path = 'D:\tools\Wireshark\tshark.exe'
    capture = pyshark.LiveCapture(output_file="test_pcap.pcap",interface="本地连接 2",tshark_path=tshark_path)
    capture.sniff(timeout=10)

    但是在python-3.6.6环境中无论是Linux还是Windows都捕获不到数据包(<LiveCapture (0 packets)>)

    追踪代码看到在没指定网卡时pyshark是通过tshark -D来列出所有网卡,然后取网卡前序号形式来指定网卡

    由上图可以看到“本地连接 2”序号为6,但代码改为形如下仍不能捕获到数据包

    (其实使用网卡名和网卡序号两种方式tshark都是支持的,所以和这个无关;当然也不能算一定关系没有,传给pyshark的”本地连接 2“参数中间有空格,pyshark再传给tshark时不会自动加上引号tshark会因格式不对启不来,但这里也不是因为这个。)

    import pyshark
    
    tshark_path = 'D:\tools\Wireshark\tshark.exe'
    capture = pyshark.LiveCapture(output_file="test_pcap.pcap",interface="6",tshark_path=tshark_path)
    capture.sniff(timeout=10)

     后来看网上也有类似的情况,说是版本问题(我当前是0.4.1也一样的问题)而0.3.6.2版本是可以的,使用python2.7+0.3.6.2版本(pip install pyshark==0.3.6.2)确实可以成功保存数据包。

    3.2 修改live_capture.py实现捕获数据包并保存为文件

    pyshark-0.3.6.2在python-3.6装不上,要去用python2.7这是令人不爽的。

    通过capture.set_debug()开启打印debug信息可以看到是tshark报错:tshark: You can't write both raw packet data and dissected packets to the standard output.排查之下发现是tshark的"-P"(打印汇总信息)和”-w -“(将原始数据包输出到控制台)冲突所致。

    简单分析pyshark流程发现去除”-P“参数可解决捕获不到数据包的问题。操作如下:

     打开pyshark的live_capture.py移动到72行,将原先的params = ["-q", "-P"]修改为params = ["-q"]

    参考:

    https://github.com/KimiNewt/pyshark

    https://github.com/KimiNewt/pyshark/issues/222

  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/lsdb/p/9765136.html
Copyright © 2011-2022 走看看