您的位置:首页 > 其它

wireshark提取保存部分报文特定字段之tshark

2016-12-13 22:21 1146 查看
由于研究需要,用wireshark抓取了大量的modbus-tcp的数据包。由于需要对这些数据进行分析,而要分析的数据包又非常多,所以想要只分析每个报文的特定字段。

于是在网上找wireshark如何保存报文的特定字段。有部分人的做法是“自己动手,丰衣足食” (winpcap/libpcap抓包,用程序抽取出特定字段进行分析),当然也有更简单的方法——用tshark。

tshark相当于是wireshark的命令行版本,能实现wireshark同样的过滤以及 分析。由于是命令行,因此数据的导出更加自由,全看参数怎样配置。

windows下,tshark在wireshark安装后的目录下,和wireshark.exe在同一目录下的还有capinfos.exe,dumpcap.exe,editcap.exe,mergecap.exe,rawshark.exe,text2pcap.exe,uninstall.exe(呵呵,没事别点这个,手贱卸载了的别找我),每个都有对应的文档,文档中给出了具体的命令行的参数和对应的功能。

针对我的问题——过滤出每个modbus-tcp报文中的ip地址和reference_number,有两种思路:

(1)用tshark命令行直接将相应的数据输出到文本文件,具体指令参考同一目录下的tshark.html参考文档的说明。

命令:

tshark -r "d:\test.pcap" -R "tcp and modbus_tcp.len==6" -n -T fields -e modbus_tcp.reference_num>"D:\test.txt"


-r "d:\test.pcap"===>读取的原始报文文件为d盘下的test.pcap

-R "tcp and modbus_tcp.len==6"===>报文过滤规则,相当于wireshark中的Filter部分填的内容,需要用双引号引起来。

-n===>禁用名称解析功能

-T fields -e modbus_tcp.reference_num===>输出部分,-T可以有几个不同的参数,fields参数代表的是字段,用-e添加显示的区域,

-e modbus_tcp.reference_num代表在输出中加入modbus_tcp.reference_num字段,这个字段只要在wireshark中支持解析,这里就能支持。

>"D:\test.txt"===>将输出重定向到D盘test.txt下。


(2)用tshark或wireshark将数据输出到xml,再处理xml。

因为有时候用第一种方式并不能显示所有的数据,比如非文本的

  [2.1]tshark中输出到xml方式,参数中添加-T pdml  (pdml:pdml Packet Details Markup Language)。

用wireshark更简单,File>Export>File>保存类型选择PDML,Packet Range选择Displayed,All Packets,即保存得到xml格式的数据。

  [2.2]从得到的xml中提取出想要的数据。这里又有很多不同的处理方式。

  如果仅仅是为了分析,数据量又不大,直接分析特定字段,用带xml分析的软件查看即可,如UltraEdit自带的xml分析功能。



当然这个用处不大,和wireshark本身的分析功能没什么区别。

因此用程序读取xml文件比较合适,可以用C++结合各自xml的库,比如tinyxml,或者用python,写程序提取出xml中想要的字段,前面的UlterEdit可以作为程序编写时xml结构的辅助参考工具。

自己写程序灵活性就很大了,与直接冲plain text开始,写程序过滤相比,相当于可以利用wireshark自带的数据解析功能先对数据进行预解析,这样只要解析xml就好了,不再需要考虑繁杂的字段过滤,算偏移地址之类的,减少了编程的工作量,何乐而不为?

条条大路通罗马,不管怎样,问题都有解决的方法,就看你喜欢哪种处理方式了。

另一篇博客http://blog.sina.com.cn/s/blog_6a00518c0100xevk.html

1. telnet on bts
2. #tcpdump -i eth3 -R tcp -s 1600 -w /tmp/eNB52.pcap
3. copy to local PC in which decoder nsnti is installed .
4. - 若需指定特定协议(tcp为例)特定端口(49392为例)的消息用特定译码器(nsnti为例)来译码:
     #tshark
-r eNB52.pcap -d tcp.port=49392,nsnti -V > D:/decoded.txt
   -
若不需特定译码器:
     #tshark
-r eNB52.pcap -V > D:/decoded.txt

Reference:
1. http://sharkfest.wireshark.org/sharkfest.10/A-6_Blok Lab Guide.pdf

2. http://www.wireshark.org/docs/man-pages/tshark.html
3. 简单把玩tethereal/tshark

 -----------------------简单把玩tethereal/tshark b
egin--------------------------------------------

