如何用Python代码实现当接收到广播时在不清楚对方的IP情况下只能查询ARP表如何判断对方是否为正常主机并且如何确认对方的MAC地址是真的而不是伪造的
要实现这个功能,需要使用Python的socket和scapy库。
首先,使用socket库创建一个UDP套接字,绑定到本地的IP地址和一个随机的端口号上,以便接收广播消息。然后,使用scapy库发送一个ARP请求,查询本地网络中所有设备的MAC地址和IP地址。接收到广播消息后,从ARP表中查找对应的IP地址,如果找到了,就可以判断对方是正常主机。然后,再发送一个ARP请求,查询对方的MAC地址,如果返回的MAC地址和ARP表中的一致,就可以确认对方的MAC地址是真实的。
下面是代码示例:
import socket
from scapy.all import *
# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', 12345))
# 发送ARP请求,查询本地网络中所有设备的MAC地址和IP地址
ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.0.0/24"), timeout=2)
# 处理收到的广播消息
while True:
data, addr = sock.recvfrom(1024)
print(f"Received broadcast message from {addr[0]}:{addr[1]}")
# 在ARP表中查找对应的IP地址
for snd, rcv in ans:
if rcv.psrc == addr[0]:
print(f"{addr[0]} is a valid host")
# 发送ARP请求,查询对方的MAC地址
ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=addr[0]), timeout=2)
for snd, rcv in ans:
if rcv.psrc == addr[0] and rcv.hwsrc == rcv.hwsrc:
print(f"{addr[0]}'s MAC address is {rcv.hwsrc}")
break
else:
print(f"{addr[0]}'s MAC address is not valid")
break
else:
print(f"{addr[0]} is not a valid host")
注意,这个代码只能在本地网络中使用,如果要在公共网络中使用,需要考虑安全性问题,防止被攻击者利用
原文地址: https://www.cveoy.top/t/topic/fyO4 著作权归作者所有。请勿转载和采集!