怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能-創(chuàng)新互聯(lián)

怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的果洛州網(wǎng)站建設(shè)公司,果洛州接單;提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行果洛州網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

實(shí)現(xiàn)過(guò)程

1.首先我們應(yīng)該編寫(xiě)出能夠像單個(gè)IP發(fā)送ICMP包并接受回包的代碼


2.其次我們應(yīng)該開(kāi)啟多進(jìn)程,從而讓該腳本可以快速掃描整個(gè)網(wǎng)段的主機(jī)存活情況

單進(jìn)程發(fā)包


首先我們需要導(dǎo)入scapy模塊,這里要強(qiáng)調(diào)一下,scapy的v2版本的導(dǎo)入與別的模塊導(dǎo)入方式不同,需要特殊的書(shū)寫(xiě)方式,否則scapy模塊中的某些功能將無(wú)法使用

from scapy.all import *
from random import randint

接下來(lái)需要構(gòu)造我們的包,即我們要發(fā)送的ICMP包,首先了解一下scapy包的偽造

怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能

對(duì)于scapy我們可以直接輸入scapy進(jìn)入一個(gè)交互模式,其實(shí)這個(gè)交互模式本質(zhì)也還是python,我們來(lái)看一下包

怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能

讀者可以看看我構(gòu)造的這個(gè)包,我寫(xiě)了三個(gè)協(xié)議層,第一寫(xiě)其實(shí)是mac地址,如果我們只輸入Ether,那么就是默認(rèn)的結(jié)果,這里的mac就是默認(rèn)廣播形式,第二個(gè)我寫(xiě)的是IP,也就是IP層的設(shè)置,可以發(fā)現(xiàn)其中的一些已經(jīng)填寫(xiě)了默認(rèn)值,我們要設(shè)置的其實(shí)主要就的dst,即目的地址,當(dāng)然其他的想改一下也是可以的,比如說(shuō)把ttl生存周期改成128,這也是沒(méi)毛病的,第三個(gè)我寫(xiě)的是TCP,即我發(fā)送的包是TCP包,其中也有一些默認(rèn)值,我們看到有個(gè)window,這個(gè)其實(shí)就是程序的進(jìn)程號(hào)。

那么既然我們是ping包,我們就使用ICMP包,那么我們來(lái)看一下ICMP包

怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能

看到ICMP的值更少一些,其中type表示這個(gè)包是請(qǐng)求包還是回應(yīng)包。

那我們既然知道如何構(gòu)造包了,那就動(dòng)手構(gòu)造一個(gè)

def scapy_ping_one(host):
 id_ip = randint(1, 65535)
 id_ping = randint(1, 65535)
 seq_ping = randint(1, 65535)
 packet = IP(dst=host, ttl=128, id=id_ip) / ICMP(id=id_ping, seq=seq_ping) / b'I am Ameng'

這里我設(shè)置的id號(hào)其實(shí)不設(shè)置也可以,這個(gè)就是標(biāo)識(shí)包的信息,后面的字節(jié)流也可以不填寫(xiě),不影響結(jié)果

既然構(gòu)造完了,那么我們就要發(fā)送,如何發(fā)送呢?這就用到了scapy中的一個(gè)函數(shù)sr

sr() 函數(shù)是用來(lái)發(fā)送數(shù)據(jù)包和接收應(yīng)答。該函數(shù)返回一對(duì)數(shù)據(jù)包及其應(yīng)答,還有無(wú)應(yīng)答的數(shù)據(jù)包。 sr1() 函數(shù)是一種變體,用來(lái)返回一個(gè)應(yīng)答數(shù)據(jù)包。發(fā)送的數(shù)據(jù)包必須是第3層報(bào)文(IP,ARP等)。 srp() 則是使用第2層報(bào)文(以太網(wǎng),802.3等)

這里使用sr1()

ping = sr1(packet, timeout=0.2, verbose=False)

介紹一下參數(shù),其實(shí)看名字前兩個(gè)沒(méi)什么問(wèn)題,我這里主要說(shuō)一下第三個(gè)參數(shù),第三個(gè)參數(shù)的意思是說(shuō)關(guān)閉詳細(xì)信息,因?yàn)槲覀冎豢唇Y(jié)果,這樣界面更整潔

到這里發(fā)送單個(gè)包并接受單個(gè)包的ping代碼已經(jīng)實(shí)現(xiàn),整體代碼如下:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:Ameng jlx-love.com


from scapy.all import *
from random import randint

def scapy_ping_one(host):
 id_ip = randint(1, 65535)
 id_ping = randint(1, 65535)
 seq_ping = randint(1, 65535)
 packet = IP(dst=host, ttl=128, id=id_ip) / ICMP(id=id_ping, seq=seq_ping) / b'I am Ameng'
 ping = sr1(packet, timeout=0.2, verbose=False)
 if ping:
  os._exit(3)

if __name__ == '__main__':
 scapy_ping_one(sys.argv[1])

多進(jìn)程發(fā)包

這里主要是將單進(jìn)程的代碼實(shí)現(xiàn)多進(jìn)程,那么我們什么時(shí)候會(huì)用到多進(jìn)程呢?我們一般都是判斷一個(gè)網(wǎng)段有哪些主機(jī)存活,所以我們一般的輸入格式都是這樣子的,比如:192.168.10.0/24,所以我們首先需要將用戶(hù)的這個(gè)輸入變成一個(gè)這個(gè)網(wǎng)段的各個(gè)地址,這里用到ipaddress模塊,可以自動(dòng)實(shí)現(xiàn)這個(gè)功能

其次我們需要開(kāi)啟多個(gè)進(jìn)程來(lái)同時(shí)進(jìn)行不同ip地址的ping檢測(cè),所以我們引入multiprocessing模塊,開(kāi)啟多個(gè)進(jìn)程。

代碼如下:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:Ameng jlx-love.com
import time
import multiprocessing
from scapy_ping_one import scapy_ping_one
from scapy.all import *
import ipaddress

def scapy_ping_scan(network):
 net = ipaddress.ip_network(network)
 ip_processes = {}
 for ip in net:
  ip_addr = str(ip)
  ping_one = multiprocessing.Process(target = scapy_ping_one, args = (ip_addr,))
  ping_one.start()
  ip_processes[ip_addr] = ping_one
 ip_list = []
 for ip, process in ip_processes.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 = scapy_ping_scan(sys.argv[1])
 print('存活的ip地址:')
 for ip in active_ip:
  print(ip)
 t2 = time.time()
 print('所用時(shí)間為:{}s'.format(int(t2 - t1)))

到此,一個(gè)簡(jiǎn)單的ping掃描即可實(shí)現(xiàn)

運(yùn)行結(jié)果

怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能

看完上述內(nèi)容,你們掌握怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享文章:怎么在python中利用scapy模塊實(shí)現(xiàn)一個(gè)ping掃描功能-創(chuàng)新互聯(lián)
文章鏈接:http://muchs.cn/article26/doogjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、小程序開(kāi)發(fā)定制開(kāi)發(fā)、云服務(wù)器、全網(wǎng)營(yíng)銷(xiāo)推廣、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站