libpcap 是封包擷取的 C/C++ 函式庫,可以過濾網路界面或 pcap 檔的封包,存成 pcap 檔。
使用前都要開啟取得 pcap handle,此時可以設定過濾條件,然後才能讀取封包。封包讀取後可以作各種處理,包括存成 pcap 檔。
開啟
無論是網路界面或 pcap 檔,都需要開啟取得 pcap handle -- pcap_t。即使沒有者兩個來源,只是要產生過濾程式碼或寫 pcap 檔,也需要開啟一個「假」的。
- 網路界面:pcap_create() → 設定選項 → pcap_activate()。
- pcap_findalldevs() 列出界面,然後 pcap_freealldevs() 釋出。
- pcap_lookupdev() 取得第一個非「loopback」的界面。
- 讀取權限
- pcap 檔案:pcap_open_offline() 或 pcap_fopen_offline()。
- 「假」的:pcap_open_dead()
關閉 pcap_t 用 pcap_close()。
* pcap handle 設定
* 網路界面 link 信頭 type 及設定
讀取封包
讀取封包:pcap_dispatch(), pacp_loop(), pcap_next(), pcap_next_ex()。過濾
讀取之前可以先過濾。如果可能的話,過濾網路界面的封包會在 kernel 裡進行,不需要的封包就不用從 kernel 複製出來。過濾表示式是一個字串,由 pcap_compile() 編譯成虛擬機器程式碼,然後透過 pcap_setfilter() 設給 pcap_t,或者用 pcap_offline_filter() 套用在已讀取的封包看是否符合。
產生的虛擬機器程式碼用 pcap_freecode() 釋出。特定過濾表示式編譯時可能需要 network mask,pcap_lookupnet() 可用來網路界面的位址和 mask。
存封包
寫 pcap 檔:pcap_dump_open() -> pcap_dump() -> pcap_dump_close()。統計
統計送封包
pcap_inject() 或 pcap_sendpacket() 送封包到網路界面。兩者相同,只是前者回傳送出幾 byte,後者回傳 0 表成功。回報錯誤
回報錯誤取得版本資訊
取得版本資訊使用 libpcap (或 windows 下 winpcap) 的程式
- tcpdump:limited protocol decoding but 大多 *NIX 平台有。capture filter
- wireshark:功能強大的網路分析程式。capture filter。可用 tcpdump 擷取,然後用 wireshark 分析。
- tshark:wireshark 指令行版本。
- dumpcap:wireshark 的一部分,只能擷取封包。
- ettercap:用來 injecting traffic
- OpenWrt
參考
- https://www.tcpdump.org/manpages/pcap.3pcap.html
沒有留言:
張貼留言