我正在使用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个字节,从服务器端剥离......为什么?
任何想法都会非常有用。
谢谢, Sudip
答案 0 :(得分:1)
对于源和目标,Scapy的默认UDP端口值为53。这会导致目标将有效负载的开头解释为DNS()
层。因此,字节不会丢失,它们只会被解释为(损坏的)DNS层。
您可以在本地重现此内容(如果您使用Scapy&lt; 2.4.0),请raw()
替换str()
,查看IP(raw(packet))
:raw()
部队Scapy创建它将在newtork上发送的字节,IP()
告诉Scapy将字节解析为IP层。
您可以通过使用其他源端口“修复”它(因为您已经更改了目标端口):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))