将scapy数据包转换为字符串会产生E?

时间:2016-06-16 19:49:04

标签: python string sockets scapy

我目前正在使用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

谢谢!

2 个答案:

答案 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的文档很少,所以我没有意识到我可以通过这种方式访问​​每个数据包的各个字段。

此处where I found this fix

答案 1 :(得分:0)

首先,您正在打印数据包,而不是UDP数据报的内容。 IPv4数据包的前两个字段是版本和IHL,默认情况下,Scapy中的值分别为4(对于IP版本4)和5(32个字的5个字)。如果你把它放在十六进制的一个字节上,这就是45,这是ascii中的字母“E”。这就是为什么你总是将E视为字符串的第一个字节。

如果您想查看数据包中的内容,则应使用Scapy的show()函数:sendPack.show()

其次,您可以使用Scapy的send()函数发送您的数据包,而无需自己打扰套接字:send(sendPack)