用ethereal写自己的协议Word文件下载.docx

上传人:b****4 文档编号:7181020 上传时间:2023-05-08 格式:DOCX 页数:26 大小:29.72KB
下载 相关 举报
用ethereal写自己的协议Word文件下载.docx_第1页
第1页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第2页
第2页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第3页
第3页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第4页
第4页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第5页
第5页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第6页
第6页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第7页
第7页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第8页
第8页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第9页
第9页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第10页
第10页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第11页
第11页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第12页
第12页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第13页
第13页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第14页
第14页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第15页
第15页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第16页
第16页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第17页
第17页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第18页
第18页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第19页
第19页 / 共26页
用ethereal写自己的协议Word文件下载.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

用ethereal写自己的协议Word文件下载.docx

《用ethereal写自己的协议Word文件下载.docx》由会员分享,可在线阅读,更多相关《用ethereal写自己的协议Word文件下载.docx(26页珍藏版)》请在冰点文库上搜索。

用ethereal写自己的协议Word文件下载.docx

perl、python、sed、unzip、wget,在安装cygwin的时候把这些都选上就可以了。

怎么安装cygwin?

您还是就此打住吧,再往下读也没有意义,:

D

2)获取ethereal代码

ethereal代码库使用了subvision工具,可以下载一个subvision的client安装,有支持windows

的版本。

然后执行下面的命令获取代码:

svncheckoutethereal

可以得到最新的代码,不过最新的代码未必是没有问题的,如果担心,可以去下载

已经验证可以编译过的版本。

3)检查编译环境

首先运行

nmake-fmakefile.nmakeverify_tools

检查所需要的工具是否已经安装上,需要特别注意的是前面三个工具cl、link、nmake

所指示的目录。

cl和nmake都是vc特有的,但是如果你“不幸”安装了gcc开发环境,

vc和gcc都有link.exe文件,要特别注意,你需要保证这里检查到的是vc的link,否则

链接的时候会出错。

如果你看到link:

/usr/bin/link,你就必须做一些修改。

简单一点你就把cygwin目录下面的link改个名字,复杂一点,复杂一点我也不知道怎么

办,似乎很难两全其美,:

$。

如果调整path的顺序,那么你以后用gcc的时候就会有问题了,

你不用gcc?

猪啊,不用你安装它干吗?

4)下载需要的库和dll

运行nmake-fmakefile.nmakesetup

这个会自动下载一大堆的ethereal需要的开发包,包括有gtk、glib、zlib、pango。

执行一次就可以了,如果网络太慢是很难受的,加起来有十几M呢

做完这些,ethereal的编译环境就建起来了

扩充ethereal解析自己的协议(三)

下面看看怎么编译ethereal

如果是第一次编译ethereal,你得到的代码中有一些用gcc编译生成

的中间文件,需要先删掉,以便重新生成vc需要的文件,所以首先需要

执行下面的命令删除这些文件

nmake-fmakefile.nmakedistclean

如果以前执行过,就不用再次执行了。

需要注意的是如果你用svnupdate更新

了代码,可能还需要再执行一次。

终于可以开始编译了,执行编译的命令是

nmake-fmakefile.nmake

很不幸,通常你会发现你拿到的代码是编译不过去的,存在这样那样

的一些错误,好吧,我们来看看怎么解决这些问题。

下面的介绍只针对我拿到的

版本,这个版本是2006年3月15日从subvision库中拿到的,ethereal

也该搞搞消费者权益保护了,即便不收钱,也不能酱紫不是?

1)编译wiretap.lib和wiretap.dll的时候,提示

LINK:

warningLNK4049:

locallydefinedsymbol"

_strtoul"

imported

snoop.obj:

errorLNK2001:

unresolvedexternalsymbol__imp___errno

netxray.obj:

unresolvedexternalsymbol__imp__fseek

解决方案:

打开wiretap目录下面的makefile.nmake,找到规则wiretap-$(WTAP_VERSION).dll,

在下面的link后面加入msvcrt.lib

2)编译dissectors目录的时候提示

Makingpacket-ncp2222.c

envpythonncp2222.py-opacket-ncp2222.c

env:

python:

Nosuchfileordirectory

打开ethereal目录下的config.nmake,将其中的

PYTHON=envpython改成PYTHON=python

3)还是dissectors目录,

在makingpacket-ncp2222.c的时候提示python出错,

这个问题分析是python和nmake有冲突,解决方案是

不在nmake下执行,手工进入目录

epan\dissectors,执行

