天天看點

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

基于wireshark的openflow1.3二次開發(協定拓展)

一、編譯

1.1編譯前言

本來按照一個中文部落格的過程走的,過程本沒有錯誤,隻是是多年以前的流程,所需要的軟體已經不一樣了,,,各種軟體也是自己下的,發現過程中少了這個少了那個,随便從網上搜的一些***.dll檔案就放到了相應的路徑下,環境變量也是設定了好久,對于此類事情也很少接觸,折騰了好久好久,總是出問題,覺得做了那麼久再按照官網的step by step還要重新解除安裝重新下載下傳,不甘心,但是心都累了,還是錯誤重重,,,,這個時候,朋友們,感覺不對的話一定要果斷放棄啊,憋學我,整個人都不好了,不是大神一定要按照官方的來!!!!!官方教程可以讓你少走一些彎路。

首先聲明本人電腦x86、64位。切記:不同系統可能所需東西各有不同。

https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html

上邊網址的2.2.Win32/64: Step-by-Step Guide中有編譯過程所需的所有細節。參照這個過程正常的話可以順利編譯成功。

注:Chocolately,就類似于Linux的apt –get,是不用必須安裝的。

以下為編譯主要流程:(按照官方教程即可)

1.2安裝所需軟體:

1.2.1 Microsoft Visual Studio 2013 Community Edition

軟體下載下傳網址:http://go.microsoft.com/?linkid=9863608

設定環境變量:(此處憑記憶,如有不周全,網上會有環境變量的具體設定)

INCLUDE=C:\ProgramFiles (x86)\Microsoft Visual Studio 12.0\VC\include;

 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;

LIB=C:\ProgramFiles (x86)\Microsoft Visual Studio 12.0\VC\lib;

C:\Program Files (x86)\MicrosoftSDKs\Windows\v7.1A\Lib;

Path=C:\ProgramFiles (x86)\Microsoft Visual Studio 12.0\Common7\IDE;

C:\Program Files (x86)\Microsoft VisualStudio 12.0\VC\bin;

 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools;

1.2.2安裝Qt

http://qt-project.org/downloads

預設目錄:C:\Qt

如果實在下載下傳不下來可以從網上下載下傳,但是一定要是對的版本,對應你的電腦組態。

1.2.3安裝cygwin

http://www.cygwin.com/setup-x86_64.exe

預設目錄:C:\cygwin

安裝這個軟體需要注意了,這個軟體需要安裝很多插件,但是本項目隻是需要其中幾個,全部安裝會耗費巨大的流量和時間。

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

在search一欄裡依次輸入你需要的插件,點選,會快速出現将要安裝的對應版本。

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

1.2.4 安裝Python

http://python.org/download/

預設目錄:C:\Python27

1.2.5 安裝git

此處不再贅述,按照官方的教程進行即可。https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html

1.2.6 下載下傳源碼

指令行下進入到你想要放置源碼的目錄,比如

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

參照下圖格式設定環境變量,

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

也許Python等也是需要設定環境變量的,本人環境變量設定多次,設定比較多的環境變量,不宜作為參考,故如果編譯過程中如有意外,請自行酌情設定。

1.3 編譯!!!

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

打開Visual studio tools:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

對應你的電腦版本選擇對應的指令提示符:我的是x86 。

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

進入你的安裝目錄,比如C:\Program Files (x86)\Microsoft VisualStudio 12.0\VC\bin

找到這個

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

直接拖到cmd視窗中,這樣:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

Enter。。。(這個操作貌似是進行環境變量設定)

在這個指令行裡進入你放源碼的目錄:

輸入:nmake -f Makefile.nmake verify_tools      
wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

這說明你的各種需要的工具都全了。不要關掉這個指令視窗,接着輸入:nmake -f Makefile.nmake setup

下載下傳安裝了一些東西,lib庫之類。。。

然後:輸入 nmake -f Makefile.nmake all 進行編譯      
如果編譯失敗:nmake –f Makefile.nmake distclean 清理一下。      

編譯成功的話,進入你的源碼檔案夾下會看到這個:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

進去:找到這個,

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

,你可以使用wireshark抓包了!!!

So happy to seethis!!!

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤
wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

1.4可能出現的錯誤:

在verify tool時出錯:

不能在lib目錄找到current_tag.txt。 解決:手動建立此檔案,并根據提示寫上内容,一般是一個日期字元串,如2014-10-01 

