从 UDP 中删除 scapy payload 的 8 个字节
8 bytes scraped off scapy payload from UDP
我正在使用 scapy 发送 udp 数据包。我看到前 8 个字节从有效载荷中刮掉了。有什么原因吗?
payload = '{ "dcgdsfjfghtimec": ' + str(datetime.now().strftime('%M:%S.%f')) + ', "sequence": ' + str(sequenceNum)+'}'
packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(dport=5555)/Raw(load=json.dumps(payload))
接收端:
def packet_callback(packet):
if packet[UDP].payload:
pkt = str(packet[UDP].payload)
while True:
sniff(filter="dst port 5555", prn=packet_callback, store=0)
我正在服务器端观察负载:
(Pdb) p packet[UDP].payload
<DNS id=8827 qr=0 opcode=4 aa=0 tc=0 rd=0 ra=0 z=1 ad=0 cd=1 rcode=12 qdcount=8804 ancount=25447 nscount=25715 arcount=26218 qd='' an='' ns='' ar='' |<Raw load='fghtimec\": 33:44.120154, \"sequence\": 0}"' |>>
发送数据包后在客户端:
(Pdb) p packet
<IP frag=0 proto=udp src=10.0.0.1 dst=127.0.0.1 |<UDP dport=rplay |<Raw load='"{ \"dcgdsfjhtimec\": 32:49.187705, \"sequence\": 0}"' |>>>
恰好 8 个字节,从服务器端剥离..为什么?
任何想法都会很有帮助。
谢谢,
苏迪普
Scapy 的默认 UDP 端口值为 53,对于源和目标。这会导致目的地将有效负载的开头解释为 DNS()
层。所以字节没有丢失,它们只是被解释为(损坏的)DNS 层。
您可以通过查看 IP(raw(packet))
: raw()
forces 在本地重现(如果您使用的是 Scapy < 2.4.0,请将 raw()
替换为 str()
) Scapy 创建它将在 newtork 上发送的字节,并且 IP()
告诉 Scapy 将字节分解为 IP 层。
您可以 "fix" 通过使用不同的源端口(因为您已经更改了目标端口):packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(sport=12345, dport=5555)/Raw(load=json.dumps(payload))
.
作为旁注,在我看来你还有另一个(真实的,这个)问题:你可能不想 json.dumps()
字符串而是一个 Python 对象(用你的在当前代码中,您将数据编码为 JSON 两次,因为您使用的字符串已经进行了 JSON 编码):
payload = {"dcgdsfjfghtimec": datetime.now().strftime('%M:%S.%f'),
"sequence": sequenceNum}
packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(sport=12345, dport=5555)/Raw(load=json.dumps(payload))
我正在使用 scapy 发送 udp 数据包。我看到前 8 个字节从有效载荷中刮掉了。有什么原因吗?
payload = '{ "dcgdsfjfghtimec": ' + str(datetime.now().strftime('%M:%S.%f')) + ', "sequence": ' + str(sequenceNum)+'}'
packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(dport=5555)/Raw(load=json.dumps(payload))
接收端:
def packet_callback(packet):
if packet[UDP].payload:
pkt = str(packet[UDP].payload)
while True:
sniff(filter="dst port 5555", prn=packet_callback, store=0)
我正在服务器端观察负载:
(Pdb) p packet[UDP].payload
<DNS id=8827 qr=0 opcode=4 aa=0 tc=0 rd=0 ra=0 z=1 ad=0 cd=1 rcode=12 qdcount=8804 ancount=25447 nscount=25715 arcount=26218 qd='' an='' ns='' ar='' |<Raw load='fghtimec\": 33:44.120154, \"sequence\": 0}"' |>>
发送数据包后在客户端:
(Pdb) p packet
<IP frag=0 proto=udp src=10.0.0.1 dst=127.0.0.1 |<UDP dport=rplay |<Raw load='"{ \"dcgdsfjhtimec\": 32:49.187705, \"sequence\": 0}"' |>>>
恰好 8 个字节,从服务器端剥离..为什么?
任何想法都会很有帮助。
谢谢, 苏迪普
Scapy 的默认 UDP 端口值为 53,对于源和目标。这会导致目的地将有效负载的开头解释为 DNS()
层。所以字节没有丢失,它们只是被解释为(损坏的)DNS 层。
您可以通过查看 IP(raw(packet))
: raw()
forces 在本地重现(如果您使用的是 Scapy < 2.4.0,请将 raw()
替换为 str()
) Scapy 创建它将在 newtork 上发送的字节,并且 IP()
告诉 Scapy 将字节分解为 IP 层。
您可以 "fix" 通过使用不同的源端口(因为您已经更改了目标端口):packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(sport=12345, dport=5555)/Raw(load=json.dumps(payload))
.
作为旁注,在我看来你还有另一个(真实的,这个)问题:你可能不想 json.dumps()
字符串而是一个 Python 对象(用你的在当前代码中,您将数据编码为 JSON 两次,因为您使用的字符串已经进行了 JSON 编码):
payload = {"dcgdsfjfghtimec": datetime.now().strftime('%M:%S.%f'),
"sequence": sequenceNum}
packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(sport=12345, dport=5555)/Raw(load=json.dumps(payload))