如何處理轉換后的數據
一些協議對數據進行巧妙的處理。他們可能會加密數據,壓縮數據或部分數據。如果您知道如何采取這些步驟,則可以在解剖器內將其反轉。
由于加密可能很棘手,因此讓我們考慮壓縮的情況。這些技術還可以用于其他數據轉換,在檢查數據之前需要一些步驟。
這里基本上需要發生的事情是,識別需要轉換的數據,獲取該數據并將其轉換為新的流,然后在其上調用解剖器。通常,這需要根據數據包中的線索“即時”完成。有時,這需要與其他技術結合使用,例如數據包重組。下面顯示了達到此效果的技術。
*Decompressing data packets for dissection. *
guint8 flags = tvb_get_guint8(tvb, offset);
offset ++;
if (flags & FLAG_COMPRESSED) { /* the remainder of the packet is compressed */
guint16 orig_size = tvb_get_ntohs(tvb, offset);
guchar *decompressed_buffer = (guchar*)wmem_alloc(pinfo->pool, orig_size);
offset += 2;
decompress_packet(tvb_get_ptr(tvb, offset, -1),
tvb_captured_length_remaining(tvb, offset),
decompressed_buffer, orig_size);
/* Now re-setup the tvb buffer to have the new data */
next_tvb = tvb_new_child_real_data(tvb, decompressed_buffer, orig_size, orig_size);
add_new_data_source(pinfo, next_tvb, "Decompressed Data");
} else {
next_tvb = tvb_new_subset_remaining(tvb, offset);
}
offset = 0;
/* process next_tvb from here on */
這里的第一步是識別壓縮。在本例中,標志字節提醒我們數據包的其余部分已壓縮。接下來,我們檢索數據包的原始大小,在本例中,該大小在協議中非常方便。如果不是,它可能是壓縮例程的一部分,以便為您計算出來,在這種情況下,邏輯將會不同。
因此,有了這樣的大小,使用pinfo→池內存中的wmem_alloc()分配一個緩沖區來接收未壓縮的數據,并將數據包解壓縮到其中。Tvb_get_ptr()函數用于從偏移量開始獲取指向數據包原始數據的指針。在這種情況下,解壓縮例程還需要知道長度,該長度由TVB_CAPTURE_LENGTH_RELEVING()函數給出。
接下來,我們使用TVB_NEW_CHILD_REAL_DATA()調用從該數據構建一個新的TVB緩沖區。此數據是原始數據的子級,因此調用此函數也會確認這一點。不需要調用tvb_set_free_cb(),因為使用了pinfo→池(當pinfo池生存期到期時,會自動釋放內存塊)。最后,我們將此TVB添加為一個新的數據源,這樣詳細的顯示既可以顯示解壓縮的字節,也可以顯示原始的字節。
設置完成后,分析器的其余部分可以分析緩沖區NEXT_TVB,因為它是一個新緩沖區,所以當我們從該緩沖區的開頭重新開始時,偏移量需要為0。為了使解析器的其余部分正常工作,而不管是否涉及壓縮,在未發出壓縮信號的情況下,我們使用TVB_NEW_SUBSET_RELEVING()根據舊緩沖區提供一個新緩沖區,但從當前偏移量開始,一直延伸到末尾。這使得從這一點開始對數據包進行完全相同的剖析,而不考慮壓縮情況。
Wireshark中文使用教程(開發版)
推薦文章: