本文将介绍如何使用 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')

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

Python 代码实现广播消息验证:如何判断对方主机真实性及MAC地址

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

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