要实现这个功能,需要使用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")

注意,这个代码只能在本地网络中使用,如果要在公共网络中使用,需要考虑安全性问题,防止被攻击者利用

如何用Python代码实现当接收到广播时在不清楚对方的IP情况下只能查询ARP表如何判断对方是否为正常主机并且如何确认对方的MAC地址是真的而不是伪造的

原文地址: https://www.cveoy.top/t/topic/fyO4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录