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)