分类 技术志 下的文章

编译Ethereal On Windows

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

从本源看世界-读'Write Great Code'

以前曾经说过自己并非计算机科班出身。想想自己在大学时的学习过程未免有些底气不足,记得当时一直坚持去旁听计算机专业的课,但是鉴于本专业老师的点名和课堂作业,自己未免耽误了很多节课,弄得自己学的很不系统,效果不是很好。工作后一直从事应用级的开发,对计算机方面基础的本源性的知识也逐渐陌生起来。但我是那种知其然也要知其所以然的人,这两年也不间断的买了不少讲解计算机底层知识的书,目的是让那些计算机本源性的东西在我脑袋里逐渐清晰了起来。这不又一本好书问世了-'Write Great Code'第一卷,我很早就已经下载了其英文版,只是没来得急看,这两天看了其中几章,发现很适合我的口味。

在我眼中每个领域的大师级人物都是知其领域本源的人,他们把本领域的知识融汇贯通,而且大多时候我们在聆听大师级人物的讲解时都有一种豁然开朗的感觉,那其实就是因为他的知识体系很成形,他们会从本源去讲解,从最简单的原始状态去讲解,这样听起来印象深刻,收获自然颇丰。

'Write Great Code'(中文名:编程卓越之道)一系书的作者是Randall Hyde,他同时也是'The Art of Assembly Language'的作者。'The Art of Assembly Language'一书算是汇编领域的佼佼者了,虽然我没看过^_^,不过网友的评价也是很重肯的哟。当初刚刚下载'Write Great Code' Vol1时曾经浏览一遍目录,'Numeric Representation','Binary Arithmetic and Bit Operations'等这些章节的名字让我心动,我就喜欢这样的书,而且和一般的教材性质的计算机组织结构或者计算机系统结构相比,这本书是从程序员角度来讲的,更加适合我们这些人的口味。这本书所讲解的知识层次就在我们工作层次的下一层,对于想挖掘知识本源的我来说再合适不过了,东西要一点一点的吃,你说是不是^_^。

我没有从开篇'Numeric Representation'这张开始读,我直接跳到了第六章'Memory Organization and Access',因为前不久又对内存对齐等有新的认识,所以我也希望通过这章的阅读知道更多的东西,让我脑子中的知识点'串'起来。这本书没有令我失望,本章第一节关于三大总线的介绍就格外精彩:
The system bus connects the various components of a VNA machine.
-> A bus is a collection of wires on which electrical signals pass between components of the system.
-> Most CPUs have three major buses: the address bus, the data bus, and the control bus.
-> CPUs use the data bus to shuffle data between the various components in a computer system.
-> The data bus on an 80×86 family processor transfers information between a particular memory location or I/O device and the CPU. The only question is, 'Which memory location or I/O device?' The address bus answers that question.
-> The CPU uses the data bus to move data between itself and memory. This prompts the question, 'How does the system know whether it is sending or receiving data?' Well, the system uses two lines on the control bus, read and write, to determine the data flow direction (CPU to memory, or memory to CPU).

几句'关键意义'的句子循序渐进的把三大总线的用途描绘的淋漓尽致,其思路和方式完全符合认知的过程,同时让你的大脑里马上形成一个框架,带着这个框架再去读相关细节,只能让你越读越兴奋。

第6.2小节讲的是物理内存的组织以及CPU如何访问内存,但是你看完后再细致品味,实际上这节的内容完全可以作为'为什么要进行Data Alignment'的标准讲义,和我上次在'三谈内存对齐-背后的故事'一文中说的同出一辙,而且更加细致,让我对内存这块的内幕了解的更加透彻。

第6.3小节讲的则是'字节序'问题,讲解了'Big-endian'和'Little-endian'的由来,最后作者通过一个很实用的例子形象的说明了字节序带来的影响。

第6.4节和6.5节讲的略微有些深了,要细看才行,最好对更底层有所了解,可以参照别的书籍一起学。

我刚刚读到第7章-'Composite Data Types and Memory Objects',该章每一小节针对一种复合数据类型做深入分析,精彩在后头,我正准备继续呢,实在忍不住了,写下此篇,好让更多同仁知道有这么一本书,早读早受益,明天周末去书店买本中文版,坐在床上读更舒服。

从本源看世界,你会发现另一番天地。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats