Scapy定制ping包,主要包括以下四個階段:
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])
#!/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)
回答所涉及的環境:聯想天逸510S、Windows 10。
Scapy定制ping包,主要包括以下四個階段:
回答所涉及的環境:聯想天逸510S、Windows 10。