pythonncp2222.py-opacket-ncp2222.c

且慢,你会发现虽然不报错了,但是c文件并没有生成,

解决方案是先运行bash,然后在bash下执行上述命令,

就可以生成c文件了

4)还是dissectors目录,提示

Makingregister.c(usingpython)

NMAKE:

fatalerrorU1045:

spawnfailed:

Invalidargument

而且会告诉你python出现“非法操作”

还是起一个bash,

另外将

@$(PYTHON)make-reg-dotc.py.$(DISSECTOR_SRC)

改成

@$(SH)make-reg-dotcregister.c.$(DISSECTOR_SRC)

否则会死机,看来windows底下的python问题还是比较多的。

上面这个转换需要比较长的时间,并非死机,大家不要着急,我估摸了一下,在我

的本本上需要5分钟左右,会生成一堆c文件

5)epan目录,生成libethereal.dll的时候提示

msvcrt.lib(MSVCRT.dll):

errorLNK2005:

_strchralreadydefinedinLIBC.lib(strchr.obj)

打开epan目录下的makefile.nmake文件,在libethereal.dll的生成命令

link后面加入/nodefaultlib:

"

libc"

6)编译错误

capture_if_details_dlg.c(70):

errorC2011:

'

sockaddr_storage'

:

struct'

typeredefinition

capture_wpcap_packet.c(66):

将sockaddr_storage的定义给注释掉

7)编译错误

Linkingethereal.exe

link@C:

\DOCUME~1\wangcf\LOCALS~1\Temp\nma02508.

MSVCRT.lib(MSVCRT.dll):

_strstralreadydefinedinLIBC.lib(strstr.obj)

同5

编译ethereal-gtk2.exe/tethereal.exe/editcap.exe/randpkt.exe时有同样错误

8)编译错误

Linkingcapinfos.exe

\DOCUME~1\wangcf\LOCALS~1\Temp\nmc03520.

_exit"

_strncmp"

capinfos.obj:

unresolvedexternalsymbol__imp__printf

同1

编译editcap.exe/mergecap.exe/txt2cap.exe/dumpcap.exe时有同样的错误

ok,现在可以运行你自己的ethereal了,不过我发现我编译出来的ethereal.exe

只有1.3M,比网上下载的同样的版本少了1M多,该不会ethereal发行版里面给的

是一个debug版本吧?

:

扩充ethereal解析自己的协议(四)

先介绍一下ethereal的代码结构。

ethereal有这样几个模块构成:

core是系统的核心控制模块,其它几个模块都是通过core模块串起来的;

gtk模块是系统的UI,负责接受用户的命令和处理显示,关于gtk的知识可以

作为一个专题来介绍,以前做网络设备压力测试仿真工具和协议栈模拟器

的时候我已经接触和使用过gtk工具,实际上当时很多代码就是从ethereal

这里参考的,这次就懒得再看了,因为当时刚从vxworks转到windows平台

上来,对gtk能够做到在一个线程内同时处理这么多事情印象颇深,当然,

印象更深的是用标准c实现出来的面向对象思想和消息驱动机制,叹为观止,

要是俺的c能用到这种程度,还学啥子c++啊;

capture模块是负责抓包的模块;

winpcap是工作网卡驱动层的模块,用来抓取报文,将网卡上的报文复制一份

送给capture模块,这个模块屏蔽了跟网络设备相关的细节,比如以太网、

无线网卡、令牌环网等;

wiretap模块是用来处理抓包文件的格式转换的,可以将抓到的报文保存成

各种不同的格式,当然也可以读取这些格式的文件;

epan(EtherealPackageANalyzing)模块是负责报文解析的,我们的工作将

主要在这个模块展开。

其中epan模块又分成了4个子模块,分别是:

protocoltree:

维护协议信息

dissectors:

各种协议的解析器

plugins:

有些协议解析器实现成插件,这个就是管理这些插件的

display-filters:

负责处理解析结果的显示

ethereal是如何支持跨平台的?

首先是使用winpcap/libpcap实现了底层的跨平台支持,然后通过gtk实现了UI

层的跨平台。

对于没有图形界面的情况,可以使用tethereal实现命令行支持。

至于OS提供的接口,则是通过glib来实现多种平台下的兼容性的。

这样中间的core、capture、epan等模块就基本上不用考虑平台相关的东西了。

扩充ethereal解析自己的协议(五)

罗嗦了半天,总算要进入正题了,:

要扩充ethereal的解析器有两种方式,一个是直接修改ethereal的代码,将自己的