Qt弄成x64的了(此時官網下的軟體遲遲安不上,在網上随便下了個,不對!!!

http://down.tech.sina.com.cn/download/d_load.php?d_id=50400&down_id=4&ip=114.255.40.47這個就ok了)

錯誤是這個樣子的:Qt5Widgets.lib(Qt5Widgets.dll):fatalerrorLNK1112:module machine type 'x64'conflicts with target machine type'x86'

http://down.tech.sina.com.cn/page/50400.html

二、協定開發前言

2.1插件技術

wireshark是開源軟體,可以在版權許可下進行二次開發。有三種方式為其添加協定解析(protocol dissection)功能:

  • 内置解析器(build in)
  • 動态連結庫形式的插件解析器(plugin)
  • Lua或Python語言的插件解析器(不做介紹)

插件型:建構一個插件(如一個動态連結庫),并把自己注冊到主程式中,執行解析工作。

插件技術,就是在程式的設計開發過程中,把整個應用程式分成宿主程式和插件兩個部分,宿主程式與插件能夠互相通信。并且,在宿主程式不變的情況下,可以通過增減插件或修改插件來調整應用程式的功能。運用插件技術可以開發出伸縮性良好、便于維護的應用程式。

内置型:把一個協定解析器編譯進主程式中它将一直可用。

插件型和内置型的差異很小,隻不過内置型的重構周期比元件型的長很多,同時沒有插件型那麼靈活。内置型插件隻需要把plugin檔案夾下對應的selfdefinedprotocol.c編譯,然後将生成的***.dll檔案複制到指定位置就可以使用添加的插件,而内置型則需要編譯整個工程,約花費10分鐘(修改代碼過程中,如果沒有較大錯誤,可以不進行nmake –f Makefile.nmake distclean清除工作,隻用nmake -fMakefile.nmake all,則隻對已經修改的代碼部分進行編譯,大大節省了編譯時間)。

2.2wireshark結構架構

隻針對本次開發可能用到的方面:

檔案目錄:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤
wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

epan檔案夾負責所有網絡協定識别工作,epan/dessector檔案夾下是所有的内置型解析器的代碼,plugins裡面存放了wireshark所有插件型解析器代碼,wireshark-gtk2檔案夾裡面是wireshark的界面部分代碼。

Dissectors:在epan/dissector目錄下,各種協定解碼器(内置型解析器隻需将代碼放到此目錄下編譯即可,不過初次編譯需要對整個工程進行編譯,耗費十分鐘左右的時間)

Plugins:一些協定解碼器以插件形式實作,源碼在plugins目錄(插件型解析器代碼則放在此目錄下,編譯時隻需要編譯此檔案夾下你所建立的新協定的檔案夾,然後把生成的DLL複制到相應位置,還要添加一些配置檔案,因本人并沒有成功實施,故不做詳細闡述,但是插件型編譯耗費時間很短,具有很大的優勢,可以嘗試)。

2.3 wireshark解析流程

由于OSI的7層協定模型,協定資料是從上到下封裝後發送的。對于協定分析需要從下至上進行。首先對網絡層的協定識别後進行組包還原然後脫去網絡層協定頭。将裡面的資料交給傳輸層分析,這樣一直進行下去直到應用層。

由于網絡協定種類很多,就WireShark所識别的多種協定來說,為了使協定和協定間層次關系明顯。進而對資料流裡的各個層次的協定能夠逐層處理。WireShark系統采用了協定樹的方式,如果協定A的所有資料都是封裝在協定B裡的,那麼這個協定A就是另外一個協定B的兒子節點。我們将最低層的無結構資料流作為根節點。那麼具有相同父節點的協定成為兄弟節點。那麼這些擁有同樣父協定兄弟節點協定如何互相區分了?WireShark系統采用協定的特征字來識别。每個協定會注冊自己的特征字。這些特征字給自己的子節點協定提供可以互相區分開來的辨別。比如tcp協定的port字段注冊後。 Tcp.port=21就可以認為是ftp協定, 特征字可以是協定規範定義的任何一個字段。比如ip協定就可以定義proto字段為一個特征字。在WireShark中注冊一個協定解析器首先要指出它的父協定是什麼。另外還要指出自己差別于父節點下的兄弟接點協定的特征。

比如:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

上圖1.0-1.4都是wireshark已有的對于openflow協定版本(eg:0x04是openflow1.3的版本号)。0xa4是本次開發所規定的版本号,是對于1.3版本協定的擴充,故可以寫為2.3(此處自定義).

比如ftp協定。在WireShark中他的父接點是tcp協定,它的特征就是tcp協定的port字段為21。這樣當一個端口為21的tcp資料流來到時。首先由tcp協定注冊的解析子產品處理,處理完之後通過查找協定樹找到自己協定下面的子協定,判斷應該由那個子協定來執行,找到正确的子協定後,就轉交給ftp注冊的解析子產品處理。這樣由根節點開始一層層解析下去。由于采用了協定樹加特征字的設計,這個系統在協定解析上由了很強的擴充性,增加一個協定解析器隻需要将解析函數挂到協定樹的相應節點上即可。

應用層 HTTP  FTP
表示層
會話層
傳輸層 TCP   UDP
網絡層 IP
資料鍊路層
實體層

2.4本次開發相關(此處包含個人了解,用語或不專業,不妨礙了解。。。)

在本次開發中,wireshark本身已經包括了openflow1.0-1.4的協定解析器,在此基礎上直接建立一個内置型插件十分簡單,沿用之前版本的程式,将其中的部分代碼做修改即可,省去了建立協定解析器dissector的大量工作(你也可以嘗試做一個插件型的:插件型和内置型在代碼編寫上基本沒有差別,插件型的好處在于,你每次修改完協定後隻需要進入plugin檔案夾下,你所建立協定解析器插件的目錄下編譯然後把編譯生成的DLL檔案複制到對應的位置即可,節省編譯時間,此處因種種原因,用内置型)。

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

上圖為wireshark\epan\dissectors檔案夾下openflow相關的源碼,其中packet-openflow.c檔案包含了所有openflow版本的解碼器句柄,對所有版本的openflow協定進行了注冊工作。當傳輸層tcp資料流到來時,進行tcp注冊協定的相應子產品處理,處理之後找tcp的子協定,根據openflow的端口号判定對應的子協定為openflow協定,然後根據openflow協定的版本号判定資料屬于哪個協定版本,然後調用對應協定的源碼進行資料的詳細解析。

packet-openflow_v1.c

packet-openflow_v4.c

packet-openflow_v5.c

以上分别是openflow1.0、1.3、1.4的解析源碼。

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

上圖源碼為packet-openflow.c中對于所有協定版本的注冊,其中openflow_v8是本次開發拟定的辨別。

此處解釋本次開發為内置插件的原因:開發plugin插件需要對于建立協定的注冊工作,以及與父協定相關的銜接代碼編寫,而我們所進行的開發隻是對于openflow1.3的拓展,完全可以基于已有的基礎開展工作,減少開發量。(如果開發全新協定則首選為插件型)。

三、協定開發,源碼

本節結合對應的執行個體代碼進行闡述。

3.1.1添加節點

工作中的wireshark界面:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

此處添加節點的直覺效果是,會在wireshark界面内增加一條内容。

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

上圖為wireshark圖形界面中本次開發添加的datapath_id。其中port是節點/子樹,port下面的各條都是port節點的子節點。

添加一條内容所需添加的代碼:

1)  賦初值:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

