Scapy - 如何剖析以太网尾部字段
Scapy - How to Dissect an Ethernet Trailer field
我正在使用 F5 Networks Big-IP 产品,这些产品附加了自定义以太网 II 尾部帧以用于调试目的。我正在尝试使用 Scapy 为这个预告片绑定一个新层,但我无法这样做。
我可以在 Padding 字段中看到感兴趣的有效负载,但使用 bind_layers 无法正确剖析所需的 Padding 部分。
class MyEthTrailer(Packet):
name = "Ethernet Trailer"
fields_desc = [ ####Fields Mapping Section ]
def dissect(self, s):
self.payl,self.pad = self.extract_padding(s)
s = self.do_dissect(self.pad)
我考虑的一个解决方案是创建一个新的以太网替代品 class(或超载),然后我可以引用典型的以太网有效负载和我的新预告片。但我不是超级 Python/scapy 程序员,我不确定这是否是最佳选择。
这就是 Scapy 当前在我应用 bind_layers(TCP,MyEthTrailer) 后映射我的数据包的方式。我应该解析的信息在 Padding class
<Ether dst=00:00:00:00:00:00 src=00:00:00:00:00:01 type=0x8100 |<Dot1Q prio=0L id=0L vlan=01L type=0x800 |<IP version=4L ihl=5L tos=0x0 len=67 id=1 flags=DF frag=0L ttl=255 proto=tcp chksum=0x01 src=10.0.0.1 dst=10.0.1.1 options=[] |<TCP sport=1111 dport=https seq=1 ack=1 dataofs=5L reserved=0L flags=PA window=4380 chksum=0xb718 urgptr=0 options=[] |<MyEthTrailer |<Padding load='\xPayload of MyEtherTrailer' |>>>>>>
[UPDATE-1]
我可以通过调用强制解码 TCP SYN 数据包:
packet[TCP].decode_payload_as(MyEthTrailer)
但是,bind_layers 方法似乎不会自动工作,并且这不适用于更复杂的数据包,因为它混淆了 TCP 填充和 MyEthTrailer 负载。
[UPDATE-2]
我让它部分工作了,但每个数据包都需要正确投射,然后我才能读取预告片有效负载并对其进行解码。例如,如果数据包是 TCP/DNS/MyEthTrailer,这将起作用。如果我不知道是DNS,而且设置不当,它仍然混在TCP payload和Padding中。
感谢您的帮助。
我能够通过重载我的新自定义 class MyEthTrailer 的 pre_dissect 函数来做到这一点。我尝试解析最后一层有 Padding 的 payload,并验证它是否有正确的长度。
这是两件事的句柄:
第 1 部分 DISSECT 部分
class MyEthTrailer(Packet):
def pre_dissect(self,s):
verify_if_payload_is_mine_and_assign_fields()
PART 2 手动强制载荷解码
_debug=True
if re.match(r'F5\-Pseudo-\pkt.+tcpdump',str(packets[0][Raw])):
if re.match(r'.+CMD\:.+\-s0.+VER\:.+',str(packets[0][Raw])): has_F5_trailer=True
if re.match(r'.+CMD\:.+\:nnn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=3
elif re.match(r'.+CMD\:.+\:nn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=2
elif re.match(r'.+CMD\:.+\:n.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=1
else:
if _debug: print "No F5 EthTrailer F5_Noise_level visible from packets[0]"
if has_F5_trailer:
#Skip the F5 first packet, which only contains the info.
for pk in packets[1:]:
try:
if isinstance(pk.lastlayer(),Padding):
pk.lastlayer().underlayer.decode_payload_as(MyEthTrailer)
except:
#Errorhandling
我会 post Github 的整个解决方案,如果有人感兴趣,我会在这里更新。
我正在使用 F5 Networks Big-IP 产品,这些产品附加了自定义以太网 II 尾部帧以用于调试目的。我正在尝试使用 Scapy 为这个预告片绑定一个新层,但我无法这样做。
我可以在 Padding 字段中看到感兴趣的有效负载,但使用 bind_layers 无法正确剖析所需的 Padding 部分。
class MyEthTrailer(Packet):
name = "Ethernet Trailer"
fields_desc = [ ####Fields Mapping Section ]
def dissect(self, s):
self.payl,self.pad = self.extract_padding(s)
s = self.do_dissect(self.pad)
我考虑的一个解决方案是创建一个新的以太网替代品 class(或超载),然后我可以引用典型的以太网有效负载和我的新预告片。但我不是超级 Python/scapy 程序员,我不确定这是否是最佳选择。
这就是 Scapy 当前在我应用 bind_layers(TCP,MyEthTrailer) 后映射我的数据包的方式。我应该解析的信息在 Padding class
<Ether dst=00:00:00:00:00:00 src=00:00:00:00:00:01 type=0x8100 |<Dot1Q prio=0L id=0L vlan=01L type=0x800 |<IP version=4L ihl=5L tos=0x0 len=67 id=1 flags=DF frag=0L ttl=255 proto=tcp chksum=0x01 src=10.0.0.1 dst=10.0.1.1 options=[] |<TCP sport=1111 dport=https seq=1 ack=1 dataofs=5L reserved=0L flags=PA window=4380 chksum=0xb718 urgptr=0 options=[] |<MyEthTrailer |<Padding load='\xPayload of MyEtherTrailer' |>>>>>>
[UPDATE-1]
我可以通过调用强制解码 TCP SYN 数据包:
packet[TCP].decode_payload_as(MyEthTrailer)
但是,bind_layers 方法似乎不会自动工作,并且这不适用于更复杂的数据包,因为它混淆了 TCP 填充和 MyEthTrailer 负载。
[UPDATE-2]
我让它部分工作了,但每个数据包都需要正确投射,然后我才能读取预告片有效负载并对其进行解码。例如,如果数据包是 TCP/DNS/MyEthTrailer,这将起作用。如果我不知道是DNS,而且设置不当,它仍然混在TCP payload和Padding中。
感谢您的帮助。
我能够通过重载我的新自定义 class MyEthTrailer 的 pre_dissect 函数来做到这一点。我尝试解析最后一层有 Padding 的 payload,并验证它是否有正确的长度。
这是两件事的句柄:
第 1 部分 DISSECT 部分class MyEthTrailer(Packet):
def pre_dissect(self,s):
verify_if_payload_is_mine_and_assign_fields()
PART 2 手动强制载荷解码
_debug=True
if re.match(r'F5\-Pseudo-\pkt.+tcpdump',str(packets[0][Raw])):
if re.match(r'.+CMD\:.+\-s0.+VER\:.+',str(packets[0][Raw])): has_F5_trailer=True
if re.match(r'.+CMD\:.+\:nnn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=3
elif re.match(r'.+CMD\:.+\:nn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=2
elif re.match(r'.+CMD\:.+\:n.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=1
else:
if _debug: print "No F5 EthTrailer F5_Noise_level visible from packets[0]"
if has_F5_trailer:
#Skip the F5 first packet, which only contains the info.
for pk in packets[1:]:
try:
if isinstance(pk.lastlayer(),Padding):
pk.lastlayer().underlayer.decode_payload_as(MyEthTrailer)
except:
#Errorhandling
我会 post Github 的整个解决方案,如果有人感兴趣,我会在这里更新。