python - 从 UDP 中刮掉 8 个字节的 scapy 有效负载
问题描述
我正在使用 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 层。
您可以通过查看以下内容在本地重现此内容(如果您使用的是 Scapy < 2.4.0 ,则替换raw()
为) :强制 Scapy 创建它将在 newtork 上发送的字节,并告诉 Scapy 将字节分解为 IP 层。str()
IP(raw(packet))
raw()
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))
推荐阅读
- java - REST服务项目结构
- docker - 如何在 docker 容器中使用 gulp,以便前端构建过程在容器中进行?
- php - 未插入数据库的数据
- spring-security - Spring SAML 扩展,如何设置relayState?
- node.js - 从频道追溯获取用户加入/离开事件
- python - 从 R Studio 上的 Postgres 服务器下载 JSON 文件
- r - 如何在 R 中按组向量行求和?
- c# - nuget 包中的 Fsharp.Core 依赖项不会复制到 bin 目录
- r - 如何在至少 X 列中打印大于 N 的行?
- c# - 如何部署包括 .NET 文件的新程序