scapy 对 sr1() 使用错误的发件人 MAC 和 IP 地址

scapy 对 sr1() 使用错误的发件人 MAC 和 IP 地址

我的ARP request数据包是从 PyQt5 GUI 应用程序运行的线程发送的。

当我

  • 连接 WiFi
  • 启动应用程序
  • 发送数据包packet = ARP(op='who-has', pdst='192.168.1.1')
  • packet.show()输出:
###[ ARP ]### 
  hwtype    = 0x1
  ptype     = IPv4
  hwlen     = None
  plen      = None
  op        = who-has
  hwsrc     = ......:aa:bb:cc      <--- This is OK, the correct one (wlan0)
  psrc      = 192.168.1.112
  hwdst     = None
  pdst      = 192.168.1.1

sr1(packet)成功。

但当

  • 断开 WiFi
  • 启动应用程序
  • 连接 WiFi
  • 发送数据包packet = ARP(op='who-has', pdst='192.168.1.1')
  • packet.show()输出:
###[ ARP ]### 
  hwtype    = 0x1
  ptype     = IPv4
  hwlen     = None
  plen      = None
  op        = who-has
  hwsrc     = ......:19:b6:dd    <--- This is wrong one (eth0)
  psrc      = 0.0.0.0
  hwdst     = None
  pdst      = 192.168.1.1

sr1(packet)失败了。

请注意,hwsrc现在已更改为我的wired ethernet,其电缆已断开,并且psrc设置为0.0.0.0不是我的 WiFi IP。

事实上,我连接WiFi后,它并没有使用默认路由,而是使用了另一个接口而不是wlan0(尽管默认路由是通过wlan0)。

我的问题是:连接到 WiFi 后不应该scapy使用默认路由(即 wlan0)发送 ARP 请求?

如果我退出并重新启动应用程序并保持 WiFi 连接,它就可以正常工作。

现在我需要一个解决方案,尽管我在应用程序启动后连接 WiFi,以便从 wlan0 接口发送 ARP 请求。

答案1

Scapy 会自行制作数据包头,因此它还需要自行执行路由表查找。不幸的是,它只读取整个操作系统路由表启动时并且从那时起始终使用缓存的信息。您可以在中查看表格conf.route

conf.route.resync()每次切换连接时使用。

相关内容