解析器加进去,然后就是“发行”自己的ethereal了(好像有点废话);

另外一个方法

就是做一个dll,ethereal每次启动的时候,最自动装载plugin目录下所有的dll文件,

如果你写一个dll,按要求export必要的接口出来,那么就可以被ethereal作为一个

解析器管理起来了。

基于以下几个理由,我们决定使用dll的方法来实现自己的解析器:

1)利于发行:

显然,发给别人一个dll,复制到ethereal的plugin目录下,要比发一个

10几M的压缩文件要简单的多;

2)利于维护:

显然,我们不能奢望自己“私有”的解析器能够进入ethereal的代码库,

那么当ethereal版本升级的时候,你就必须重复“下载新代码->

改正编译错误->

修改makefile增加自己的解析器->

编译ethereal->

发行ethereal”这个全套过程,而

dll方式显然就简单的多了,因为升级安装的ethereal还在原来的目录下,你需要做的

事情可能就仅仅是将dll文件从原来版本对应的plugin目录下复制到新版本对应的plugin

目录下,就可以享受新版本的ethereal的功能了。

即便libethereal.lib和dll文件升级了,

也只需要重新link一下dll文件就可以了

3)利于调试:

如果我们将解析器编译到ethereal里面去,在调试的时候你就必须

“拖家带口”的才能调试了,而且makefile那一堆东西,里面我没有看到对debug版本和

release版本有区别的配置,没准需要改一大堆makefile才能debug,那就惨透了;

而dll方式就简单多了,你自己建一个debug版本的dll工程,如果喜欢,我甚至不用

makefile,自己建个dsw,然后用ethereal来装载这个dll调试,岂不爽歪歪?

实际上,俺就是这么做的

各位客官可能要说了,既然用dll方式,那你前面讲的如何编译“自己的”ethereal岂不

是多余了?

no,no,这是洋话,不过我想大家都懂。

虽然是生成了一个独立的dll,但是你还是需要ethereal提供的接口,否则你的解析器

怎么能被ethereal管理起来呢?

而且也没法显示你需要的内容。

所以这些工作还是

需要的,实际上我们的dll工程里面需要链接libethereal.lib这个库文件,这个库是在你

编译ethereal的过程中生成的

扩充ethereal解析自己的协议(六)

下面看看怎么建立工程,根据回忆写的,没有一步步重新建一个,

所以可能有遗漏,相信各位大侠能够搞定这些问题

1)首先是打开vc(废话),new一个win32dll的工程,选择要

export接口出来那个选项,里面那些strafx啥的就都不需要了,建

个空的工程就可以了

2)修改debug配置,选择使用ethereal调试自己的dll,我建议大家

就选择”官方“版本来调试吧,别用自己的ethereal了

3)修改link配置,首先是将输出目录修改为ethereal安装目录下的

plugin目录,通常是C:

\ProgramFiles\Ethereal\plugins\0.10.14\idptrack.dll,

版本不同,那个0.10.14的数字可能不一样,俺用的是当前的最新版本

的ethereal,所以是0.10.14

另外在要连接的lib文件中增加ethereal/epan/libethereal.lib,根据你的工程

目录不同,前面可能要增加相对路径的描述

4)修改c/c++配置,在general选项中增加几个预定义的宏

HAVE_WIN32_LIBETHEREAL_LIB,_NEED_VAR_IMPORT_,HAVE_CONFIG_H,_U_="

在preprocessor选项中增加include目录

..\ethereal,..\ethereal\wiretap,C:

\ethereal-win32-libs\glib\include\glib-2.0,

C:

\ethereal-win32-libs\glib\lib\glib-2.0\include(这些都是我机器上的目录,

大家根据自己的情况修改)

另外建议大家修改tools/option下面的directory,include路径中只保留vc98/include,

否则编译的时候会有警告,不过不改应该也没事

改完配置,将自己的c文件加到工程里面去,就可以准备写代码了

扩充ethereal解析自己的协议(七)

下面看看怎么写代码了,ethereal的developer'

sguide给出了一个很详尽的

例子,运行起来没什么问题,所以具体代码就不一点点分析了。

唯一要说明的,上一节中已经介绍过了如何建立vc的dsw和dsp环境,所以

例子中提供的makefile文件我们就用不着了,大家直接在vc下面工作就可以了,

不用费劲去调nmake。

我们的dll需要提供两个对外的接口,一个plugin_register接口的作用是注册

解析器的协议信息,另外一个plugin_reg_handoff是注册解析器的解析句柄

