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


  由於研究需要,用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就好了,不再需要考慮繁雜的字段過濾,算偏移地址之類的,減少了編程的工作量,何樂而不為?

條條大路通羅馬,不管怎樣,問題都有解決的方法,就看你喜歡哪種處理方式了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM