劉 琦(江西科技師范大學理工學院,南昌 330013)
Libpcap的BPF過濾器的分析
劉琦
(江西科技師范大學理工學院,南昌330013)
摘要:本文分析與研究了Libpcap的BPF過濾器的過濾本質,首先,分析了BPF過濾器在Linux內核中的位置和結構;其次,詳細分析了BPF過濾器怎樣處理高層語言表示的過濾器;最后,設置一個高層語言表示的過濾器,利用BPF過濾器捕獲滿足要求的網(wǎng)絡數(shù)據(jù)包。
關鍵詞:BPF;Libpcap;過濾器;網(wǎng)絡數(shù)據(jù)包
現(xiàn)代網(wǎng)絡時代中進行大數(shù)據(jù)網(wǎng)絡監(jiān)控程序是具有其各自目的前提,我們所期望網(wǎng)絡的數(shù)據(jù)中包類型都是不盡相同的。應該在絕大多數(shù)的情況之下都需要不一樣網(wǎng)絡數(shù)據(jù)包中的一部分甚至一大部分。
我們說的BPF一般意義上由兩大部分組成的:網(wǎng)絡分接頭、數(shù)據(jù)包形成口和過濾器暫借口幾個部分。趨于網(wǎng)絡鐘的分接頭最主要是從網(wǎng)絡新型設備部分和驅動應用驅動程序處的疏密收集數(shù)據(jù)包中拷貝開始實現(xiàn)的,并不斷地先后傳遞給其中在監(jiān)聽中運行的各種各樣的有機應用程序。狹義上的過濾器的決定數(shù)目的數(shù)據(jù)包不僅僅是被接受也可能是直接拒絕的,而且又是根據(jù)本身所發(fā)生的不斷變化和形象的轉運體而實現(xiàn)出來的一種傳遞信息的符號。
當其中的不斷產生的大數(shù)據(jù)包接近或者已經(jīng)到達網(wǎng)絡各個設備需要的復雜接口設備時,這期間所發(fā)生的簡介的鏈路層和設計設備驅動器就通常就把它傳遞給我們所需系統(tǒng)協(xié)議棧進行有效實質性預處理模式。但是BPF又會在該網(wǎng)絡接口上監(jiān)上聽取時,這樣有效的實施驅動器將會能夠先調用到BPF中間進行有效處理,有了BPF就會將數(shù)據(jù)包傳遞不段的傳遞給其中每個監(jiān)控進程運行中的過濾器。使得這些用戶得到自定義過濾器后就一定會發(fā)生變化,然后自覺將決定數(shù)據(jù)包是否被接受,以及到達的各種數(shù)據(jù)包中哪些內容是否應該被保存下來處理。對于其中的每一個決定是否接受數(shù)據(jù)包的各種過濾器系統(tǒng),BPF還會將需求的數(shù)據(jù)包不斷的輸入拷貝到他們與之相連的形勢短針軌道緩存之中去。
一個用高層語言(例如:C語言學習和C++語言學習運用中)表示使用新型的過濾器的結構組成差別部分,有效的實行被編譯和優(yōu)化成BPF各種虛擬機運行中的字節(jié)碼虛擬運行部分。這種有效的字節(jié)碼會不斷的跟隨和接著經(jīng)過保護邊界的地方,現(xiàn)在有效的檢查代碼和有效的合法性生產部門,后面的接著會在線解釋并發(fā)出指令去執(zhí)行。BPF系統(tǒng)發(fā)生后會根據(jù)處理器的形成購置也就是包括一系列有效組件規(guī)律性質把用過高層語言表示的過濾器不斷逐步的轉換為可視的底層可執(zhí)行的輸入設備管理器來使用。
那么我們形成最有效的無虛擬性前段前端輸入是一個中低層語言表示形成軌跡過濾器,它是被最初Libpcap使用的機器語言中公開的謂詞語法等。
BPF編譯器把該過濾器轉換為一些命令,用一個SSA中間形式的控制流程圖表示。
SSA中間形式的控制流程圖通過代碼優(yōu)化器執(zhí)行全局的與局部的數(shù)據(jù)優(yōu)化器,優(yōu)化器的輸出為一個與BPF虛擬機一致的字節(jié)碼。
BPF字節(jié)碼接著被傳遞到一個可執(zhí)行的環(huán)境中,比如穿過用戶層-內核層的保護邊界去執(zhí)行用戶定義的協(xié)議分析。
當進入目標保護區(qū)域,安全確認機制就認為該字節(jié)碼是可信的。
接著在BPF內核解釋執(zhí)行過濾器的字節(jié)碼。
現(xiàn)代化生產環(huán)境下的BPF中虛擬機指令生成的有效結構被分成編譯器、優(yōu)行器兩個并列產生獨立的適用性組成部分。最先是編譯器譯碼器會將高層語言表示的過濾器不斷的轉化為無環(huán)控制系統(tǒng)流圖的CFG有效部分,然后其再將此控制流圖有效的圖形不斷的轉化為符合運行適應的SSA中間處理器表示形式控制流圖指令接受的一種完整的過濾形勢,最后會發(fā)生優(yōu)化器會總的負責對SSA形式控制流圖不斷的進行優(yōu)化使用部分,并生成最終虛擬機指令流派系列過度性語言,這也是虛擬機和指令語言中間的生產字節(jié)碼語言所在。
BPF(BerkeleyPacketFilter-BPF)是McCanne和VanJacobson在1993公布的Berkeley網(wǎng)絡數(shù)據(jù)包過濾器。BPF是對CSPF的改進過濾過程是從一個用戶所定義的過濾器(比如:捕獲起所有的TCP數(shù)據(jù)包)開始,首先應用程序調用Libpcap源碼中的gencode.c文件中的pcap_compile()函數(shù)來編譯過濾器,通過該函數(shù)生成所需的虛擬機中間字節(jié)碼。然后應用程序調用Libpcap源碼中的pcap.c文件中的pcap_setfilter()函數(shù)將一個過濾器與一個捕獲實例相關聯(lián),把過濾器的字節(jié)碼傳遞給內核的BPF驅動程序中,當進行數(shù)據(jù)捕獲時,驅動程序執(zhí)行該過濾器對來自網(wǎng)絡的所有數(shù)據(jù)包進行過濾,所有符合要求的數(shù)據(jù)包將會復制給應用程序,否則丟棄該數(shù)據(jù)包。
BPF的設計思想和當時的計算機硬件的發(fā)展有很大的聯(lián)系,在過濾算法上,CSPF使用的是老式的布爾表達式樹(Booleanexpression tree),BPF使用的是無環(huán)控制流圖(controlflowgraph,CFG),這樣大大提高了過濾網(wǎng)絡數(shù)據(jù)包的效率。
假設我們的過濾器是ip or arp,CSPF和BPF的過濾算法如圖1和圖2。
圖1
圖2
從我們的上圖就可以得出結論:利用設置了過濾器的BPF過濾器在Linux系統(tǒng)網(wǎng)絡應用程序進行數(shù)據(jù)鏈路層MAC幀的捕獲,捕獲到了滿足要求的SourceIPAddress是192.168.1.6的網(wǎng)絡數(shù)據(jù)包。進一步證明了分析和研究BPF過濾器的重要性和必要性。從而可以大大提高我們捕獲網(wǎng)絡數(shù)據(jù)包的效率。
參考文獻:
[1]劉文濤.網(wǎng)絡安全開發(fā)包詳解[M].北京:電子工業(yè)出版社,2005.
[2]唐正軍.黑客入侵防護系統(tǒng)源代碼分析[M].北京:機械工業(yè)出版社,2002.