Ethereal協議分析系統介紹 .

Ethereal協議分析系統介紹
 
 

 
 

    Ethereal是一個開放源碼的網絡分析系統,也是是目前最好的開放源碼的網絡協議分析器,支持Linux和windows平臺。Ethereal起初由Gerald Combs開發,隨後由一個鬆散的Etheral團隊組織進行維護開發。它目前所提供的強大的協議分析功能完全可以媲美商業的網絡分析系統,自從1998年發佈最早的0.2版本至今,大量的志願者爲Ethereal添加新的協議解析器,如今Ethereal已經支持五百多種協議解析。很難想象如此多的人開發的代碼可以很好的融入系統中;並且在系統中加入一個新的協議解析器很簡單,一個不瞭解系統的結構的新手也可以根據留出的接口進行自己的協議開發。這都歸功於Ehereal良好的設計結構。事實上由於網絡上各種協議種類繁多,各種新的協議層出不窮。一個好的協議分析器必需有很好的可擴展性和結構。這樣才能適應網絡發展的需要不斷加入新的協議解析器。

1 Ethereal的捕包平臺
  網絡分析系統首先依賴於一套捕捉網絡數據包的函數庫。這套函數庫工作在在網絡分析系統模塊的最底層。作用是從網卡取得數據包或者根據過濾規則取出數據包的子集,再轉交給上層分析模塊。從協議上說,這套函數庫將一個數據包從鏈路層接收,至少將其還原至傳輸層以上,以供上層分析。
在Linux系統中, 1992年Lawrence Berkeley Lab的Steven McCanne和Van Jacobson提出了包過濾器的一種的實現,BPF(BSD Packet Filter)。Libpcap是一個基於BPF的開放源碼的捕包函數庫。現有的大部分Linux捕包系統都是基於這套函數庫或者是在它基礎上做一些針對性的改進
  在window系統中,意大利人Fulvio Risso和Loris Degioanni提出並實現了Winpcap函數庫,作者稱之爲NPF。由於NPF的主要思想就是來源於BPF,它的設計目標就是爲windows
  系統提供一個功能強大的開發式數據包捕獲平臺,希望在Linux系統中的網絡分析工具經過簡單編譯以後也可以移植到windows中,因此這兩種捕包架構是非常現實的。就實現來說提供的函數調用接口也是一致的。
  Ethereal網絡分析系統也需要一個底層的抓包平臺,在Linux中是採用Libpcap函數庫抓包,在windows系統中採用winpcap函數庫抓包

2層次化的數據包協議分析方法
  取得捕包函數捕回的數據包後就需要進行協議分析和協議還原工作了。由於OSI的7層協議模型,協議數據是從上到下封裝後發送的。對於協議分析需要從下至上進行。首先對網絡層的協議識別後進行組包還原然後脫去網絡層協議頭。將裏面的數據交給傳輸層分析,這樣一直進行下去直到應用層
    Ip
    | /
  Tcp udp
  |   /
HTTP   TFTP
  由於網絡協議種類很多,就Ethereal所識別的500多種協議來說,爲了使協議和協議間層次關係明顯。從而對數據流裏的各個層次的協議能夠逐層處理。Ethereal系統採用了協議樹的方式。上圖就是一個簡單的協議樹。如果協議A的所有數據都是封裝在協議B裏的,那麼這個協議A就是協議B是另外一個協議的兒子節點。我們將最低層的無結構數據流作爲根接點。那麼具有相同父節點的協議成爲兄弟節點。那麼這些擁有同樣父協議兄弟節點協議如何互相區分了?Ethereal系統採用協議的特徵字來識別。每個協議會註冊自己的特徵字。這些特徵字給自己的子節點協議提供可以互相區分開來的標識。比如tcp協議的port字段註冊後。 Tcp.port=21就可以認爲是ftp協議, 特徵字可以是協議規範定義的任何一個字段。比如ip協議就可以定義proto字段爲一個特徵字。
  在Ethereal中註冊一個協議解析器首先要指出它的父協議是什麼。另外還要指出自己區別於父節點下的兄弟接點協議的特徵。比如ftp協議。在Ethereal中他的父接點是tcp協議,它的特徵就是tcp協議的port字段爲21。
  這樣當一個端口爲21的tcp數據流來到時。首先由tcp協議註冊的解析模塊處理,處理完之後通過查找協議樹找到自己協議下面的子協議,判斷應該由那個子協議來執行,找到正確的子協議後,就轉交給ftp註冊的解析模塊處理。這樣由根節點開始一層層解析下去。
  由於採用了協議樹加特徵字的設計,這個系統在協議解析上由了很強的擴展性,增加一個協議解析器只需要將解析函數掛到協議樹的相應節點上即可。

  3 基於插件技術的協議分析器
  所謂插件技術,就是在程序的設計開發過程中,把整個應用程序分成宿主程序和插件兩個部分,宿主程序與插件能夠相互通信,並且,在宿主程序不變的情況下,可以通過增減插件或修改插件來調整應用程序的功能。運用插件技術可以開發出伸縮性良好、便於維護的應用程序。它著名的應用實例有:媒體播放器winamp、微軟的網絡瀏覽器ie等。
  由於現在網絡協議種類繁多,爲了可以隨時增加新的協議分析器,一般的協議分析器都採用插件技術,這樣如果需要對一個新的協議分析只需要開發編寫這個協議分析器並調用註冊函數在系統註冊就可以使用了。通過增加插件使程序有很強的可擴展性,各個功能模塊內聚。
  在協議分析器中新增加一個協議插件一般需要插件安裝或者註冊,插件初始化,插件處理3個步驟,下面以Ethereal爲例進行分析如何利用插件技術新增加一個協議分析模塊。
  Ethereal由於採用插件技術,一個新加入開發的程序員開發一種新的協議分析模塊的時候不需要了解所有的代碼,他只需要寫好這個協議模塊的函數後,寫一個格式爲proto_reg_handoff_XXX的函數,在函數內調用註冊函數告訴系統在什麼時候需要調用這個協議模塊。比如
  你事先寫好了一個名爲dissect_myprot的協議解析模塊,它是用來解析tcp協議端口爲250的數據。可以利用這些語句來將這個解析器註冊到系統中
proto_reg_handoff_myprot(void)
{
    dissector_handle_t myprot_handle;

    myprot_handle = create_dissector_handle(dissect_myprot,
      proto_myprot);
    dissector_add("tcp.port", 250, myprot_handle);
}
這段代碼告訴系統當tcp協議數據流端口爲250的時候要調用dissect_myprot這個函數模塊。
  在Ethereal中有一個角本專門來發現開發者定義的類式proto_reg_handoff_xxx這樣的註冊函數名,然後自動生成調用這些註冊函數的代碼。這樣開發者不需要知道自己的註冊函數如何被調用的。這樣一個新的協議分析模塊就加入到系統中了。
  由於採用了插件方式,Ethereal良好的結構設計讓開發者只需要關係自己開發的協議模塊,不需要關心整個系統結構,需要將模塊整合進系統只需要寫一個註冊函數即可,連初始化時調用這個註冊函數都由腳本自動完成了。正是因爲有很好的體系結構,這個系統才能夠開發出如此多的協議解析器

  儘管Ethereal是目前最好的開放源碼的網絡分析系統,但Ethereal仍然有一些可以改進的地方,一個優秀的網絡分析器,儘可能的正確分析出數據協議和高效的處理數據是兩個重要的指標。在協議識別方面Ethereal大多采用端口識別,有少量協議採用內容識別。這就讓一些非標準端口的協議數據沒有正確解析出來。比如ftp協議如果不是21端口的話,Ethereal就無法識別出來,只能作爲tcp數據處理。另外對於內容識別式。Ethereal是將所以內容識別的函數組成一張入口表。每次協議數據需要內容識別時,按字母順序逐個調用表裏的每個識別函數。比如對於識別yahoo massanger協議。主要是看數據前幾個字節是不是’ymsg’.由於協議名爲y開頭。所以當識別出協議時已經把所有內容識別函數調用了一遍。這些都是由於Ethereal沒有實現tcp協議棧,無法做到流級別的識別。導致在協議識別方面有點缺陷。

  各位,想進一步瞭解Ethereal的請搜索 Ethereal Packet Sniffing 這本書,網上有下載的


轉載請著名作者和出處          
              Ethereal協議分析系統介紹
              作者:staring
              email :[email protected]
              出處:中國協議分析網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章