我写了一个名为PLUGIN的wirehark解剖器。
现在,当我测试它时,由于某种原因,可以在wireshark上看到类型为X的数据包为PLUGIN(就像它应该的那样),之后的一些其他数据包,相同类型的X不能被视为PLUGIN。
其他数据包可以在.pcap中找到[TCP segment of a reassembled PDU]
问题是:为什么WireShark没有像X类型的第一个数据包一样剖析X类型的其他数据包并将其作为PLUGIN显示给我?
为什么解剖只是第一次起作用?
我使用函数来组装切碎数据包的片段:
tcp_dissect_pdus()
get_PLUGIN_message_len()
如“9.4.2。如何重新组合拆分TCP数据包”中所述
在“http://www.wireshark.org/docs/wsdg_html_chunked/ChDissectReassemble.html#TcpDissectPdus
”
这是解剖的功能: (FRAME_HEADER_LEN = 8)
static void
dissect_PROTOC(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
//Reassembling TCP fragments
tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN,
get_PROTOC_message_len, dissect_PROTOC_message);
}
static guint get_PROTOC_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)
{
/* the packet's size is "length" + 4bytes of TYPESIZE + 4bytes of LENGTHSIZE + 256bytes of CONTEXTIDSIZE */
return (guint)(tvb_get_ntohl(tvb, offset + 4) + CONTEXT_ID_SIZE + TYPE_SIZE + LENGTH_SIZE); /* e.g. length is at offset 4 */
}
static void dissect_PROTOC_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
/* my dissecting code */
guint32 packet_type = tvb_get_ntohl(tvb, 0);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "PROTOC");
/* Clear out stuff in the info column */
col_clear(pinfo->cinfo,COL_INFO);
col_add_fstr(pinfo->cinfo, COL_INFO, "%d > %d [%s]",pinfo->srcport, pinfo->destport,
val_to_str(packet_type, packettypenames, "Unknown (0x%02x)"));
if (tree) { /* we are being asked for details */
proto_item *ti = NULL;
proto_tree *PROTOC_tree = NULL;
proto_item *PROTOC_data = NULL;
proto_tree *PROTOC_data_tree = NULL;
guint32 type = 0;
guint32 length = 0;
gint offset = 0;
ti = proto_tree_add_item(tree, proto_PROTOC, tvb, 0, -1, ENC_NA);
proto_item_append_text(ti, ", Type: %s",
val_to_str(packet_type, packettypenames, "Unknown (0x%02x)"));
PROTOC_tree = proto_item_add_subtree(ti, ett_PROTOC);
//getting type
type = tvb_get_ntohl(tvb, offset);
proto_tree_add_item(PROTOC_tree, hf_PROTOC_pdu_type, tvb, 0, TYPE_SIZE, ENC_BIG_ENDIAN);
offset += TYPE_SIZE;
//getting length for the data length
length = tvb_get_ntohl(tvb, offset);
proto_tree_add_item(PROTOC_tree, hf_PROTOC_len, tvb, offset, LENGTH_SIZE, ENC_BIG_ENDIAN);
offset += LENGTH_SIZE;
proto_tree_add_item(PROTOC_tree, hf_PROTOC_contextid, tvb, offset, CONTEXT_ID_SIZE, ENC_BIG_ENDIAN);
offset += CONTEXT_ID_SIZE;
PROTOC_data = proto_tree_add_item(PROTOC_tree, hf_PROTOC_data, tvb, offset, length, FALSE);
PROTOC_data_tree = proto_item_add_subtree(PROTOC_data, ett_PROTOC_data);
offset += length;
}
}
更多信息:
我在某个十六进制编辑器上打开了file.pcap,我可以看到wireshark没有解析的数据包......
在wireshark内部我可以找到一个wireshark没有剖析的数据包,信息为:“[重新组装的PDU的TCP段]”,但它没有说明它属于哪个重组数据包,并且我无法在任何地方找到它......
答案 0 :(得分:1)
我推测你的计算长度与现实不符。如果wireshark认为它没有完成PDU所需的所有帧,那么我想它可能不会调用dissect_PROTOC_message()
您可以尝试打印计算出的长度,然后验证pcap文件是否包含那么多帧:
static guint get_PROTOC_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)
{
/* the packet's size is "length" + 4bytes of TYPESIZE + 4bytes of LENGTHSIZE + 256bytes of CONTEXTIDSIZE */
guint len = (guint)(tvb_get_ntohl(tvb, offset + 4) + CONTEXT_ID_SIZE + TYPE_SIZE + LENGTH_SIZE); /* e.g. length is at offset 4 */
g_warning("frame=%d PDU len=%d", pinfo->fd->num, len);
return len;
}