Scapy伪造报文报错:AttributeError: 'bytearray'对象无__rdiv__属性
问题解答
1. 修复 AttributeError: 'bytearray' object has no attribute '__rdiv__' 错误
你碰到的这个报错,本质是Scapy的/分层操作符不支持直接处理bytearray类型。Scapy的分层语法(IP()/TCP()/载荷)要求末尾的载荷必须是**字节串(bytes)**或者Scapy可识别的协议层对象,bytearray不在这个范围内。
给你两个简单的修复方案:
- 直接把
bytearray转换成bytes类型,用bytes(b)即可 - 用Scapy的
Raw()层包裹字节数据,这是更贴合Scapy规范的做法
修改后的代码示例:
b = bytearray([0xff, 0xff]) def spoof(src_ip, src_port, dest_ip, dest_port): global b # 方案1:转成bytes直接作为载荷 spoofed_packet = IP(src=src_ip, dst=dest_ip) / TCP(sport=src_port, dport=dest_port) / bytes(b) # 方案2:用Raw层封装载荷(更推荐) # spoofed_packet = IP(src=src_ip, dst=dest_ip) / TCP(sport=src_port, dport=dest_port) / Raw(load=bytes(b)) send(spoofed_packet)
StackOverflow上的示例没用到bytearray,就是因为大多会直接用bytes或Raw()传递载荷,避开类型兼容问题。
2. 解决Scapy频繁弹出PowerShell的问题
在Windows环境下,Scapy默认的send()函数会调用系统PowerShell执行发包命令,这就是弹窗的原因。你可以通过修改Scapy的套接字配置,强制它用原始套接字直接发包,跳过外部命令调用:
在代码开头添加以下配置:
from scapy.all import conf, L3RawSocket conf.L3socket = L3RawSocket
这样修改后,send()会直接通过原始套接字发送三层报文,不会再弹出PowerShell窗口。另外如果是发送二层以太网帧,记得用sendp()替代send(),也能避免这类外部调用问题。
内容的提问来源于stack exchange,提问作者Ayy
相关产品推荐
相关产品推荐

