Wireshark原始碼分析(二)

2021-10-06 16:21:53 字數 1996 閱讀 5828

wireshark是乙個網路封包分析工具。可通過winpcap直接對網絡卡資料進行抓包,並通過內建協議進行分析展示。

本人主要通過wireshark對無線通訊3gpp協議進行展開分析。

用cmake構建專案,使用 glib庫 + c語言 實現協議解析,前端使用qt進行介面展示。

wireshark啟動時,需要對所有解析器進行初始化和註冊。包括協議名稱、各個欄位的資訊、過濾用的關鍵字、要關聯的下層協議與埠(handoff) 等。在解析過程,每個解析器負責解析自己的協議部分,然後把上層封裝資料傳遞給後續協議解析器,這樣就構成乙個完整的協議棧解析。

解析鏈條的最上端是frame解析器,它負責解析pcap幀頭。後續該呼叫哪個解析器,是通過上層協議註冊 handoff 資訊時寫在當前協議的 hash表來查詢的。

程式入口

int main(int argc, char *qt_ar**)

\ui\qt\main.cpp

記憶體管理檔案

一套完整的自己實現的記憶體管理框架。

wmem 替代了舊版的 emem.

使用3個全域性範圍的記憶體空間進行管理。

packet_scope、file_scope、epan_scope

\epan\wmem\wmem_core.c

解析器檔案

proto_init -> register_all_protocols -> g_async_queue_new

\epan\epan.c

註冊檔案

開啟新的執行緒對1560多個協議註冊。

\epan\register.c

異常管理

一套完整的自己實現的異常管理框架。

協議初始化

epan_init(register_cb cb, gpointer client_data, gboolean load_plugins)

記憶體初始化

wmem_init(void)

外掛程式初始化

plugins_init(plugin_type_e type)

協議註冊初始化

proto_init(...)

註冊所有協議

register_all_protocols(register_cb cb, gpointer cb_data)

——  register_all_protocols_worker(void *arg _u_)

註冊所有協議

proto_register_***()

註冊協議棧

register_all_protocol_handoffs(register_cb cb, gpointer cb_data)

——  register_all_protocol_handoffs_worker(void *arg _u_)

註冊依賴協議

proto_reg_handoff_***()

epan_dissect_new(...)

epan_dissect_init(...)

當寫乙個解析器時,記憶體申請類似於malloc 或者 g_malloc分配記憶體,所有需要包含wmem.h;或者可以建立記憶體池。

記憶體池是乙個隱晦的指標到乙個wmem_allocator_t型別的物件。

每個記憶體池都定義乙個生命週期,或者範圍,之後所有內存在池中都無條件釋放。

當你在池中申請記憶體時,必須意識生命週期:如果生命週期比你需要的短,包含use-after-free bugs;如果生命週期比你需要的長,可能包含檢測不到的記憶體洩漏。

包含記憶體管理標頭檔案的解析器將有3個池可用:wmem_packet_scope(),  wmem_file_scope(),  wmem_epan_scope();

資料報池的作用域為每個資料報的解析, 這意味著在其中分配的任何源記憶體都將在當前一批源資料報的末尾自動釋放。檔案池的作用域類似於每個檔案的解析, 這意味著當關閉現有當前捕獲檔案時, 在其中分配的任何記憶體都將自動釋放。

二 LinkedList原始碼分析

二 linkedlist原始碼分析 上篇看了下arraylist原始碼,這篇記錄下linkedlist原始碼分析 linkedlist 繼承 abstractsequentiallist 提供了對元素順序訪問的抽象 linkedlist 實現 deque介面,底層構成雙向鍊錶結構 linkedlis...

Spring原始碼分析(二)

針對spring中bean初始化時擴充套件類執行順序進行分析 通過getbean逐層最終到bean例項化前後呼叫的方法,主要是aware介面 beanpostprocessor initializingbean init method的呼叫順序 abstractbeanfactory dogetbe...

Jquery原始碼分析 二)

prk 2008 08 12 型別 說明 dom element 第乙個引數為dom元素,第二個引數不用。直接把dom元素存在新生成的jquery物件的集合中。返回這個jquery物件。構建jquery物件完成。string 第乙個引數為string有三種情況 1 html的標籤字串,html ar...