2016-01-14 5 views
0

Когда нюхать пакеты с scapy я могу сохранить их в переменнойПреобразование понюхал пакет scapy в байты

sniffed = sniff(count=1) 

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

print sniffed 

или

print str(sniffed) 

, но все это дает мне примерно следующее:

������0� [email protected]@����������� l�� 

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


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

>>> 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 [email protected]@..H....h. 
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

ответ

1

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

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

for b in str(pkt): 
    print "char: %s ord/value: %d hex: %x"%(b,ord(b),ord(b)) 
+0

'hexdump' дает мне то, что мне нужно, но как я могу легко получить доступ к пакетам Bytes? Как 'firstByteOfPacket = пакет [0]' ?. В настоящее время я пытаюсь сделать это с помощью 'packetByteArray = bytearray (repr (str (пакет))), а затем' firstByteOfPacket = packetByteArray [0] 'ожидает получения первого байта пакета. Тем не менее это дает мне то, что явно не является первым байтом, как я вижу из «hexdump». Я добавлю пример в свой вопрос. – vicco

+0

см. Обновленный ответ. просто выполните сериализацию слоя/пакета и получите доступ к любому из байтов как 'str (pkt) [1]', чтобы получить атрибут ascii или 'ord (str (pkt) [1])', чтобы получить значение. все остальное - всего лишь вопрос представления. – tintin

+0

Да, это то, что мне нужно. – vicco