一、直接使用wireshark捕獲數據包並保存為文件
可以使用wireshark通過圖形界面的操作來實現捕獲數據包並保存為文件。
wireshark默認捕獲的數據包保存為臨時文件,如果最后退出時不選擇保存那么臨時文件將會被刪除。
可以在“菜單欄----捕獲----選項----輸出”窗口進行配置,指示wireshark直接將捕獲結果保存為文件。
文件----數據包要保存到的文件
輸出格式----數據包保存成的文件的文件格式
自動創建新文件----指示當當前文件達到某個指標后,就把后續數據包另存到另一個文件。(本質是通過關閉當前監聽新啟一個監聽來實現)
使用一個環形緩沖器----只保存為那么多個文件,數量用完后從頭形始覆蓋。
以如上配置為例,截獲結果如下:
二、使用tshark捕獲數據包並保存為文件
tshark就是命令行版的wireshark(基於wireshark的多種表示,感覺wireshark部份功能也是調用tshark來實現的),所以也可以通過tshark來實現同樣的效果。
使用-i指定網卡,使用-w實現文件,使用-F實現指定格式,使用-b實現自動創建新文件。
-i使用的網卡名,控制面版中看到的是什么就是什么,wireshark列出來的是什么就是什么。
Linux版形如:
tshark -i eth0 -b filesize:1024 -F pcap -w test_pcap.pcap
Windows版形如:
tshark -i "本地連接 2" -b filesize:1024 -F pcap -w test_pcap.pcap
三、使用pyshark捕獲數據包並保存為文件
3.1 直接無法捕獲數據包
pyshark本質是調用tshark,理論上捕獲代碼應形如下:
import pyshark tshark_path = 'D:\\tools\\Wireshark\\tshark.exe' capture = pyshark.LiveCapture(output_file="test_pcap.pcap",interface="本地連接 2",tshark_path=tshark_path) capture.sniff(timeout=10)
但是在python-3.6.6環境中無論是Linux還是Windows都捕獲不到數據包(<LiveCapture (0 packets)>)
追蹤代碼看到在沒指定網卡時pyshark是通過tshark -D來列出所有網卡,然后取網卡前序號形式來指定網卡
由上圖可以看到“本地連接 2”序號為6,但代碼改為形如下仍不能捕獲到數據包
(其實使用網卡名和網卡序號兩種方式tshark都是支持的,所以和這個無關;當然也不能算一定關系沒有,傳給pyshark的”本地連接 2“參數中間有空格,pyshark再傳給tshark時不會自動加上引號tshark會因格式不對啟不來,但這里也不是因為這個。)
import pyshark tshark_path = 'D:\\tools\\Wireshark\\tshark.exe' capture = pyshark.LiveCapture(output_file="test_pcap.pcap",interface="6",tshark_path=tshark_path) capture.sniff(timeout=10)
后來看網上也有類似的情況,說是版本問題(我當前是0.4.1也一樣的問題)而0.3.6.2版本是可以的,使用python2.7+0.3.6.2版本(pip install pyshark==0.3.6.2)確實可以成功保存數據包。
3.2 修改live_capture.py實現捕獲數據包並保存為文件
pyshark-0.3.6.2在python-3.6裝不上,要去用python2.7這是令人不爽的。
通過capture.set_debug()開啟打印debug信息可以看到是tshark報錯:tshark: You can't write both raw packet data and dissected packets to the standard output.排查之下發現是tshark的"-P"(打印匯總信息)和”-w -“(將原始數據包輸出到控制台)沖突所致。
簡單分析pyshark流程發現去除”-P“參數可解決捕獲不到數據包的問題。操作如下:
打開pyshark的live_capture.py移動到72行,將原先的params = ["-q", "-P"]修改為params = ["-q"]
參考: