最近在研究项目下一期中新增的信令跟踪功能,在这个开源盛行的时代,开源工具当然是首选。我们发现了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 ’0×1′
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 ‘uni
std.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主频低的缘故,这可是考验耐性的活儿呀^_^。

© 2006, bigwhite. 版权所有.

Related posts:

  1. APR源代码分析-环篇
  2. Boost_1_32_0版源代码编译
  3. Unix Shell Scripting之'扫盲篇'
  4. APR源代码分析-整体篇
  5. Mix-in in Ruby