Я работаю над PCAP в python и использую dpkt для его чтения. Данные в файле PCAP Linux Cooked Capture, SLL для друзей. Это пример пакета , как видно из Wireshark:
Frame 3: 578 bytes on wire (4624 bits), 578 bytes captured (4624 bits)
Linux cooked capture
Packet type: Unicast to another host (3)
Link-layer address type: 1
Link-layer address length: 6
Source: VMware_ZZ:ZZ:ZZ (ZZ:ZZ:ZZ:ZZ:ZZ:ZZ)
Unused: 0000
Protocol: IPv4 (0x0800)
Internet Protocol Version 4, Src: XX.X.XX.XX, Dst: YYY.YY.YYY.YYY
Transmission Control Protocol, Src Port: 65382, Dst Port: 443, Seq: 1, Ack: 1, Len: 522
Transport Layer Security
Это код , который я использую для получения данных TCP:
import dpkt
pcap_path = 'example-packet.pcap'
with open(pcap_path, 'rb') as fp:
try:
capture = dpkt.pcap.Reader(fp)
except ValueError as e:
raise Exception("Wrong file: %s" % e)
for timestamp, buf in capture:
eth = dpkt.sll.SLL(buf)
print("Ethernet: ", eth)
ip = eth.data
print("IP: ", ip)
tcp = ip.data # <-- This is line 15, for error reference
print("TCP: ", tcp)
и это тот код output , который имеет байт-код, но это нормально, как и , так как остальная часть программы не заботится, и мне не нужно сделайте его читаемым человеком:
Ethernet: b'\x00\x03\x00\x01\x00\x06\x00PV\x9auT\x00\x00\x08\x00E\x00\x05\x8cT3@\x00...
IP: b'E\x00\x05\x8cT3@\x00\x80\x06O\x1f\xac\x1f\xaed\xc6\x8f1\x06\x01\xbb%\x7f\xccz...
TCP: b'\x01\xbb%\x7f\xccz\xdf\x9d\xe5\xbe\xb98\x80\x10\x01\xfd\x047\x00\x00\x01\x01...
Теперь, выпуск . Я перехожу на другой PCAP, все еще Linux Cooked Capture, но у этого есть IP через 802.1Q VLAN . Итак, у нас есть проблемный пакет :
Frame 11: 577 bytes on wire (4616 bits), 577 bytes captured (4616 bits)
Linux cooked capture
Packet type: Unicast to another host (3)
Link-layer address type: 1
Link-layer address length: 6
Source: Cisco_ZZ:ZZ:ZZ (ZZ:ZZ:ZZ:ZZ:ZZ:ZZ)
Unused: 0000
Protocol: 802.1Q Virtual LAN (0x8100)
802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 1328
000. .... .... .... = Priority: Best Effort (default) (0)
...0 .... .... .... = DEI: Ineligible
.... 0101 0011 0000 = ID: 1328
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: XXX.XX.XXX.XX, Dst: YY.YYY.YYY.YY
Transmission Control Protocol, Src Port: 54545, Dst Port: 443, Seq: 1, Ack: 1, Len: 517
Transport Layer Security
, но если я запускаю тот же код , это будет output , я получу:
Traceback (most recent call last):
File "myproject.py", line 15, in <module>
tcp = ip.data
AttributeError: 'bytes' object has no attribute 'data'
Ethernet: b'\x00\x03\x00\x01\x00\x06\x00PV\xa7(\x93\x00\x00\x81\x00\x050\x08\x00E\x00\x00...
IP: b'\x050\x08\x00E\x00\x00\xb2\xba\xd6@\x004\x06y\xf7_\xf9H \xac\x15\xbdI...
Теперь, я полагаю, проблема заключается в том, что эти 4 байта 802.1Q добавляют в пакет: eth.data читается как байты, так как заголовок IP не распознается, поэтому, когда я go и делаю У ip.data, как сказано, нет атрибута «данные». Но я не знаю, как обойти эту проблему. Был ли это еще один захват, я знаю, что dpkt имеет класс dpkt.ethe rnet .VLANTag8021Q, но это не работает с Linux Cooked Capture, насколько я пытался. Я могу рассмотреть возможность перехода в библиотеку, отличную от dpkt, но я бы действительно предпочел не делать этого, потому что это часть рабочего проекта с довольно строгим сроком.
Итак, как мне получить доступ к данным TCP, когда они по IP, по 802.1Q, по SLL через dpkt?