用的。

需要特别说明一下注册解析句柄的函数,首先是使用解析函数和协议id生成

一个handle,然后调用dissector_add函数将此句柄添加到解析器表中。

典型的dissector_add("

udp.port"

1234,handle),告诉ethereal将udp协议

1234端口的报文送给handle解析。

但是有些情况下,为了穿透防火墙,防止被网关封杀,你的协议可能是

随机端口的,或者使用了其它知名的协议端口,比如80或者443之类的,

或者你的协议根本就是可以同时支持多端口尝试的,这种情况下使用disscerot_add

就有点勉为其难了,ethereal提供了heur_dissector_add接口解决这个问题。

我们看一个例子,yahoomessenger的解析器是这么注册的

heur_dissector_add("

tcp"

dissect_ymsg,proto_ymsg);

yahoomessenger可能使用23、25或者5050端口,但23、25都已经被其它解析器

使用,5050端口也已经被老版本的yahoomessenger使用,所以在注册的时候就只说,

这个解析器解析的是tcp报文,至于什么样的tcp报文是属于我这个协议的,

由dissect_ymsg函数自己来识别。

下面是dissect_ymsg函数的实现:

staticgbooleandissect_ymsg(tvbuff_t*tvb,packet_info*pinfo,proto_tree*tree)

{

if(tvb_memeql(tvb,0,"

YMSG"

4)==-1){

returnFALSE;

}

tcp_dissect_pdus(tvb,pinfo,tree,ymsg_desegment,8,get_ymsg_pdu_len,

dissect_ymsg_pdu);

returnTRUE;

}

上面的代码说,如果报文是YMSG打头的,那么由dissect_ymsg_pdu函数来继续解析

后面的部分,否则就送给别人试试吧,:

P

到此为止,相信大家已经建立好了自己的工程,写好了自己的c文件了,编译一下,

然后验证一下dll文件是否已经生成在ethereal安装目录下的plugin目录下对应版本号

的子目录里面,然后启动ethereal,打开help->

aboutethereal,看看plugin属性页,

是不是已经把自己的dll文件load进去了?

ok,这第一步就算是大功告成了

不过有时候还是难免会出现一些意外,如果你的协议使用了知名端口,或者也有其它

解析器使用heur_dissector_add把你的报文给“抢劫”走了,可能还是无法按照你的协议

格式来解析,这个问题可以通过配置来处理,打开ethereal的analyze->

enabledprotocols

菜单,看看你的报文被解析成了什么协议,把那些“拦路抢劫”的协议给disable掉,

就可以按照你期望的格式来解析了

扩充ethereal解析自己的协议(八)

稍微岔开一点,说点轻松易懂的话题。

写好了自己的解析器,准备要调试一下看看到底怎么样了,发现ethereal

没有自己编辑报文发送的功能,无可奈何之下,想到了扔到垃圾堆里面

已经很久的sniffer,结果惨遭sniffer蹂躏。

从网上下载了一个snifferpro4.7版本,安装完毕,输入注册码,提示注册

成功。

启动sniffer,不由大吃一惊,居然让我再次输入注册码,如此循环

N次,始终无解。

后来终于剑走偏门,发现了一招。

输入注册码后,sniffer让选择网卡,选中logoff选项,就可以启动sniffer

了,但是这个时候不能抓包,类似ethereal没有安装winpcap的状态,

点击logon功能,终于将sniffer成功启动,

选择capture,只听“哗”的一声,整个世界清静了,我的本本蓝屏了,

从网上搜搜,原来sniffer不支持千兆网卡,mygod,

以后谁要再跟我说商业软件的支持和维护比自由软件好,我就跟谁急。

琢磨半天,要是给ethereal加个自由编辑报文发送的功能,固然不是不可行,

但不是朝夕之功,只能是自己写个测试程序了,好可怜

扩充ethereal解析自己的协议(九)

到此为止,我们已经完成了私有解析器的初步工作,我们注册了自己的解析器,

满足udp1234端口的报文送给了我们自己的解析函数,使用ethereal抓包,我们

可以看到,指定端口的报文已经不再显示简单的udp报文,而是显示成了我们自己

的协议类型。

下面我们要做的工作还有两个,一个是在protocolinfo栏目显示报文

的简要内容,二是解析报文内部的详细的属性。

这两个工作是通过解析函数的tree参数来区分的,如果tree参数为NULL,我们显示

报文的简要内容,否则显示报文细节。

完善后的解析器函数如下:

staticv

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2