- 先抑制scapy导入所出现的报错,然后导入程序中所需要的所有数据包。
from scapy.all import * from random import randint def ping_once(host): #随机产生一个1-65535的IP的id位 ip_id=randint(1,65535) #随机产生一个1-65535的icmp的id位 icmp_id=randint(1,65535) #随机产生一个1-65535的icmp的序列号 icmp_seq=randint(1,65535)
- 使用命令铸造数据包
packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit'
- 把铸造的数据包进行发送。
ping=sr1(packet,timeout=2,verbose=False) #如果收到回复则代表ping成功,成功就以退出码3退出(便于后续用来判断此进程是否成功) if ping: os._exit(3) if __name__ == '__main__': ping_once(sys.argv[1])
- 最后实现ping扫描
#!/usr/bin/python3.4 # _*_ coding=utf-8 _*_ import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) import ipaddress import time import multiprocessing from random import randint from scapy.all import * #实现ping扫描的函数 def ping_once(host): ip_id=randint(1,65535) icmp_id=randint(1,65535) icmp_seq=randint(1,65535) packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit' ping=sr1(packet,timeout=2,verbose=False) if ping: os._exit(3) #使用多进程连续调用ping_once函数,实现ping_scan def ping_scan(network): #此模块可以将一个网络转换成一个个ip地址 net=ipaddress.ip_network(network) ip_processes={} for ip in net: #读取网络中的每一个IP地址,使用str将其转换成字符串 ip_addr=str(ip) #开启多进程,使用ping_once这个函数扫描ip_addr这个地址 ping=multiprocessing.Process(target=ping_once,args=(ip_addr,)) #开启这个进程 ping.start() #产生ip与进程对应的字典 ip_processes[ip_addr]=ping ip_list=[] for ip,process in ip_addresses.items(): if process.exitcode==3: ip_list.append(ip) else: process.terminate() return sorted(ip_list) if __name__ == '__main__': import time t1=time.time() active_ip=ping_scan(sys/argv[1]) print("活动IP地址如下:") for ip in active_ip: print(ip) t2=time.time() print(t2-t1)
Scapy定制ping包,主要包括以下四个阶段:
- 先抑制scapy导入所出现的报错,然后导入程序中所需要的所有数据包。
from scapy.all import * from random import randint def ping_once(host): #随机产生一个1-65535的IP的id位 ip_id=randint(1,65535) #随机产生一个1-65535的icmp的id位 icmp_id=randint(1,65535) #随机产生一个1-65535的icmp的序列号 icmp_seq=randint(1,65535)
- 使用命令铸造数据包
packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit'
- 把铸造的数据包进行发送。
ping=sr1(packet,timeout=2,verbose=False) #如果收到回复则代表ping成功,成功就以退出码3退出(便于后续用来判断此进程是否成功) if ping: os._exit(3) if __name__ == '__main__': ping_once(sys.argv[1])
- 最后实现ping扫描
#!/usr/bin/python3.4 # _*_ coding=utf-8 _*_ import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) import ipaddress import time import multiprocessing from random import randint from scapy.all import * #实现ping扫描的函数 def ping_once(host): ip_id=randint(1,65535) icmp_id=randint(1,65535) icmp_seq=randint(1,65535) packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit' ping=sr1(packet,timeout=2,verbose=False) if ping: os._exit(3) #使用多进程连续调用ping_once函数,实现ping_scan def ping_scan(network): #此模块可以将一个网络转换成一个个ip地址 net=ipaddress.ip_network(network) ip_processes={} for ip in net: #读取网络中的每一个IP地址,使用str将其转换成字符串 ip_addr=str(ip) #开启多进程,使用ping_once这个函数扫描ip_addr这个地址 ping=multiprocessing.Process(target=ping_once,args=(ip_addr,)) #开启这个进程 ping.start() #产生ip与进程对应的字典 ip_processes[ip_addr]=ping ip_list=[] for ip,process in ip_addresses.items(): if process.exitcode==3: ip_list.append(ip) else: process.terminate() return sorted(ip_list) if __name__ == '__main__': import time t1=time.time() active_ip=ping_scan(sys/argv[1]) print("活动IP地址如下:") for ip in active_ip: print(ip) t2=time.time() print(t2-t1)
推荐文章