由于研究需要,用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
根据试验,参数的书写有讲究。模仿tcpdump,可以把抓包过滤表达式写在命令的最后。 一般将抓包表达式用引号quote起来(在windows上是双引号"),一是为了视觉方便,一是为了逃避其中字符和shell语法的冲突(如“>”,“||”等)。抓包过滤表达式也可以写在-f参数的后面,注意,此时更应该使用引号或者将-f放在最后。否则,它们会认为-f(可省)后面 的参数都是表达式的一部分,而导致命令格式混乱。
主要参数分类含义权作解说如下:
1. 抓包接口类
2. 抓包停止条件
3. 文件输出控制
4. 文件输入
5. 处理类
6. 输出类
7. 其它
在即时抓包模式(-r未设定)时的各参数功能一览:
在文件读取分析模式时的各参数功能一览:
-----------------------简单把玩tethereal/tshark end--------------------------------------------