创建格式不正确的以太帧?

4 投票
1 回答
1491 浏览
提问于 2025-04-29 14:19

我本以为这应该很简单,但我就是搞不定。

我想用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()这一层,而不导致包格式错误呢?

enter image description here

暂无标签

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超套接字。

撰写回答