wireshark

   wireshark 的协议注册处理架构

 协议分析显示函数 加到  register_all_protocols  函数中.

proto_register_oxid (void) {
proto_oxid = proto_register_protocol ("DCOM OXID Resolver", "IOXIDResolver", "oxid"); proto_register_field_array (proto_oxid, hf, array_length (hf)); proto_register_subtree_array (ett, array_length (ett));
}

register_dissector() : 注册协议解析器

proto_register_field_array() : 注册协议参数

proto_register_subtree_array(): 注册协议解析子树

1 void proto_reg_handoff_oxid (void)
2 {
3     /* Register the protocol as dcerpc */
4     dcerpc_init_uuid (proto_oxid, ett_oxid, &uuid_oxid, ver_oxid, oxid_dissectors, hf_oxid_opnum);
5 }

 这个函数加入到register_all_protocol_handoffs函数中 ,  用来告诉系统怎么样发现这个协议。

oxid 的解析函数也放到了发现函数里。

 

这是ftp的发现函数: 

void
proto_reg_handoff_ftp(void)
{
    dissector_handle_t ftp_handle;

    ftpdata_handle = find_dissector("ftp-data");
    dissector_add_uint("tcp.port", TCP_PORT_FTPDATA, ftpdata_handle);
    ftp_handle = find_dissector("ftp");
    dissector_add_uint("tcp.port", TCP_PORT_FTP, ftp_handle);
}

/*

显示函数

 tvbuff_t是wireshark中的一个主要结构体,数据报文即都放在这里面,然后使用偏移的方式查找具体数据 

packet_info主要是包的一些信息,描述包的具体内容。tvbuff_t是纯报文,packet_info则是具体报文信息

proto_tree是wireshark中的协议数,用来挂载解析到的数据 

 

*/

 

 1 static int
 2 dissect_oxid_resolve_oxid2_resp(tvbuff_t *tvb, int offset,
 3     packet_info *pinfo, proto_tree *tree, guint8 *drep) 
 4 {
 5     guint32 u32Pointer;
 6     guint32 u32ArraySize;
 7     e_uuid_t ipid;
 8     guint32 u32AuthnHint;
 9     guint16 u16VersionMajor;
10     guint16 u16VersionMinor;
11     guint32 u32HResult;
12 
13 
14     offset = dissect_dcom_dcerpc_pointer(tvb, offset, pinfo, tree, drep,
15                         &u32Pointer);
16     if (u32Pointer) {
//第一个字段是32位的长度
17 offset = dissect_dcom_dcerpc_array_size(tvb, offset, pinfo, tree, drep, 18 &u32ArraySize); 19 //dom的字符串都有统一的处理格式,定位这个字符串的偏移,
//hf_oxid_binding 在proto_register_field_array函数中注册过
//具体显示通过调用proto_tree_add_item 等函数进行的
20 offset = dissect_dcom_DUALSTRINGARRAY(tvb, offset, pinfo, tree, drep, 21 hf_oxid_bindings, NULL); 22 //下一个定位的项是uuid格式 23 offset = dissect_dcom_UUID(tvb, offset, pinfo, tree, drep, 24 hf_oxid_ipid, &ipid); 25 26 offset = dissect_dcom_DWORD(tvb, offset, pinfo, tree, drep, 27 hf_oxid_authn_hint, &u32AuthnHint); 28 29 offset = dissect_dcom_COMVERSION(tvb, offset, pinfo, tree, drep, 30 &u16VersionMajor, &u16VersionMinor); 31 } 32 33 offset = dissect_dcom_HRESULT(tvb, offset, pinfo, tree, drep, 34 &u32HResult); 35 36 col_append_fstr(pinfo->cinfo, COL_INFO, " -> %s", 37 val_to_str(u32HResult, dcom_hresult_vals, "Unknown (0x%08x)") ); 38 39 return offset; 40 }

ISystemActivator : 解析

 proto_reg_handoff_ISystemActivator

posted @ 2018-05-03 22:23  stachal  阅读(481)  评论(0)    收藏  举报