Python3利用scapy局域网实现自动多线程arp扫描功能

1. 引言

本文将介绍如何使用Python的scapy库来实现自动多线程arp扫描功能,通过对局域网内的设备进行主动探测,获取设备的MAC地址和IP地址信息。我们将使用scapy库的功能,实现高效的ARP扫描,并通过多线程的方式加速扫描过程。

2. ARP 扫描原理

ARP(Address Resolution Protocol)是一种用于在IP网络中解析IP地址与MAC地址之间对应关系的协议。简单来说,ARP扫描就是通过发送ARP请求包,来获取目标设备的MAC地址和IP地址。

在扫描过程中,我们将局域网内的所有IP地址都依次发送ARP请求包,并等待对应的ARP响应包。通过对ARP响应包的解析,我们可以得到设备的MAC地址和IP地址。

3. 编写代码

3.1 导入必要的库和设置变量

首先,我们需要导入三个必要的Python库:scapy、threading和time。scapy用于发送ARP请求包和解析响应包,threading用于实现多线程,而time用于统计扫描所用的时间。

from scapy.all import *

import threading

import time

# 设置目标IP范围

target_ips = ['192.168.0.1', '192.168.0.2', '192.168.0.3']

# 设置全局变量,用于存储扫描结果

scan_results = []

在代码中,我们通过target_ips变量指定了目标IP范围。可以根据实际需求修改该列表的内容。

同时,我们创建了一个全局变量scan_results,用于存储扫描结果。

3.2 编写ARP扫描函数

接下来,我们将编写一个函数来执行ARP扫描。该函数接受一个IP地址作为参数,发送ARP请求包,并解析响应包,以获取设备的MAC地址和IP地址。

def arp_scan(target_ip):

arp_request = ARP(pdst=target_ip)

arp_response = sr1(arp_request, timeout=2, verbose=0)

if arp_response:

scan_results.append({'ip': arp_response.psrc, 'mac': arp_response.hwsrc})

在函数中,我们首先创建了一个ARP请求包,指定了目标IP地址。然后,使用sr1函数发送该包,并设置超时时间为2秒。

如果成功收到ARP响应包,则将设备的IP地址和MAC地址添加到scan_results列表中。

3.3 多线程执行扫描

接下来,我们将使用多线程的方式执行ARP扫描。对于每一个目标IP地址,我们希望创建一个线程来执行扫描函数。

def thread_scan(target_ips):

# 创建线程列表

threads = []

# 创建并启动线程

for target_ip in target_ips:

t = threading.Thread(target=arp_scan, args=(target_ip,))

threads.append(t)

t.start()

# 等待所有线程执行结束

for t in threads:

t.join()

在函数中,我们首先创建了一个线程列表threads。然后,对于每一个目标IP地址,创建一个线程,并将线程添加到threads列表中。

最后,我们分别调用线程的start方法来启动线程,以及调用线程的join方法来等待所有线程执行结束。

3.4 执行ARP扫描并输出结果

最后,在主程序中执行ARP扫描,并输出扫描结果。

if __name__ == "__main__":

start_time = time.time()

thread_scan(target_ips)

end_time = time.time()

scan_time = end_time - start_time

for result in scan_results:

print("IP: ", result['ip'])

print("MAC: ", result['mac'])

print()

print("Scan complete.")

print("Time taken: ", scan_time, "seconds")

在主程序中,我们首先记录开始时间。然后,调用thread_scan函数来执行ARP扫描。

完成扫描后,我们记录结束时间,并计算扫描所用的时间。最后,遍历scan_results列表,并输出每个设备的IP地址和MAC地址。

输出扫描结果时,我们使用了print函数。可以根据实际需求,将结果保存到文件中或进行其他处理。

4. 运行结果

运行上述代码,可以得到类似如下的输出结果:

IP: 192.168.0.1

MAC: 00:0c:29:51:28:55

IP: 192.168.0.2

MAC: 00:0c:29:3c:c7:b6

IP: 192.168.0.3

MAC: 00:0c:29:8a:a8:3a

Scan complete.

Time taken: 2.0036211013793945 seconds

输出结果中,我们可以看到每个设备的IP地址和MAC地址,以及整个扫描所用的时间。

5. 总结

本文介绍了如何使用Python的scapy库来实现自动多线程ARP扫描功能。通过发送ARP请求包并解析响应包,我们可以获取设备的MAC地址和IP地址信息。

通过使用多线程的方式,我们可以加速扫描过程,提高效率。同时,我们还对扫描结果进行输出,方便查看和使用。

希望本文能够帮助读者了解如何利用scapy库实现ARP扫描,以及如何使用多线程来提高扫描效率。

后端开发标签