(Ethereal是一个很流行的开源sniffer,支持包括solaris在内的很多平台。2006年初,主导Ethereal源码的大牛Gerald
Combs跳槽到了CACE公司。原来“Ethereal”的商标就不能用了。伟大的开源项目如果因此而over,不免同好者唏嘘。怎么办?Combs等人只得舍弃人气既旺的Ethereal名号,将项目更名为Wireshark。 它吸引了大多数原来Ethereal的contributor,从Ethereal的fork点0.99.1开始,继续添加无数令人兴奋的新功能。这个互 联网的放大镜,展现给了我们一个生动却又枯燥,温馨伴着冷漠,充满智慧的流量和阴谋的机关,不舍虚构而又看似真实的“以太”世界。

Ethereal的玩法如大多sniffer。更有趣之处在于它提供了命令行的抓包程序tethereal(现在改名为tshark)等一系列命令行工具,能够无缝地融入unix/windows脚本语言,使嗅探、分析的工作更得强援。

tethereal/tshark位于图形化软件的相同目录内。和大多数unix脚本一样,它都提供了比较翔实的man
page(个人认为,可惜例子还是少了一点)。

以下试验均基于windows平台的Wireshark,版本0.99.3。

基本语法:tshark [ -a <capture autostop condition> ] ...
-b <capture ring buffer option>] ... [ -B <capture buffer size (Win32 only)> ]  [ -c <capture packet count> ]
-d <layer type>==<selector>,<decode-as protocol> ] [ -D ] [ -f <capture filter> ] [ -F <file format> ] [ -h ]
-i <capture interface>|- ] [ -l ] [ -L ] [ -n ] [ -N <name resolving flags> ] [ -o <preference setting> ] ...
-p ] [ -q ] [ -r <infile> ] [ -R <read (display) filter> ] [ -s <capture snaplen> ] [ -S ]
-t ad|a|r|d ] [ -T pdml|psml|ps|text ] [ -v ] [ -V ] [ -w <outfile>|- ] [ -x ]
-X <eXtension option>] [ -y <capture link type> ] [ -z <statistics> ]

根据试验,参数的书写有讲究。模仿tcpdump,可以把抓包过滤表达式写在命令的最后。 一般将抓包表达式用引号quote起来(在windows上是双引号"),一是为了视觉方便,一是为了逃避其中字符和shell语法的冲突(如“>”,“||”等)。抓包过滤表达式也可以写在-f参数的后面,注意,此时更应该使用引号或者将-f放在最后。否则,它们会认为-f(可省)后面 的参数都是表达式的一部分,而导致命令格式混乱。

主要参数分类含义权作解说如下:

1. 抓包接口类

-i 设置抓包的网络接口,不设置则默认为第一个非自环接口。

-D 列出当前存在的网络接口。在不了解OS所控制的网络设备时,一般先用“tshark
-D”查看网络接口的编号以供-i参数使用。

-f 设定抓包过滤表达式(capture filter
expression)。抓包过滤表达式的写法雷同于tcpdump,可参考tcpdump
man page的有关部分。

-s 设置每个抓包的大小,默认为65535,多于这个大小的数据将不会被程序记入内存、写入文件。(这个参数相当于tcpdump的-s,tcpdump默认抓包的大小仅为68)

-p 设置网络接口以混合模式工作,即只关心和本机有关的流量。

-B 设置内核缓冲区大小,仅对windows有效。

-y 设置抓包的数据链路层协议,不设置则默认为-L找到的第一个协议,局域网一般是EN10MB等。

-L 列出本机支持的数据链路层协议,供-y参数使用。   

2. 抓包停止条件

-c 抓取的packet数,在处理一定数量的packet后,停止抓取,程序退出。

-a 设置tshark抓包停止向文件书写的条件,事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式,如“-a
duration:5”表示tshark启动后在5内抓包然后停止;“-a
filesize:10”表示tshark在输出文件达到10kB后停止;“-a
files:n”表示tshark在写满n个文件后停止。(windows版的tshark0.99.3用参数“-a
files:n”不起作用——会有无数多个文件生成。由于-b参数有自己的files参数,所谓“和-b的其它参数结合使用”无从说起。这也许是一个bug,或tshark的man
page的书写有误。)

3. 文件输出控制

-b 设置ring
buffer文件参数。ring buffer的文件名由-w参数决定。-b参数采用test:value的形式书写。“-b
duration:5”表示每5秒写下一个ring
buffer文件;“-b filesize:5”表示每达到5kB写下一个ring
buffer文件;“-b files:7”表示ring
buffer文件最多7个,周而复始地使用,如果这个参数不设定,tshark会将磁盘写满为止。

4. 文件输入

-r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量,又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。

5. 处理类

-R 设置读取(显示)过滤表达式(read
filter expression)。不符合此表达式的流量同样不会被写入文件。注意,读取(显示)过滤表达式的语法和底层相关的抓包过滤表达式语法不相同,它的语法表达要丰富得多,请参考http://www.ethereal.com/docs/dfref/http://www.ethereal.com/docs/man-pages/ethereal-filter.4.html。类似于抓包过滤表达式,在命令行使用时最好将它们quote起来。

-n 禁止所有地址名字解析(默认为允许所有)。

-N 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析。

-d 将指定的数据按有关协议解包输出。如要将tcp
8888端口的流量按http解包,应该写为“-d
tcp.port==8888,http”。注意选择子和解包协议之间不能留空格。

6. 输出类

-w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数。

-F 设置输出raw数据的格式,默认为libpcap。“tshark
-F”会列出所有支持的raw格式。

-V 设置将解码结果的细节输出,否则解码结果仅显示一个packet一行的summary。

-x 设置在解码输出结果中,每个packet后面以HEX
dump的方式显示具体数据。

-T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text。

-t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)。

-S 在向raw文件输出的同时,将解码结果打印到控制台。

-l 在处理每个包时即时刷新输出。

-X 扩展项。

-q 设置安静的stdout输出(例如做统计时)

-z 设置统计参数。

7. 其它

-h 显示命令行帮助。

-v 显示tshark的版本信息。

-o 重载选项。

在即时抓包模式(-r未设定)时的各参数功能一览:

在文件读取分析模式时的各参数功能一览:

 -----------------------简单把玩tethereal/tshark end--------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: