由于研究需要,用wireshark抓取了大量的modbus-tcp的数据包。由于需要对这些数据进行分析,而要分析的数据包又非常多,所以想要只分析每个报文的特定字段。
于是在网上找wireshark如何保存报文的特定字段。有部分人的做法是“自己动手,丰衣足食”,当然也有更简单的方法——用tshark。
tshark相当于是wireshark的命令行版本,能实现wireshark同样的过滤以及 分析。由于是命令行,因此数据的导出更加自由,全看参数怎样配置。
windows下,tshark在wireshark安装后的目录下,和wireshark.exe在同一目录下的还有capinfos.exe,dumpcap.exe,editcap.exe,mergecap.exe,rawshark.exe,text2pcap.exe,uninstall.exe(呵呵,没事别点这个,手贱卸载了的别找我),每个都有对应的文档,文档中给出了具体的命令行的参数和对应的功能。附网上找到的一个参数的说明图:
百度不让跨站,直接给出链接地址吧。
在即时抓包模式(-r未设定)时的各参数功能一览:
(url: http://hiphotos.baidu.com/yss1983/pic/item/5e484ea7462309f705d8b159720e0cf3d6cad6cf.jpg)
在文件读取分析模式时的各参数功能一览:
(url: http://hiphotos.baidu.com/yss1983/pic/item/5e484ea7462309f705d8b159720e0cf3d6cad6cf.jpg)
针对我的问题——过滤出每个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就好了,不再需要考虑繁杂的字段过滤,算偏移地址之类的,减少了编程的工作量,何乐而不为?
条条大路通罗马,不管怎样,问题都有解决的方法,就看你喜欢哪种处理方式了。