0

PLUGIN という名前の Wireshark ディセクタを作成しました。

これをテストしていると、何らかの理由でタイプ X のパケットが Wireshark で 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;

    }
}

詳しくは:

  1. file.pcap を 16 進エディタで開いたところ、wireshark が分析していないパケットが表示されました...

  2. Wireshark 内で、「[再構成された PDU の TCP セグメント]」という情報で、wireshark が分析しないパケットを見つけることができますが、どの再構成パケットに属しているかはわかりません。どこでも...

4

1 に答える 1

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;
}
于 2013-02-27T14:53:30.097 に答える