序
接着上一篇博客继续说,填下坑…
使用 python 实现 获取与本机在同一局域网下的其他设备 IP和MAC的映射关系(Windows 下_S4n_v1的博客-CSDN博客
运行截图如下:
代码实现(附详细注释):
# 获取在通一个局域网下的所有主机的mac地址
from scapy.all import ARP, Ether, srp
# '192.168.202.1' 指示了要扫描的网络的子网地址 '/24' 表示子网掩码
# 扫描指定IP的整个子网 (范围是 192.168.202.1 - 192.168.202.255
target_ip = '192.168.202.1/24'
# 当然这里使用单个具体的ip地址也是可以的 也就是获得具体主机的mac地址
# target_ip = '192.168.202.107'
# 构造 arp 请求报文对象
arp = ARP(pdst=target_ip)
# 创建以太网广播包 使报文发送到广播地址
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
# 组装广播包和arp请求包
packet = ether/arp
# packet 创建完成后 使用srp函数发送构造好的数据包
# 返回收到的所有响应报文 存在response变量中
response = srp(packet, timeout=3)[0]
# 遍历每个报文中的IP和MAC地址 存储在字典中 然后添加到客户端列表clients中
clients = []
for sent, receieved in response:
clients.append({'ip': receieved.psrc, 'mac': receieved.hwsrc})
# 打印捕获到的IP和MAC
print("Available devices in the network:")
print("IP" + " "*18 + "MAC")
for client in clients:
print("{:16} {}".format(client['ip'], client['mac']))
这里就没实现自动获取当前IP地址了,需要自己去设置 target_ip
。上一篇博客(贴在最上面的链接)有实现,直接把那部分代码摘过来用就行。
踩坑
踩了些小坑,记录一下问题。
发包之后,收不到任何包,提示:
Begin emission: Finished sending 256 packets. Received 0 packets, got 0 answers, remaining 256 packets
解决方法:
0x01
网上一些博客说 可能是因为防火墙拦截了回传的数据包,导致收不到包。可以在 控制面板 -- 防火墙 -- 启动或关闭防火墙
关闭防火墙。(测试完一定要记得重新启用防火墙!!
但是这个解决办法在我这没任何效果…
0x02
后来想用 wireshark
抓个包看看发包收包情况,误打误撞更新了 Npcap
(一般安装 wireshark 的时候都会顺带安装的),然后突然就可以了。(Npcap 是一个网络数据包截获软件
另外友情提醒一下,如图,安装 Npcap 的时候不要勾选第一项!不然打开 wireshark 的时候会拼命弹窗… 网上的安装教程基本上都是把这项勾上的,狠狠踩坑,我因此又重装了一遍这软件。