2020年6月24日 星期三

libpcap

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

參考

  1. https://www.tcpdump.org/manpages/pcap.3pcap.html

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...