迷途书童

敏感、勤学、多思
随笔 - 77, 文章 - 4, 评论 - 86, 引用 - 0
数据加载中……

Ethereal抓包实时分析可行性研究

Ethereal是一个功能强大的抓包工具,它提供的GUI工具能将经过网卡的信令捕获并实时显示,但是在实际应用中,我们还可能要对捕获的日志进行分析,以获得自己关心的信令的统计结果,但是这样就面临着以下几个问题:
1. 当Ethereal自身提供的简单统计功能不能满足需求时,我们该怎么办?
2. Ethereal的GUI工具生成的日志是它专有的libpcap格式,不适合人类阅读,我们该怎么分析它?
本文针对上述问题提供了一整套的解决方案。

一. 用Ethereal实时捕获信令。

Ethereal提供了从命令行定制启动的方案。我们可以利用这个特点将capture file输出到指定的目录,这个capture file将被Ethereal实时更新。
下面是我写的一个windows bat文件,用该文件能做到最简单地启动Ethereal截包,不用用户学习怎样配置Ethereal。

…………………………………………………………………………………………………………
rem @echo off
set ETHEREAL_HOME="D:\Program Files\Ethereal\ethereal.exe"
set NETWORK_CARD="\Device\NPF_{D239E06D-D86E-4CFC-A360-0D74CDD21CAE}"
set ETHEREAL_OPT=-i %NETWORK_CARD%
set ETHEREAL_OPT=%ETHEREAL_OPT% -klSQ
set FILTER_STR="port 6000 or port 6001 or port 6002 or port 6003 or port 6004 or port 6005 or port 6006 or port 6007 or port 6008"
rem set ETHEREAL_OPT=%ETHEREAL_OPT% -f %FILTER_STR%
set ETHEREAL_OPT=%ETHEREAL_OPT% -o capture.real_time_update:TRUE -o capture.auto_scroll:TRUE -o capture.show_info:FALSE -o print.format:text -o print.destination:file -o print.file:ethereal.out
rem -a filesize:1000 files:5 -b filesize:1000 files:5
call %ETHEREAL_HOME% %ETHEREAL_OPT% -w c:\ethereal.out
…………………………………………………………………………………………………………
将上面这段script存为bat文件后,设置好ETHEREAL_HOME和网卡即可启动Ethereal截包。

二. 实时分析Ethereal的中间人实现。

“计算机科学中的所有问题都能通过中间人的方式解决。”这是精通EJB中强调了很多次的名言。
在上节所示的脚本中我们将Ethereal的存放日志的文件放在了“c:\ethereal.out”目录下,这个文件能被Ethereal实时更新,但是它的内容却是不可读的,我们可用Ethereal提供的Tethereal工具将此文件转换为适合人类阅读的文本。但是这个工具仅能将标准的capture file解析成可读文本并在标准输出设备显示(一般为显示器),没有找到将其另存为文本的方法,我们也不需要此方法。可以用java.lang.Runtime.exec()方法执行“tethereal -r infile.cap -V”,获得这个进程的对象后我们可以得到这个进程对象的输出流对象,接下来我们可以从这个输出流中读出结果进行分析。

三. 得到实时的统计结果
可以对从输出流中得到的可读结果进行分析,获得自己想要的统计结果。我们可以用一个线程以一定的时间间隔刷新此输出流,已达到用户认为的实时分析的效果。

参考:
http://www.ethereal.com
java doc
 
 

后来想到的更好的方案:

这种方式有一个显著的缺点,如果用户截包时间的变长,ethereal保存log的文件越来越大,将导致每次刷新输出流越来越耗资源,最后将导致工具无法使用。

新的解决方案就是用ethereal的命令行版本,tethereal就可以完美避免类似问题。

用java的runtime.exec()调用此脚本:

-------------------

set TETHEREAL_HOME="D:\Program Files\Ethereal\tethereal.exe"
rem call cmd /k %TETHEREAL_HOME% -r c:\ethereal.out -R tcp -T text -V
call cmd /k %TETHEREAL_HOME% -r c:\ethereal.out -T text -V

----------------

ethereal每截到一个数据包,便会将次包送给输出流。这样就能真正做到实时分析了。

posted on 2006-05-06 15:55 迷途书童 阅读(7141) 评论(5)  编辑  收藏 所属分类: java应用

评论

# re: Ethereal抓包实时分析可行性研究[未登录]  回复  更多评论   

shenme dong xi a,kan bu ming bai ya
2007-06-26 20:20 | yang

# re: Ethereal抓包实时分析可行性研究  回复  更多评论   

很经典的使用范例,支持,继续啊,最好,再讲讲Java的部分,说的再详细点就好了
2008-05-29 14:52 | useway

# re: Ethereal抓包实时分析可行性研究  回复  更多评论   

一楼的,这个文章写的那么清楚,你都看不懂,看来是有点笨。
给搂主一个建议,可以用-a参数,将文件大小限定。
2008-05-29 14:58 | useway

# re: Ethereal抓包实时分析可行性研究[未登录]  回复  更多评论   

这个确实很有用,我也是到了java部分,不知道怎么做.请问楼主可以详细解释吗?或者也给个代码。
2008-10-27 16:03 | ben

# re: Ethereal抓包实时分析可行性研究[未登录]  回复  更多评论   

经过运行,并不能实现实时效果。调用第二个脚本,只能获得调用脚本时获得的包信息,运行一段时间后,新来的包还是不能被解释,而用重新调用此脚本才能获得内容
2008-11-24 10:40 | ben

只有注册用户登录后才能发表评论。


网站导航: