Как в Scapy / Kamene python найти глобальные заголовки для файла pcap? - PullRequest
1 голос
/ 30 марта 2020

Таким образом, в C при чтении из файла Pcap вы можете использовать библиотеку C libpcap, чтобы получить всю эту информацию, относящуюся к глобальным заголовкам:

typedef struct pcap_hdr_s {
        guint32 magic_number;   /* magic number */
        guint16 version_major;  /* major version number */
        guint16 version_minor;  /* minor version number */
        gint32  thiszone;       /* GMT to local correction */
        guint32 sigfigs;        /* accuracy of timestamps */
        guint32 snaplen;        /* max length of captured packets, in octets */
        guint32 network;        /* data link type */
} pcap_hdr_t;

Итак, я искал долгое время безрезультатно, как найти эти переменные в python библиотеках Scapy / Kamene.

Может кто-нибудь показать мне пример кода из Scapy / Kamene, который поможет мне найти все эти переменные или хотя бы способ найти все эти переменные ??

1 Ответ

1 голос
/ 30 марта 2020

Это невозможно в Scapy на момент написания этой статьи. Вы все еще можете сделать это с помощью python, читая его как структуру байтов:

import struct

LITTLE_ENDIAN = "<"
BIG_ENDIAN = ">"

with open("temp.pcap", "rb") as f:
    filebytes = f.read()
if filebytes[:2] == b"\xa1\xb2":
    endianness = BIG_ENDIAN
elif filebytes[:2] == b"\xd4\xc3":
    endianness = LITTLE_ENDIAN
# pcapng is a completely different filetype and has different headers
# It's magic number is also the same between big/little endian
elif filebytes[:2] == b"\n\r":
    raise ValueError("This capture is a pcapng file (expected pcap).")
else:
    raise ValueError("This capture is the wrong filetype (expected pcap.")

# Endianness is < or > and is handled by checking magic number.
pcap_headers = struct.unpack(endianness + "IHHIIII", filebytes[:24])
print(pcap_headers)
---
(2712847316, 2, 4, 0, 0, 524288, 1)

Здесь мы распаковываем < для little-endian в моей системе macos (> для больших -endian). H читает 4 байта, а I читает 2 байта. Подробнее о символах формата можно прочитать в документации Python3 struct Мы можем легко проверить число волхвов c:

>>> int(str("A1B2C3D4"), 16)
2712847316

Похоже, это действительно pcap с правильным числом волхвов c. Для маги c числа порядка байтов, взгляните на этот SO ответ (может быть несколько правильных pcap "волхвов c numbers").

Благодаря @ Cukic0d: исходный код scapy - отличное место для разбора pcap magi c numbers .

...