如何利用協議
向協議添加Tap接口可以讓它做一些有用的事情。特別是,您可以從TAP界面生成協議統計信息。
竊聽基本上是一種允許其他項目在協議被剖析時看到正在發生的事情的方式。向主程序注冊一個TAP,然后在每次剖析時調用它。可以使用的例程提供一些任意協議特定的數據。
要創建tap,您首先需要注冊tap。TAP使用整數句柄注冊,并使用例程register_Tap()注冊。這需要一個字符串名稱來再次查找它。
Initialising a tap.
#include <epan/packet.h>
#include <epan/tap.h>
static int foo_tap = -1;
struct FooTap {
gint packet_type;
gint priority;
...
};
void proto_register_foo(void)
{
...
foo_tap = register_tap("foo");
盡管您可以在不使用協議特定數據的情況下對分接頭進行編程,但是它通常不是很有用。因此,最好聲明一個可以通過抽頭傳遞的結構。這必須是靜態結構,因為解剖例程返回后將使用它。通常,最好將要解剖的協議的某些通用部分選入Tap數據中。數據包的類型,優先級或狀態碼都可以。確實需要將該結構包含在頭文件中,以便其他想要監聽分接頭的組件可以包含該結構。
定義好這些內容之后,只需填充特定于協議的結構,然后調用tap_queue_packet,可能是解剖器的最后一部分。
*Calling a protocol tap. *
static int
dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
...
fooinfo = wmem_alloc(wmem_packet_scope(), sizeof(struct FooTap));
fooinfo->packet_type = tvb_get_guint8(tvb, 0);
fooinfo->priority = tvb_get_ntohs(tvb, 8);
...
tap_queue_packet(foo_tap, pinfo, fooinfo);
return tvb_captured_length(tvb);
}
現在,這使那些感興趣的各方可以收聽此協議對話的詳細信息。
如何生成協議統計信息
假設您有一個用于該協議的點擊界面,您可以使用它來生成一些有趣的統計數據。從協議痕跡中。
這可以在單獨的插件中完成,也可以在進行解析的同一插件中完成。后一種方案更好,因為TAP和STATS模塊通常依賴于共享協議特定的數據,這可能會在兩個不同的插件之間不同步。
以下是從上述TAP界面生成統計數據的機制。
*Initialising a stats interface. *
/* register all http trees */
static void register_foo_stat_trees(void) {
stats_tree_register_plugin("foo", "foo", "Foo/Packet Types", 0,
foo_stats_tree_packet, foo_stats_tree_init, NULL);
}
WS_DLL_PUBLIC_DEF void plugin_register_tap_listener(void)
{
register_foo_stat_trees();
}
從頭開始,首先定義插件接口入口點 plugin_register_tap_listener()。這簡單地稱為初始化函數 register_foo_stat_trees()。
這依次調用該stats_tree_register_plugin()函數,該函數需要三個字符串,一個整數和三個回調函數。
- 這是注冊的拍子名稱。
- 統計名稱的縮寫。
- stats模塊的名稱。“ /”字符可用于創建子菜單。
- 每個數據包回調的標志
- 將調用以生成統計信息的函數。
- 可以調用以初始化統計數據的函數。
- 將被調用以清除統計數據的函數。
在這種情況下,我們只需要前兩個功能,因為沒有特定的清理對象。
*Initialising a stats session. *
static const guint8* st_str_packets = "Total Packets";
static const guint8* st_str_packet_types = "FOO Packet Types";
static int st_node_packets = -1;
static int st_node_packet_types = -1;
static void foo_stats_tree_init(stats_tree* st)
{
st_node_packets = stats_tree_create_node(st, st_str_packets, 0, TRUE);
st_node_packet_types = stats_tree_create_pivot(st, st_str_packet_types, st_node_packets);
}
在這種情況下,我們創建一個新的樹節點來處理所有數據包,并作為其子級創建一個數據透視表來處理有關不同數據包類型的統計信息。
Generating the stats.
static int foo_stats_tree_packet(stats_tree* st, packet_info* pinfo, epan_dissect_t* edt, const void* p)
{
struct FooTap *pi = (struct FooTap *)p;
tick_stat_node(st, st_str_packets, 0, FALSE);
stats_tree_tick_pivot(st, st_node_packet_types,
val_to_str(pi->packet_type, msgtypevalues, "Unknown packet type (%d)"));
return 1;
}
在這種情況下,統計信息的處理非常簡單。首先,我們調用 tick_stat_node了st_str_packets包的節點,數包。然后調用stats_tree_tick_pivot()的st_node_packet_types子樹可以讓我們記錄下數據包類型統計。
Dl2wrs:從CORBA IDL文件創建解析器
它是什么?
您可能已經從名稱中猜到,idl2wrs獲取用戶指定的IDL文件,并嘗試構建一個解析器,該解析器可以解碼GIOP上的IDL流量。結果文件是“C”代碼,作為Wireshark解析器應該可以正常編譯。
Idl2wrs解析omniidl編譯器提供給它的數據結構,并使用Packet-giop.[CH]中提供的GIOP API生成get_cdr_xxx調用來解碼網絡上的CORBA流量。
它由4個主文件組成。
README.idl2wrs
這是一個文件
wireshark_be.py
主編譯器后端
wireshark_gen.py
一個幫助類,它生成C代碼。
idl2wrs
最終用戶應使用一個簡單的Shell腳本包裝程序從IDL文件生成解析器。
為什么這樣
重要的是要了解GIOP / IIOP上的CORBA流量是什么樣的,并幫助構建一個可幫助解決CORBA互通問題的工具。在看到了很多關于如何在八位字節流中表示特定IDL類型的討論之后,情況尤其如此。
我也有意見/反饋,當教學生CORBA流量看起來像“在線”時,此工具非常適合說CORBA課。
如何使用idl2wrs
要使用idl2wrs生成Wireshark解析器,您需要以下內容:
- 必須安裝Python。參見https://python.org/
omniidl必須提供omniORB軟件包中的。見http://omniorb.sourceforge.net/- 當然,您需要安裝Wireshark來編譯代碼并根據需要對其進行調整。idl2wrs是標準Wireshark發行版的一部分
要使用idl2wrs從idl文件生成Wireshark解剖器,請使用以下過程:
將C代碼寫入stdout。
$ idl2wrs <your_file.idl>
e.g.:
$ idl2wrs echo.idl要寫入文件,只需重定向輸出即可。
$ idl2wrs echo.idl > packet-test-idl.c
您可能希望注釋掉register_giop_user_module()代碼,這將使您感到啟發式解剖。
如果您不想使用Shell腳本包裝器,請嘗試執行步驟3或4。
- 將C代碼寫入stdout。
$ omniidl -p ./ -b wireshark_be
e.g.:
$ omniidl -p ./ -b wireshark_be echo.idl - 要寫入文件,只需重定向輸出即可。
$ omniidl -p ./ -b wireshark_be echo.idl > packet-test-idl.c
您可能希望注釋掉register_giop_user_module()代碼,這將使您感到啟發式解析器。 - 將生成的C代碼復制到Wireshark源目錄內的子目錄epan / dissectors /中。
$ cp packet-test-idl.c /dir/where/wireshark/lives/epan/dissectors/
新的解析器必須添加到同一目錄中的CMakeLists.txt中。查找聲明DISSECTOR_SRC,然后在其中添加新的解析器。例如
DISSECTOR_SRC = \
${CMAKE_CURRENT_SOURCE_DIR}/packet-2dparityfec.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-3com-njack.c
...
becomes
DISSECTOR_SRC = \
${CMAKE_CURRENT_SOURCE_DIR}/packet-test-idl.c \
${CMAKE_CURRENT_SOURCE_DIR}/packet-2dparityfec.c \
${CMAKE_CURRENT_SOURCE_DIR}/packet-3com-njack.c \
...
對于下一步,請轉到Wireshark源目錄的頂部。
- 創建一個構建目錄
$ mkdir build && cd build
- 運行cmake
$ cmake ..
- 構建代碼
$ make
Wireshark中文使用教程(開發版)
推薦文章: