2

我有一个wireshark数据包捕获(.pcapng),并且必须将文件读取到python程序的内存中。希望将数据包转换为 JSON 格式,如下所示:

$ tshark -r cap.pcapng -T json > ip.json

我需要将 json 数据写回 pcapng 文件。请告诉我该怎么做。

4

1 回答 1

2

-T json

如果您在问题中输出为 JSON,您将无法转换回 pcap。问题是独立的 JSON 没有字节偏移量或字节来告诉转换器要存储哪些字节以及存储在哪里。

如果这是您的 JSON,则可以使用数据手动编码新的 pcap,具体取决于 JSON 值的详细程度。如果您绝对绝望(即避免这种方法),这是您所做的那种费力的硬编码。

-T json值如下所示:

[
  {
    "_index": "packets-2020-05-09",
    "_type": "doc",
    "_score": null,
    "_source": {
      "layers": {
        "frame": {
          "frame.interface_id": "0",
          "frame.interface_id_tree": {
            "frame.interface_name": "en0",
            "frame.interface_description": "Wi-Fi"
          },
          "frame.encap_type": "1",
          "frame.time": "May  9, 2020 20:03:11.303663000 PDT",
          "frame.offset_shift": "0.000000000",
          "frame.time_epoch": "1589079791.303663000",
          "frame.time_delta": "0.000000000",
          "frame.time_delta_displayed": "0.000000000",
          "frame.time_relative": "0.000000000",
          "frame.number": "1",
          "frame.len": "92",
          "frame.cap_len": "92",
          "frame.marked": "0",
          "frame.ignored": "0",
...

-T jsonraw / -T json -x

这些选项是等效的,并输出每个字段的字节和字节偏移量。Wireshark 有一个内置的 python 实用程序用于这个确切的目的json2pcap,但只会使用这种类型的输出。

Martin Kacer 编写了这个实用程序,并在他的网站上提供了相关文档。本文提供了一步一步的指南,从 pcap 到 json 到 pcap 的转换。您可以找到源代码并单独使用它:json2pcap.py在 Wireshark 的 github repo 中。

-T jsonraw输出如下所示:

[
  {
    "_index": "packets-2020-05-09",
    "_type": "doc",
    "_score": null,
    "_source": {
      "layers": {
        "frame_raw": [
          "cc65adda39706c96cfd87fe70800450000a40000400040061ec4c0a801f69765c18cd13b01bb72f797c64990e967801826c562c300000101080a52be1ece06253aa9170303006b00000000000043350c719c8d15f3339346992e557abac51ade350316082fa92225912552dde4ccec7197c6c7745b91b66747c1c8bea3337656213e59425f35c13fdf1739a174a7528d97b0eb10fce4daaba613840d8ce7f28bbbe094abd97db97da3f8f91b68e4db30d982",
          0,
          178,
          0,
          1
        ],
        "frame": {
          "frame.interface_id": "0",
          "frame.interface_id_tree": {
            "frame.interface_name": "en0",
            "frame.interface_description": "Wi-Fi"
          },
          "frame.encap_type": "1",
          "frame.time": "May  9, 2020 20:02:25.845268000 PDT",
          "frame.offset_shift": "0.000000000",
          "frame.time_epoch": "1589079745.845268000",
          "frame.time_delta": "0.000000000",
...

如您所见,frame_raw具有数据包的完整字节,这在重构中很重要。

于 2020-05-10T03:04:56.983 回答