2)  添加條目:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

此處代碼是在port_tree子樹(這個子樹在wireshark界面顯示為Port)上添加子節點,tvb表示buffer,offset表示目前位置,8表示這個子節點的資料占8位元組。這句代碼的大意是表示緩存裡從offset位置處8位元組的資料為datapath_id ,随後offset加8 ,表示如果随後還有子節點,則從這個新的offset位置處開始讀取資料。

3)  定義想要顯示的内容:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

datapath_id字元串将會顯示在wireshark界面内,這樣:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

FT_UINT64表示是64位8位元組的資料,BASE_HEX表示用十六進制顯示。

openflow_v8.port.datapath_id則會在wireshark界面中的expression選項中顯示,如下:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

至此,完整的添加了一個子節點。

3.1.2添加子樹

本例說明本次開發中添加的一個子樹onu feature的過程,添加子樹有兩種方式,本例隻介紹其中一種,各種過程大同小異,此處本文重在闡述主要概念。

效果圖:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

賦初值:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

添加子樹:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

本句代碼大意:給tree樹添加一個子樹onu_tree,onu_tree下會有datapath_id等子節點,這些子節點一共有24位元組的資料,在wireshark圖形界面内顯示這個子樹的名稱為onu feature。

綁定ID:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

3.2添加dissector

本小節對于前兩個例子進行彙總,添加一個簡單的dissector,不做詳細闡述。

主代碼:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

在tree樹下添加onu_tree子樹,在子樹下添加各節點。

3.3可能用到的函數

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

tvb_get_ntohl(tvb,offset)表示從tvb的offset位置讀取32位資料複制給type。

tvb_get_ntohs(tvb,offset)表示讀取16位。

四、可能出現的錯誤

本節闡釋開發中可能遇到的錯誤。

1. 子樹包含的位元組數確定正确(此處onu子樹共有24位元組的資料)。

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

2. openflow_v8.multipart_reply.exp_onu_features.datapath_id等字元串前不可出現空格,這是在wireshark軟體界面會出現的選項,如有空格,wireshark将會無法識别,造成編譯通過軟體卻打不開(這種錯誤也就我這種馬大哈才會犯的吧233,複制粘貼都做的不到位。。。勤快點自己輸入名稱也不會有這個天殺的空格。。)

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

是這樣報錯的:

wireshark編譯&基于openflow1.3協定開發一、編譯二、協定開發前言三、協定開發,源碼四、可能出現的錯誤

繼續閱讀