Python3基于Scapy实现局域网多线程ARP扫描
本文介绍如何使用Python3和Scapy库实现局域网内的自动多线程ARP扫描。通过提取C段IP地址,构造ARP请求包,并利用多线程技术并发扫描1到256的IP段。文章详细讲解了从基础扫描函数到结果美化、异常处理及最终完整代码的实现过程,帮助开发者快速掌握局域网设备发现技巧。
一、所需Python库
from scapy.all import * import threading
二、实现ip扫描
1.获取c段ip地址
在ARP()对象中包含了ip地址信息,我们可以从中提取出前3段IP地址。
ARP().show()

具体做法是从后往前查找最后一个点号的位置,得到最后一段IP的位数,然后用总长度减去最后一段的长度,即可截取并获取前3段IP地址。
tip=ARP().psrc
print(tip[:(len(tip)-tip[::-1].find('.'))])
2.arp扫描函数实现
接下来需要建立扫描函数,主要步骤包括构造ARP数据包、发送数据包、判断是否有响应以及输出相关信息。
def ScanIp(ip): pkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip) res=srp1(pkt,timeout=10,verbose=0) if res: print(res.psrc) print(res.hwsrc)
此外,还需要增加一个判断逻辑,检查返回的IP地址是否与我们要扫描的目标IP一致,同时加入异常处理机制以增强代码的健壮性。
def ScanIp(ip): pkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip) try: res=srp1(pkt,timeout=10,verbose=0) if res.psrc==ip: print(res.psrc) print(res.hwsrc) except: pass
为了提升用户体验,现在对输出结果进行美化处理,避免直接使用print语句导致输出格式混乱难看。
def ScanIp(ip):
pkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip)
try:
res=srp1(pkt,timeout=10,verbose=0)
if res.psrc==ip:
print('IP MAC')
print('[+]'+res.psrc+' '+res.hwsrc)
except:
pass
尝试调用一下
ScanIp('192.168.123.1')
经过美化后,现在的输出效果看起来更加清晰舒适。

3.多线程
现在我们只需要遍历C段IP地址,然后利用多线程技术并行执行扫描任务即可。
for i in range(1,256): ip=tip+str(i) Go=threading.Thread(target=ScanIp,args=(ip,)) Go.start()
然而查看运行效果发现,IP和MAC地址被多次输出,结果显得杂乱无章,不符合预期。

针对上述问题,我们将输出语句移动到函数外部的for循环上方,并增加对__name__的判断,从而完善所有功能逻辑。
from scapy.all import *
import threading
tip=ARP().psrc
tip=tip[:(len(tip)-tip[::-1].find('.'))]
def ScanIp(ip):
pkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip)
try:
res=srp1(pkt,timeout=10,verbose=0)
if res.psrc==ip:
print('[+]'+res.psrc+' '+res.hwsrc)
except:
pass
if __name__=='__main__':
print('IP MAC')
for i in range(1,256):
ip=tip+str(i)
Go=threading.Thread(target=ScanIp,args=(ip,))
Go.start()
运行效果

到此这篇关于Python3利用scapy局域网实现自动多线程arp扫描功能的文章就介绍到这了,更多相关Python scapy实现arp扫描内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









