介绍
这篇文章给大家介绍如何在python使用scapy模块实现一个ARP扫描功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
包的构造:
def scapy_arp_one (ip_address,队列=None):=,Packet 醚(dst=& # 39; FF: FF: FF: FF: FF: FF # 39;),/, ARP (op=1, hwdst=& # 39; 00:00:00:00:00:00: & # 39;,, pdst=ip_address)
请求包的发送:
arp =, srp(包,超时=0.2,,verbose=False)
返回包的接收
试题: reply_list 才能=,arp [0] r if 才能;queue  is 没有: ,,return reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;】 其他的才能: ,,queue.out (ip_address, reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;))) ,除了: 返回才能
这里采用队列的模式,主要是为了后面多进程同时发送做准备,涉及到ARP包的接受。这里我简单描述一下ARP包接受的情况,当我们发送ARP广播包的之后,我们就会接受到一个返回包,所以正确的情况就是,一个发送包一个接收包,一个发送包一个接收包,所以这里采用队列的方式,一个一个IP地址的接收,并使用列表进行存储,然后过滤ARP把内容,接收ARP中的硬件MAC地址
完整代码:
# !/usr/bin/env python3 #,- *安康;编码:utf-8 - * #,作者:Ameng, jlx-love.com 得到scapy.all import * import 系统 def scapy_arp_one (ip_address,队列=None):=,Packet 醚(dst=& # 39; FF: FF: FF: FF: FF: FF # 39;),/, ARP (op=1, hwdst=& # 39; 00:00:00:00:00:00: & # 39;,, pdst=ip_address)=,,arp  srp(包,超时=0.2,,verbose=False) ,试一试: reply_list 才能=,arp [0] r if 才能;queue  is 没有: ,,return reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;】 其他的才能: ,,queue.out (ip_address, reply_list [0] [1] .getlayer (ARP) .fields [& # 39; hwsrc& # 39;))) ,除了: ,返回 if __name__ ==, & # 39; __main__ # 39;: ,scapy_arp_one (sys.argv [1])
进一步完善
那么既然我们已经了解了使用ARP进行基本的发包和收包,那么我们接下来就来编写一个能够扫描整个网段的ARP检测
理一下思路,首先,我们需要将ip地址编程一个网段中的所有ip,可以借助ipaddress模块实现,其次我们知道我们接收响应包是一对的,所以我们可以从一对一对的响应包中接收我们需要的目标ip和MAC源地址,其次就是优化代码,输出结果,这里我不再采用sys模块进行传参,而是采用一个新的模块optparse,具体使用方法可以百度百科
完整代码:
# !/usr/bin/env python3 #,- *安康;编码:utf-8 - * #,作者:Ameng, jlx-love.com import 时间 得到scapy.all import * import ipaddress import optparse def scapy_arp_scan(网络,ifname):=,,net  ipaddress.ip_network(网络)=,ip_addr [] ,for ip 净拷贝: ip 才能=,str (ip) ip_addr.append才能(ip) ,time . sleep (1)=,Packet 醚(dst=& # 39; FF: FF: FF: FF: FF: FF # 39;)/ARP (op=1, hwdst=& # 39; 00:00:00:00:00:00& # 39;,, pdst=ip_addr)=,,arp  srp(包,iface =, ifname,, timeout =, 1, verbose =,假)=,arp, arp_list  [0] r=,IP_MAC_LIST [] ,for n 拷贝范围(len (arp_list)):,, 时间=IP 才能;arp_list [n] [1] [1] .fields [& # 39; psrc& # 39;】 时间=MAC 才能;arp_list [n] [1] [1] .fields [& # 39; hwsrc& # 39;】 IP_MAC 才能=,(IP, MAC) IP_MAC_LIST.append才能(IP_MAC) return IP_MAC_LIST if __name__ ==, & # 39; __main__ # 39;:=,,t1  time.time ()=,,parser  optparse.OptionParser(& # 39;用法:\ n python3 scapy_arp_scan.py ——network 扫描网段,——ifname 网卡名称& # 39;) ,parser.add_option(& # 39;——网络# 39;,,dest =, & # 39;网络# 39;,,type =, & # 39;字符串# 39;,,help =, & # 39;扫描网段& # 39;) ,parser.add_option (& # 39;——ifname& # 39;,, dest =, & # 39; ifname& # 39;,, type =, & # 39;字符串# 39;,,help =, & # 39;网卡名称& # 39;) ,(选项,,args),=, parser.parse_args ()=,network  options.network=,ifname  options.ifname ,if network ==, None 或是ifname ==,没有: ,打印(parser.usage) ,其他的: active_ip_mac 才能=,scapy_arp_scan(网络,ifname) 打印才能(& # 39;存活的IP地址及对应麦克:& # 39;) for 才能,ip, mac 拷贝active_ip_mac: ,才能打印(ip, mac)=,,t2  time.time () ,print(& # 39;所用时间为:{}& # 39;.format (int (t2 ,安康,t1)))如何在python使用scapy模块实现一个ARP扫描功能