【问题标题】:How to convert a pcap into hex stream using tshark?如何使用 tshark 将 pcap 转换为十六进制流?
【发布时间】:2020-01-10 22:10:21
【问题描述】:

我在 Python 中尝试过的只是这个:

首先,我阅读了 pcap 文件并在 Python 中使用了这个命令:

with open("pcap_files/DCERPC.pcap", 'rb') as f:
    content = f.read()
binascii.hexlify(content)

自从读取整个文件以来,我没有得到确切的十六进制流。

因此,是否可以使用 tshark 将 pcap 复制到十六进制流中?

编辑:

在图像wireshark capture 中,有许多帧,我选择一个并复制它具有十六进制流。在 tshark 或 xxd 中执行此操作的命令是什么?

【问题讨论】:

    标签: python wireshark pcap tshark


    【解决方案1】:

    当您使用 python 时,您可能需要查看PyShark,它利用了 tshark。

    设置:创建文件

    让我们创建一个单包文件用于演示目的:

    bash-5.0$ tshark -w temp.pcap -c 10
    Capturing on 'Wi-Fi: en0'
    1 
    1 packet dropped from Wi-Fi: en0
    

    解析十六进制

    解析十六进制的方法有很多。您选择哪种方法取决于您要执行的操作。 Tshark 会显示数据包,而 hexdump 和 xxd 会显示每个字节,包括捕获格式字节。要了解数据包和文件格式字节之间的区别,这篇关于解构pcap format 的文章可能会有所帮助。 Wireshark 也可以通过View -> "Reload as File Format/Capture" 来实现这一点。

    使用 tshark 获取十六进制

    要从 tshark 获取每个数据包的十六进制,请使用 -T json,然后找到“frame_raw”字段。

    bash-5.0$ tshark -x -r temp.pcap -T json
    [
      {
        "_index": "packets-2019-09-10",
        "_type": "pcap_file",
        "_score": null,
        "_source": {
          "layers": {
            "frame_raw": ["cc65adda39706c96cfd87fe7080045000028910000004006ca3fc0a801f69765c58cc08001bb2f5a0b8169ef01ab501008001f930000",
              0,
              54,
              0,
              1
            ],
            "frame": {
              "frame.encap_type": "1",
              "frame.time": "Sep 10, 2019 18:57:29.571371000 PDT",
              "frame.offset_shift": "0.000000000",
    ...
    

    在 python 中使用 tshark 获取十六进制

    import json
    import subprocess as sp
    
    def get_tshark_hexstreams(capture_path: str) -> list:
        """Get the frames in a capture as a list of hex strings."""
        cmds = ["tshark", "-x", "-r", capture_path, "-T", "json"]
        frames_text = sp.check_output(cmds, text=True)
        frames_json = json.loads(frames_text)
        hexstreams = [frame["_source"]["layers"]["frame_raw"][0] for frame in frames_json]
        return hexstreams
    
    output = get_tshark_hexstreams('temp.pcap')
    print(output)
    ['6c96cfd87fe7cc65adda'...
     'cc65adda39706c96cfd8'...
     'ffffffffffff60a44c24'...
     ...
    

    根据相关更新进行编辑。

    【讨论】:

    • 我编辑了我的问题。我想要捕获一帧的十六进制字符串。
    • 答案已更新。我相信您正在寻找 frame_raw。
    • 还请编辑您的问题以将其框定为“我可以通过 XYZ 使用 Wireshark 获得十六进制流。我正在尝试在 tshark 中做同样的事情,然后使用 python 读取结果。”
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 2011-10-09
    • 1970-01-01
    • 2023-04-06
    • 2015-09-13
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多