通过发送带有scapy的ARP请求并捕获响应来扫描本地网络的正确方法是什么?

时间:2019-06-01 23:59:04

标签: python-3.x pip scapy

我想制作一个网络扫描仪,将ARP请求发送到ff:ff:ff:ff:ff:ff:ff的广播mac地址。 我的书面代码从局域网中存在的所有设备获得响应,但是当我再次运行它时,与第一次扫描相比,它总是向我显示更少的设备。

def check_arping(ip):
  arp_request = scapy.ARP(pdst = ip)
broadcast = scapy.Ether(dst = "ff:ff:ff:ff:ff:ff")
arp_request_broadcast = broadcast / arp_request
answered_list = scapy.srp(arp_request_broadcast, timeout = 1, verbose = False)[0]
clients_list = []

for eachelement in answered_list:
  client_dict = {
    "IP": eachelement[1].psrc,
    "MAC": eachelement[1].hwsrc
  }
clients_list.append(client_dict)
return clients_list

1 个答案:

答案 0 :(得分:1)

您的代码似乎正确。

ARP结果变化很大。实际上,出于安全原因,某些设备(例如,大多数Apple设备)不会回复广播的请求或注册免费的ARP(仅在需要时回复它们)。并非所有设备都始终可以进行扫描,从而导致扫描结果不同。

您可以做什么:

  • 使用超时执行多次扫描,并对结果求和
  • 执行被动ARP扫描(需要更长的时间):在网络上嗅探其他客户端之间的ARP数据包,并在看到的每个数据包上注册客户端
  • 保留您当前的代码:-)