Scapy向局域网发送ARP包运行一段时间后报IndexError错误的原因
报错根本原因拆解
- 报错触发的直接逻辑非常明确:你编写的
get_mac函数在向目标IP发送ARP请求查询MAC地址时,没有收到任何有效的ARP应答包,Scapy返回的应答集合answered是空列表,代码直接取索引0位置的元素,就触发了IndexError: list index out of range。 - 为什么程序初期能正常运行、发了28个报文之后才崩溃?核心是循环逻辑和外部环境共同作用的结果:
- 你的
spoof函数每执行一次,都会重新调用get_mac发送ARP请求查询目标MAC:一开始网络通畅时,目标主机会正常响应ARP请求,所以能顺利拿到MAC发送欺骗包;运行过程中只要出现一次ARP请求丢包、目标不响应的情况,因为代码没有做任何空值判断,就会直接终止 - 长时间高频反复发送ARP请求+ARP欺骗报文,很容易触发目标主机、局域网的安全拦截机制:比如目标主机开启ARP防火墙后,检测到异常ARP流量就会直接丢弃后续来自你主机的所有ARP请求,不再返回应答,自然就查不到对应MAC
- 运行过程中如果出现网络链路波动,比如目标主机临时断网、休眠、原有IP地址被其他设备占用,目标本身就不会响应你发的ARP查询请求,也会直接触发这个报错
- 你的
- 代码的逻辑缺陷进一步放大了这个问题:整个流程没有对ARP查询的结果做非空校验,也没有对查询超时、无应答的场景做兜底处理,哪怕只是一次偶发的网络丢包,都会导致整个无限循环的程序直接终止。
内容的提问来源于stack exchange,提问作者angelo
相关产品推荐
相关产品推荐

