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每截到一个数据包,便会将次包送给输出流。这样就能真正做到实时分析了。