wireshark開發——抓包

1. 對libpcap添加新的抓包類型

下面的內容來自於開發者郵件組的內容片段,主要描述關於為wireshark添加ISO 9141及 14230。

對於libpcap而言,我們要做的第一件事就是為所需的鏈路層協議獲取DLT_*值。如果ISO9141和14230使用相同的鏈路層協議,那麼它們應該是可以共享DLT_*值的,唯一能夠作為了解運行再鏈路層之上的協議類型的判斷根據就是先弄清楚鏈路層協議本身是哪種類型,這種情況下我們可能更希望使用單獨的DTL_*值。

接下來與libpcap相關的討論,我們都假設使用的是libpcap1.0及以上版本,並且我們是在UNIX/Linux相關平台上。我們不建議使用比1.0更老的版本,即使我們當前使用的操作系統平台已經包含了更老的libpcap版本,我們也不建議使用,因為它們相對於標準網路介面而言,對於設備的支持已經不夠友好。

Advertisements

然後我們可能需要加入pcap_open_live()函數,這個函數應該在任何平台都能正常運行。它有可能用於檢查類似於串列埠名稱的設備名稱,如果檢查成功,就會調用一個程序來打開串列埠。

可以查看示例代碼:位於文件pcap-linux.c 及 pcap-bpf.c的#ifdef HAVE_DAG_API。

串列介面的打開程序將打開串列介面,設置波特率以及其他必要的事情以成功打開設備。它將分配一個pcap_t,將其成員fd設置為串列設備的文件描述符,將其成員snapshot設置為傳遞給打開設備的程序的參數,將其成員linktype設置為其中的一個DTL_*值,將其成員selectable_fd設置為和fd一樣的值。我們也應該將dlt_count成員設置為DTL_*值,並且分配一個數組dlt_count u_int+s將其賦值給+dlt_list成員,並且將這個list全部填充為DTL_*值。

Advertisements

然後我們需要設置*_op變數指向相應操作的程序。

read_op指向的程序從設備讀取包。

inject_op可以用於發送包,如果我們不需要關心這些,我們可以將其指向直接返回錯誤的程序。

setfilter_op可以直接設置為install_bpf_program。

set_datalink用於設置linktype變數為OBD的某個值,否則它會返回一個錯誤。

getnonblock_op可以設置為pcap_getnonblock_fd。

setnonblock_op可以設置為pcap_setnonblock_fd。

stats_op可以指向一個報告狀態的程序。

close_op可以設置為pcap_close_common。

如果存在不止一個DLT_*值,我們一定是需要一個set_datalink程序的,從而使得用戶可以選擇合適的鏈路層類型。

對於wireshark而言,我們需要在wiretap/libpcap.c添加DLT_*值的支持,這意味著在wtap.h文件以及wiretap/ wtap.c文件的encap_table[]表添加一個或多個WTAP_ENCAP類型。然後我們需要為鏈路層協議或者相關協議寫解析器,並且使得它們能夠與wtap_encap解析表一起自行註冊,註冊時帶上正確的WTAP_ENCAP值,調用的函數為dissector_add_uint()。

Advertisements

你可能會喜歡