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
浙公网安备 33010602011771号