我目前正在使用scapy发送数据包,我遇到了一个奇怪的问题。当我这样创建一个数据包时:
pack = IP(dst="127.0.0.1", id=local_ID)/UDP()/chunk
然后将该数据包转换为字符串(因此我可以通过套接字发送)
sendPack = str(pack)
sendPack的结果是错误的。
例如,在我的测试文件中,我有数字1-8000这样订购
1
2
3
...
然后,当我print("SEND_PACK: "+sendPack)
它产生以下结果:
E
2
3
...
除E
我无法理解E
的来源或含义。
值得注意的是,我已经验证pack
包含正确的数据,并且无论测试文件的第一行是什么,输出的第一行始终是E
谢谢!
答案 0 :(得分:1)
对于那些感兴趣的人,我通过执行以下操作来解决问题:
如上所述,E是我打印数据包的结果,而不是它的内容。为了访问我想要的内容,我必须执行以下操作:
sendPack = pack[UDP].load #Get the packet's load at the UDP layer
id = pack[IP].ID #Get the ID at the IP layer
Scapy的文档很少,所以我没有意识到我可以通过这种方式访问每个数据包的各个字段。
答案 1 :(得分:0)
首先,您正在打印数据包,而不是UDP数据报的内容。 IPv4数据包的前两个字段是版本和IHL,默认情况下,Scapy中的值分别为4(对于IP版本4)和5(32个字的5个字)。如果你把它放在十六进制的一个字节上,这就是45,这是ascii中的字母“E”。这就是为什么你总是将E视为字符串的第一个字节。
如果您想查看数据包中的内容,则应使用Scapy的show()
函数:sendPack.show()
。
其次,您可以使用Scapy的send()
函数发送您的数据包,而无需自己打扰套接字:send(sendPack)