最近在研究項目下一期中新增的信令跟蹤功能,在這個開源盛行的時代,開源工具當然是首選。我們發現了Ethereal,一款強大的網路分析工具包。我們不僅僅要使用Ethereal,而是在Ethereal上做二次開發,增加一個新dissector或者一個plugin,用來分析我們自己的應用程式層協議。
之所以選擇Ethereal還有一個很重要的原因就是它已經支援300多個協議包了,這說明Ethereal的架構已經很成熟了,在其上面做二次開發具備可行性。我們最終要形成的成果物可能要運行在Solaris上,但是家裡的伺服器環境都是沒有顯示終端的,也看不到運行畫面,所以我決定現在Windows上作開發,然後移植到Solaris上。Ethereal底層的圖形介面採用的是GTK,GTK是一種可在跨平台的圖形介面開發包,它屏蔽了不同OS的底層細節,便於我們的程式在各個OS平台上移植。由於GTK的使用,我才覺得我的開發方案是正確的:)。另外開發一個新的dissector涉及到的代碼都應該是可移植的,所需的介面Ethereal都已經提供了,調用即可。所以我在想在Windows上開發成功後,拿到Solaris下重新編譯後是應該能正確啟動並執行,有些過於理想了^_^。
目前第一步工作就是先在Windows上編譯Ethereal包,通過瀏覽Ethereal的Developer's Guide和網上的一些資料得知,編譯Ethereal並非易事呀,因為Ethereal依賴很多開源包以及一些其他工具(如Cygwin等)。雖然Ethereal提供的自動化構建指令碼會自動下載依賴包,但是大多時候都會下載失敗,我在公司的網路和家裡的網路都嘗試過,無一成功,無奈之中只好手工下載。依賴的開源工具包在Readme.win32中有列出。
(一)首先我們需要一個編譯器,一般在Windows上編譯Ethereal用的都是VC6.0的編譯器,切記在裝完VC6.0後運行一下vcvars32.bat,設定一下環境變數,一般VC的安裝嚮導程式在最後一步都會提示你是否設定環境變數的,你同意即可。
(二)其次,編譯Ethereal需要Cygwin這個工具,Cygwin呢,我在機器上早已經安裝過了,我一直用它在Windows下寫一些Unix下的小測試程式的。不過我當時安裝的時候沒有把所有的包都選擇上,導致我還得重新運行Cygwin的Setup.exe程式。那麼如何檢查你的Cygwin中缺少哪些軟體包呢,可以按照如下步驟來檢查:
1. 將cygwin的bin目錄作為環境變數加入到系統內容變數path中;
2. 在Windows命令提示字元視窗下進入到Ethereal的源碼包目錄下,找到config.nmake檔案,修改ETHEREAL_LIBS=C:/ethereal-win32-libs
CYGWIN_PATH=c:/cygwin/bin;
3. 在Windows命令提示字元視窗下運行:nmake -f Makefile.nmake verify_tools
如果有工具包沒有裝全,我們會從該命令的執行結果中看到的,比如我在運行該命令之後的輸出結果為:
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
Checking for required applications:
cl: /cygdrive/d/Program Files/Microsoft Visual Studio/VC98/bin/cl
link: /cygdrive/d/Program Files/Microsoft Visual Studio/VC98/bin/link
nmake: /cygdrive/d/Program Files/Microsoft Visual Studio/VC98/bin/nmake
bash: /usr/bin/bash
bison: /usr/bin/bison
ERROR: Can't find flex. This is probably an optional cygwin package not yet inst
alled. Try to install it using cygwin's setup.exe!
NMAKE : fatal error U1077: 'bash' : return code '0x1'
Stop.
可以看出flex這個工具包沒有安裝,還好找到一個很好的cygwin各種包的下載網站xmission,速度很快,缺少什麼就上去下載,然後到cygwin的根目錄'/'下,
bzip2 -d xx.tar.bz2
tar xvf xx.tar即可。
反覆執行上面步驟直到運行verify_tools順利通過為止。
下面是verify_tools運行通過的輸出結果:
D:/Ethereal/ethereal-0.99.0>nmake -f Makefile.nmake verify_tools
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
Checking for required applications:
cl: /cygdrive/d/Program Files/Microsoft Visual Studio/VC98/bin/cl
link: /cygdrive/d/Program Files/Microsoft Visual Studio/VC98/bin/link
nmake: /cygdrive/d/Program Files/Microsoft Visual Studio/VC98/bin/nmake
bash: /usr/bin/bash
bison: /usr/bin/bison
flex: /usr/bin/flex
env: /usr/bin/env
grep: /usr/bin/grep
/usr/bin/find: /usr/bin/find
perl: /usr/bin/perl
env: /usr/bin/env
python: /usr/bin/python
sed: /usr/bin/sed
unzip: /usr/bin/unzip
wget: /usr/bin/wget
這裡有一個小插曲,verify_tools命令使用的應該是cygwin中的bash shell,但是我起初運行verify_tools時始終提示我'which'包找不到,我檢查了cygwin,明明'which'包已經安裝了,我疑惑的查看了系統內容變數path,終於發現了蛛絲馬跡,原來我以前安裝過'UnxUtils'軟體包,運行verify_tools時用的是該包裡的bash shell。把UnxUtil從path中刪除,問題解決。
(三)我們要找全編譯Ethereal所依賴的包,Readme.win32中也列出了依賴包的列表,以及這些包解壓後應該釋放到的位置:
必選的:
Package Location
------- ----------------
glib-2.4.7.zip C:/ethereal-win32-libs/glib
glib-dev-2.4.7.zip C:/ethereal-win32-libs/glib
gtk+-1.3.0-20030717.zip C:/ethereal-win32-libs/gtk+
gtk+-dev-1.3.0-20030115.zip C:/ethereal-win32-libs/gtk+
libiconv-1.9.1.bin.woe32.zip C:/ethereal-win32-libs/libiconv-1.9.1.bin.woe32
gettext-runtime-0.13.1.zip C:/ethereal-win32-libs/gettext-runtime-0.13.1
net-snmp-5.2.1.2.zip C:/ethereal-win32-libs
wpdpack_3_0.zip C:/ethereal-win32-libs
可選的:
Package Location
------- ----------------
adns-1.0-win32-04.zip C:/ethereal-win32-libs
pcre-4.4.zip C:/ethereal-win32-libs
zlib123-dll.zip C:/ethereal-win32-libs/zlib123-dll
盡量按照Package的版本下載,否則除了問題很難搞定,這裡面除了net-snmp我沒有找到5.2.1.2版本,我用了5.2.3替代之外,其餘的都可以找到,這裡有個網站http://mirror.sg.depaul.edu/pub/security/ethereal/win32/development/,幾乎可以下載到上面所有的軟體。net-snmp我下載的是源碼包,需要先編譯一下,記住編譯Release版本即可。
(四)最後一步執行:nmake -f Makefile.nmake all
編譯過程中的幾個問題:
1. 編譯過程中經常會中斷,很多是因為'can't open the file 'unistd.h''這個標頭檔,如果出現這樣的問題,可以修改出錯源檔案的代碼,將#include <unistd.h>修改為
#ifdef HAVE_UNISTD_H
#include<unistd.h>
#endif
即可。
2. 另外在編譯過程中還發現需要lua5.1這個包。
3. 如果你下載的是gtk 1.x的包,你就是用gtk+這個目錄,並且需要在config.nmake中注釋掉GTK2_DIR=$(ETHEREAL_LIBS)/gtk2這項,我在編譯中如果不注釋掉該項,始終編譯不過去。
編譯過程很耗時,也許是我的本本CPU主頻低的緣故,這可是考驗耐性的活兒呀^_^。
更多參見: http://bigwhite.blogbus.com/logs/4167864.html