Преобразование прослушанного scapy-пакета в байты

При обнюхивании пакетов с помощью scapy я могу сохранить их в переменную

sniffed = sniff(count=1)

Теперь я хотел бы посмотреть, что внутри пакета, выполнив

print sniffed

or

print str(sniffed)

но все это дает мне что-то вроде следующего:

������0�    E4h@@����������� l��

что не совсем то, что мне нужно. Итак, как я могу преобразовать перехваченный пакет в удобочитаемый двоичный файл, или массив байтов, или что-то более полезное, чтобы я мог видеть, что внутри? Я уже пытался использовать struct.unpack(format, packet) с такими форматами, как "!B", но это не кажется правильным решением, потому что пакет может быть длиннее одного байта, короткого или целочисленного.


Пример того, что я пытаюсь

>>> packet = sniff(count=1)[0]
>>> hexdump(packet)
0000   00 50 56 8E 00 0D 14 CC  20 16 E7 59 08 00 45 00   .PV..... ..Y..E.
0010   00 34 6B AB 40 00 40 06  C6 48 AC 11 8A E2 68 10   .4k.@[email protected].
0020   69 CC B5 47 00 50 E9 85  17 B0 BA EF 29 B2 80 10   i..G.P......)...
0030   01 DD 8D 58 00 00 01 01  08 0A 00 0E A2 C0 03 5D   ...X...........]
0040   9D 1C 
>>> packetByteArray = bytearray(repr(str(packet)))
>>> hex(packetByteArray[0])
'0x27'
>>>

Но в шестнадцатеричном дампе я вижу, что первый байт на самом деле 0x00, а не 0x27


person vicco    schedule 14.01.2016    source источник


Ответы (2)


Вероятно, вы ищете scapy Hexdump(pkt) или hexraw(pkt). или repr(str(pkt)) для строкового вывода. Обратите внимание, что sniff возвращает список, а не один pkt.

Если вы хотите получить доступ к сериализованным байтам пакета один за другим, просто сериализуйте слои str(pkt), чтобы получить строку python (char/byte).

for b in str(pkt):
    print "char: %s ord/value: %d hex: %x"%(b,ord(b),ord(b))
person tintin    schedule 14.01.2016
comment
hexdump дает мне то, что мне нужно, но как я могу легко получить доступ к байтам пакетов? Как 2_?. В настоящее время я пытаюсь сделать это с помощью packetByteArray = bytearray(repr(str(packet))), а затем firstByteOfPacket = packetByteArray[0], ожидая получения первого байта пакета. Тем не менее, это дает мне то, что явно не является первым байтом, как я вижу из hexdump. Я добавлю пример в свой вопрос. - person vicco; 15.01.2016
comment
см. обновленный ответ. просто сериализуйте слой/пакет и получите доступ к любому из байтов как str(pkt)[1], чтобы получить символ ascii, или ord(str(pkt)[1]), чтобы получить значение. все остальное - просто вопрос представления. - person tintin; 15.01.2016
comment
Да, это то, что мне было нужно. - person vicco; 15.01.2016

Если вы уже прочитали пакет как pkt, вы можете увидеть байты по времени:

pktBytes=[]
pktTimes=[]
from datetime import datetime
#Read each packet and append to the lists.
for p in pkt:
    if IP in p:
        try:
            pktBytes.append(p[IP].len)
            pktTime=datetime.fromtimestamp(p.time)
            pktTimes.append(pktTime.strftime("%Y-%m-%d %H:%M:%S.%f"))
        except:
            pass

# Convert list to series
bytes = pd.Series(pktBytes).astype(int)

# Convert the timestamp list to a pd date_time with the option “errors=coerce” to handle errors.
times = pd.to_datetime(pd.Series(pktTimes).astype(str),  errors='coerce')

# Build the dataframe, set time as index
df  = pd.DataFrame({'Bytes': bytes, 'Times':times})
df = df.set_index('Times')

# See how it looks in 2 seconds sums
df.resample('2S').sum().plot()
person runo    schedule 21.01.2019