创建格式不正确的以太帧?
我本以为这应该很简单,但我就是搞不定。
我想用Python里的scapy发送一个伪造的ARP包,但在这个情况下,我还需要伪装源MAC地址(vmac、vip、rip都是有效的值)。
op = 1
who_has_router = Ether(src=vmac)/ARP(op=op,psrc=vip,pdst=rip,hwsrc=vmac)
send(who_has_router)
在Wireshark中,上面的包显示为格式错误的包,网络上的其他设备都忽略它。
如果我去掉Ether()
这一层,它就能正常工作(但这样就不能伪装源MAC地址,所以在这种情况下不够好):
# This works exactly as expected
op = 1
who_has_router = ARP(op=op,psrc=vip,pdst=rip,hwsrc=vmac)
send(who_has_router)
我该如何在Python/scapy中添加Ether()
这一层,而不导致包格式错误呢?
1 个回答
5
send
函数是用来发送第三层的数据包的,而你的数据包是第二层的。所以你应该使用sendp
函数。
想了解更多信息,可以查看scapy
的文档:
send()
函数会在第三层发送数据包。也就是说,它会为你处理路由和第二层的事情。而sendp()
函数则是在第二层工作。选择合适的接口和链接层协议就得靠你自己了。
官方API文档也提到这一点:
send(pkts, inter=0, loop=0, verbose=None)
在第三层发送数据包,使用
conf.L3socket
超套接字。
sendp(pkts, inter=0, loop=0, iface=None, iface hint=None, verbose=None)
在第二层发送数据包,使用
conf.L2socket
超套接字。