今天小編給大家分享一下python如何使用libpcap庫進行抓包及數據處理的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
為環(huán)縣等地區(qū)用戶提供了全套網頁設計制作服務,及環(huán)縣網站建設行業(yè)解決方案。主營業(yè)務為成都網站設計、成都網站制作、環(huán)縣網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
python版本:python 3.9
libpcap版本:1.11.0b7
python libpcap庫是底層綁定c語言libpcap庫的開發(fā)包,旨在提供python應用可訪問的unix c libpcap庫API(以及為win32系統(tǒng)提供的Npcap、WinPcap),直接使用底層c代碼,性能很好。
直接使用pip進行安裝:
pip install libpcap
默認安裝最新版本。
可以在pypi頁面源代碼或whl文件。
1) 可以使用源碼進行安裝
解壓文件到當前目錄,然后執(zhí)行安裝命令:
python -m pip install ./libpcap-1.11.0b7
2)也可以使用whl文件進行離線安裝
安裝命令如下:
python -m pip install libpcap-1.11.0b7-py3-none-any.whl
import libpcap
libpcap.config(LIBPCAP="wpcap")
tcpdump就是以libpcap為基礎實現的,c語言libpcap的文檔可以在tcpdump官網找
這里描述下python常用接口。
lookupdev(errbuf)
功能:該函數用于查找網絡設備,返回的值可以被open_live函數直接調用。
參數:
errbuf為c語言字符串類型,用于獲取錯誤信息。
使用示例:
import ctypes as ct
import libpcap as pcap
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
device = pcap.lookupdev(errbuf)
print(errbuf.value)
findalldevs(alldevs, errbuf)
功能:該函數用于查找所有網絡設備。
參數:
alldevs為pcap_if_t結構體指針,用于存儲查找到的所有網絡設備信息。
errbuf為c語言字符串類型,用于獲取錯誤信息。
使用示例:
import ctypes as ct
import libpcap as pcap
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
alldevs = ct.POINTER(pcap.pcap_if_t)()
pcap.findalldevs(ct.byref(alldevs), errbuf)
print(alldevs[0].name)
pcap.freealldevs(alldevs)
open_live(device:bytes,snaplen:int,promisc:int,to_ms:int,errbuf)
功能:該函數用于打開一個用于捕獲數據的網絡設備
參數:
device為網絡接口的名字,可通過api獲取,也可以人為指定,如:"eth0"
snaplen是捕獲數據包的長度,不能大于65535
promise用于標記是否開啟混雜模式,1代表混雜模式,其它值代表非混雜模式
to_ms代表需要等待的毫秒數,超過這個時間后,獲得數據包的函數會立即返回,0表示一直等待直到有數據包到來
errbuf為c語言字符串類型,用于獲取錯誤信息。
返回值:返回pcap_t類型指針,后面的所有操作都要使用這個指針。
使用示例:
import ctypes as ct
import libpcap as pcap
device = b'eth0' # linux
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
handle = pcap.open_live(device,4096,1,1000,errbuf)
if errbuf.value:
print("hanle error :",errbuf.value)
open_offline(fname:bytes,errbuf)
功能:該函數用于打開離線抓包文件
參數:
fname為文件名稱,比如:b"/tmp/test1.cap"
errbuf為c語言字符串類型,用于獲取錯誤信息。
返回值:返回pcap_t類型指針,后面的所有操作都要使用這個指針。
使用示例:
import ctypes as ct
import libpcap as pcap
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
handle = pcap.open_offline(fname,errbuf)
if errbuf.value:
print("hanle error :",errbuf.value)
next(handle,pheader)
功能:該函數用于獲取數據包,一次只獲取一個包。
參數:
handle為pcap_t類型指針
pheader為pcap_pkthdr結構體指針,可通過pkthdr函數創(chuàng)建
返回值:返回u_char類型指針,代表包數據,可使用struct.unpack函數解析
使用示例:
import libpcap as pcap
pheader = pcap.pkthdr()
packet = pcap.next(handle,pheader)
dump_open(handle,fname:bytes)
功能:該函數用于打開文件,存儲獲取到的數據包。
參數:
handle為pcap_t類型指針
fname為文件名稱
返回值:返回pcap_dumper_t 類型指針,后面的所有操作都要使用這個指針。
使用示例:
import libpcap as pcap
fname = b"realtime1.cap"
fPcap = pcap.dump_open(handle,fname)
dump(handle,pheader,packet)
功能:該函數用于存儲獲取到的數據包。
參數:
handle為pcap_dumper_t類型指針
pheader為pcap_pkthdr結構體指針
packet是數據包
返回值:無返回值
使用示例:
fPcapUbyte = ct.cast(fPcap,ct.POINTER(ct.c_ubyte))
pcap.dump(fPcapUbyte,pheader,packet)
dump_flush(handle)
功能:該函數用于將緩存的數據刷到磁盤
參數:
handle為pcap_dumper_t類型指針
返回值:錯誤碼,0代表成功,-1代表出錯
close(handle)
功能:釋放pcap_t類型指針
參數:
handle為pcap_t類型指針
返回值:無返回值
dump_close(handle)
功能:釋放pcap_dumper_t類型指針
參數:
handle為pcap_dumper_t類型指針
返回值:無返回值
可以使用libpcap庫進行網卡實時數據抓包,這里進行簡單的示例:
1)首先需要獲取或指定抓包設備
方法1 :指定網卡接口名稱
device = b'\Device\NPF_{BFDBF91E-9848-417D-B8AB-D3ED19990717}' # windows
device = b'eth0' # linux
Windows網卡接口名稱可在wireshark的捕獲界面看到,具體如下:
linux網卡名稱獲?。篿fconfig
方法2 :使用lookupdev獲取網卡接口名稱
device = pcap.lookupdev(errbuf)
方法3 :使用findalldevs獲取網卡接口名稱
alldevs = ct.POINTER(pcap.pcap_if_t)()
pcap.findalldevs(ct.byref(alldevs), errbuf)
device =alldevs[0].name
2)使用open_live函數進行網卡抓包;
3)使用pkthdr函數創(chuàng)建header,獲取包頭信息(時間戳、包大?。?/p>
4)使用next函數循環(huán)讀取數據包,需要注意的是,獲取的packet對象的contents是C語言類型,需要使用它ctypes的pointer函數進行轉換;
5)數據包(比如IP頭)的解析可使用struct的unpack函數;
6)如果要將抓包數據存盤,可使用dump_open、dump、dump_flush系列函數進行操作,需要注意的是,dump_open函數的第二個參數必須是byte類型;
示例代碼及運行效果:
可以使用libpcap庫進行離線抓包文件的解析,這里進行簡單的示例:
1)首先需要使用open_offline函數打開pcap文件,需要注意的是,函數的第一個參數必須是byte類型;
2)使用pkthdr函數創(chuàng)建header,獲取包頭信息(時間戳、包大小);
3)使用next函數循環(huán)讀取數據包,需要注意的是,獲取的packet對象的contents是C語言類型,需要使用它ctypes的pointer函數進行轉換;
4)數據包(比如IP頭)的解析可使用struct的unpack函數;
示例代碼及運行效果:
網卡實時抓包和離線數據解析時,可以設置過濾條件,避免數據量過大。
過濾條件示例:
1) 過濾IP
host 過濾某個ip的所有包
host 8.8.8.8
src 過濾源ip
src 8.8.8.8
dst過濾目的ip
dst 8.8.8.8
2)過濾端口
port進行單個端口過濾
port 22
portange進行多個端口過濾
portange 1-1024
可使用src或dst指定端口方向
src port 22
dst port 22
3)指定協(xié)議
tcp
udp
icmp
4)使用組合條件
and 進行與邏輯
src localhost and dst port 22
src localhost && dst port 22
or 進行或邏輯
port 80 or 22
port 80 || 22
示例代碼及運行效果:
以上就是“python如何使用libpcap庫進行抓包及數據處理”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創(chuàng)新互聯行業(yè)資訊頻道。
網站名稱:python如何使用libpcap庫進行抓包及數據處理
文章網址:http://bm7419.com/article44/jcchhe.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站建設、、網站設計、標簽優(yōu)化、網站維護、響應式網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