使用 Python/Scapy 从 PCAP 获取第二层
Get second layer from PCAP with Python/Scapy
我正在尝试从 Python 中读取和枚举一个 pcap 文件,但是这样做时,即使存在第 2 层数据,我似乎也只能获取第 3 层数据:
这是我的代码:
import pprint
from scapy.all import *
target_cap = 'hello.pcap'
parser = PcapReader(root_dir + target_cap)
for i,p in enumerate(parser):
pkt = p.payload
pprint.pprint(pkt)
IE 输出:
<IP version=4L ihl=5L tos=0x0 len=52 id=12220 flags=DF frag=0L ttl=128 proto=tcp chksum=0x453a src=192.168.2.100 dst=192.168.2.25 options=[] |<TCP sport=sddp dport=mbap seq=1584390497 ack=1497344211 dataofs=5L reserved=0L flags=PA window=65325 chksum=0xe356 urgptr=0 options=[] |<Raw load='\x00\x00\x00\x00\x00\x06\xff\x01\x00\x00\x00\x01' |>>>
<IP version=4L ihl=5L tos=0x0 len=50 id=30949 flags= frag=0L ttl=64 proto=tcp chksum=0x7c13 src=192.168.2.25 dst=192.168.2.100 options=[] |<TCP sport=mbap dport=sddp seq=1497344211 ack=1584390509 dataofs=5L reserved=0L flags=PA window=4096 chksum=0xd17d urgptr=0 options=[] |<Raw load='\x00\x00\x00\x00\x00\x04\xff\x01\x01\x00' |>>>
<IP version=4L ihl=5L tos=0x0 len=40 id=12226 flags=DF frag=0L ttl=128 proto=tcp chksum=0x4540 src=192.168.2.100 dst=192.168.2.25 options=[] |<TCP sport=sddp dport=mbap seq=1584390509 ack=1497344221 dataofs=5L reserved=0L flags=A window=65315 chksum=0xe267 urgptr=0 |>>
<IP version=4L ihl=5L tos=0x0 len=52 id=12240 flags=DF frag=0L ttl=128 proto=tcp chksum=0x4526 src=192.168.2.100 dst=192.168.2.25 options=[] |<TCP sport=sddp dport=mbap seq=1584390509 ack=1497344221 dataofs=5L reserved=0L flags=PA window=65315 chksum=0xe34a urgptr=0 options=[] |<Raw load='\x00\x00\x00\x00\x00\x06\xff\x01\x00\x00\x00\x01' |>>>
<IP version=4L ihl=5L tos=0x0 len=40 id=30972 flags= frag=0L ttl=64 proto=tcp chksum=0x7c06 src=192.168.2.25 dst=192.168.2.100 options=[] |<TCP sport=mbap dport=sddp seq=1497344221 ack=1584390521 dataofs=5L reserved=0L flags=A window=4096 chksum=0xd17f urgptr=0 |<Padding load='\x00\x00\x00\x00\x00\x00' |>>>
在这种情况下,我只对第 2 层元数据感兴趣,我该如何获取它?
您的代码故意只打印数据包的有效负载,而不是 headers。这意味着您每次都打印第 N+1 层。
另外,与您的问题无关,您的示例程序中不需要 enumerate
。
试试这个:
for p in parser:
pprint.pprint(p)
如果您想检查数据包数据而不是仅仅打印它,那也很简单:
# Sample code to print IP/MAC relationships:
for p in parser:
if Ether in p and IP in p:
print p[Ether].dst, p[IP].dst
print p[Ether].src, p[IP].src
我正在尝试从 Python 中读取和枚举一个 pcap 文件,但是这样做时,即使存在第 2 层数据,我似乎也只能获取第 3 层数据:
这是我的代码:
import pprint
from scapy.all import *
target_cap = 'hello.pcap'
parser = PcapReader(root_dir + target_cap)
for i,p in enumerate(parser):
pkt = p.payload
pprint.pprint(pkt)
IE 输出:
<IP version=4L ihl=5L tos=0x0 len=52 id=12220 flags=DF frag=0L ttl=128 proto=tcp chksum=0x453a src=192.168.2.100 dst=192.168.2.25 options=[] |<TCP sport=sddp dport=mbap seq=1584390497 ack=1497344211 dataofs=5L reserved=0L flags=PA window=65325 chksum=0xe356 urgptr=0 options=[] |<Raw load='\x00\x00\x00\x00\x00\x06\xff\x01\x00\x00\x00\x01' |>>>
<IP version=4L ihl=5L tos=0x0 len=50 id=30949 flags= frag=0L ttl=64 proto=tcp chksum=0x7c13 src=192.168.2.25 dst=192.168.2.100 options=[] |<TCP sport=mbap dport=sddp seq=1497344211 ack=1584390509 dataofs=5L reserved=0L flags=PA window=4096 chksum=0xd17d urgptr=0 options=[] |<Raw load='\x00\x00\x00\x00\x00\x04\xff\x01\x01\x00' |>>>
<IP version=4L ihl=5L tos=0x0 len=40 id=12226 flags=DF frag=0L ttl=128 proto=tcp chksum=0x4540 src=192.168.2.100 dst=192.168.2.25 options=[] |<TCP sport=sddp dport=mbap seq=1584390509 ack=1497344221 dataofs=5L reserved=0L flags=A window=65315 chksum=0xe267 urgptr=0 |>>
<IP version=4L ihl=5L tos=0x0 len=52 id=12240 flags=DF frag=0L ttl=128 proto=tcp chksum=0x4526 src=192.168.2.100 dst=192.168.2.25 options=[] |<TCP sport=sddp dport=mbap seq=1584390509 ack=1497344221 dataofs=5L reserved=0L flags=PA window=65315 chksum=0xe34a urgptr=0 options=[] |<Raw load='\x00\x00\x00\x00\x00\x06\xff\x01\x00\x00\x00\x01' |>>>
<IP version=4L ihl=5L tos=0x0 len=40 id=30972 flags= frag=0L ttl=64 proto=tcp chksum=0x7c06 src=192.168.2.25 dst=192.168.2.100 options=[] |<TCP sport=mbap dport=sddp seq=1497344221 ack=1584390521 dataofs=5L reserved=0L flags=A window=4096 chksum=0xd17f urgptr=0 |<Padding load='\x00\x00\x00\x00\x00\x00' |>>>
在这种情况下,我只对第 2 层元数据感兴趣,我该如何获取它?
您的代码故意只打印数据包的有效负载,而不是 headers。这意味着您每次都打印第 N+1 层。
另外,与您的问题无关,您的示例程序中不需要 enumerate
。
试试这个:
for p in parser:
pprint.pprint(p)
如果您想检查数据包数据而不是仅仅打印它,那也很简单:
# Sample code to print IP/MAC relationships:
for p in parser:
if Ether in p and IP in p:
print p[Ether].dst, p[IP].dst
print p[Ether].src, p[IP].src