aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2010-08-28 19:46:20 +0000
committerGerald Combs <gerald@wireshark.org>2010-08-28 19:46:20 +0000
commit5fb37af39a7a79e667ef2b8e694e106187bab7b1 (patch)
tree965245f93e0b225f1500f627dbd17ebcb943d308
parenta96e6b2047cce1c671f476ae26c81ee8afb7ca12 (diff)
De-obfuscate the Teredo client address and add a de-obfuscated port.
svn path=/trunk/; revision=33982
-rw-r--r--epan/dissectors/packet-ipv6.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/epan/dissectors/packet-ipv6.c b/epan/dissectors/packet-ipv6.c
index 7f41a41a24..eca90b3910 100644
--- a/epan/dissectors/packet-ipv6.c
+++ b/epan/dissectors/packet-ipv6.c
@@ -103,18 +103,21 @@ static int hf_ipv6_src_host = -1;
static int hf_ipv6_src_sa_mac = -1;
static int hf_ipv6_src_isatap_ipv4 = -1;
static int hf_ipv6_src_teredo_server_ipv4 = -1;
+static int hf_ipv6_src_teredo_port = -1;
static int hf_ipv6_src_teredo_client_ipv4 = -1;
static int hf_ipv6_dst = -1;
static int hf_ipv6_dst_host = -1;
static int hf_ipv6_dst_sa_mac = -1;
static int hf_ipv6_dst_isatap_ipv4 = -1;
static int hf_ipv6_dst_teredo_server_ipv4 = -1;
+static int hf_ipv6_dst_teredo_port = -1;
static int hf_ipv6_dst_teredo_client_ipv4 = -1;
static int hf_ipv6_addr = -1;
static int hf_ipv6_host = -1;
static int hf_ipv6_sa_mac = -1;
static int hf_ipv6_isatap_ipv4 = -1;
static int hf_ipv6_teredo_server_ipv4 = -1;
+static int hf_ipv6_teredo_port = -1;
static int hf_ipv6_teredo_client_ipv4 = -1;
static int hf_ipv6_opt_pad1 = -1;
static int hf_ipv6_opt_padn = -1;
@@ -1454,18 +1457,28 @@ dissect_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_HIDDEN(ti);
} else if (tvb_get_ntohl(tvb, offset + IP6H_SRC) == 0x20010000) { /* RFC 4380 section 4 */
+ guint16 mapped_port = tvb_get_ntohs(tvb, offset + IP6H_SRC + 10) ^ 0xffff;
+ guint32 client_v4 = tvb_get_ipv4(tvb, offset + IP6H_SRC + 12) ^ 0xffffffff;
+
ti = proto_tree_add_item(ipv6_tree, hf_ipv6_src_teredo_server_ipv4, tvb,
offset + IP6H_SRC + 4, 4, FALSE);
PROTO_ITEM_SET_GENERATED(ti);
- ti = proto_tree_add_item(ipv6_tree, hf_ipv6_src_teredo_client_ipv4, tvb,
- offset + IP6H_SRC + 12, 4, FALSE);
+ ti = proto_tree_add_uint(ipv6_tree, hf_ipv6_src_teredo_port, tvb,
+ offset + IP6H_SRC + 10, 2, mapped_port);
+ PROTO_ITEM_SET_GENERATED(ti);
+ ti = proto_tree_add_ipv4(ipv6_tree, hf_ipv6_src_teredo_client_ipv4, tvb,
+ offset + IP6H_SRC + 12, 4, client_v4);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_item(ipv6_tree, hf_ipv6_teredo_server_ipv4, tvb,
offset + IP6H_SRC + 4, 4, FALSE);
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_HIDDEN(ti);
- ti = proto_tree_add_item(ipv6_tree, hf_ipv6_teredo_client_ipv4, tvb,
- offset + IP6H_SRC + 12, 4, FALSE);
+ ti = proto_tree_add_uint(ipv6_tree, hf_ipv6_teredo_port, tvb,
+ offset + IP6H_SRC + 10, 2, mapped_port);
+ PROTO_ITEM_SET_GENERATED(ti);
+ PROTO_ITEM_SET_HIDDEN(ti);
+ ti = proto_tree_add_ipv4(ipv6_tree, hf_ipv6_teredo_client_ipv4, tvb,
+ offset + IP6H_SRC + 12, 4, client_v4);
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_HIDDEN(ti);
}
@@ -1512,18 +1525,28 @@ dissect_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_HIDDEN(ti);
} else if (tvb_get_ntohl(tvb, offset + IP6H_DST) == 0x20010000) { /* RFC 4380 section 4 */
+ guint16 mapped_port = tvb_get_ntohs(tvb, offset + IP6H_DST + 10) ^ 0xffff;
+ guint32 client_v4 = tvb_get_ipv4(tvb, offset + IP6H_DST + 12) ^ 0xffffffff;
+
ti = proto_tree_add_item(ipv6_tree, hf_ipv6_dst_teredo_server_ipv4, tvb,
offset + IP6H_DST + 4, 4, FALSE);
PROTO_ITEM_SET_GENERATED(ti);
- ti = proto_tree_add_item(ipv6_tree, hf_ipv6_dst_teredo_client_ipv4, tvb,
- offset + IP6H_DST + 12, 4, FALSE);
+ ti = proto_tree_add_uint(ipv6_tree, hf_ipv6_dst_teredo_port, tvb,
+ offset + IP6H_DST + 10, 2, mapped_port);
+ PROTO_ITEM_SET_GENERATED(ti);
+ ti = proto_tree_add_ipv4(ipv6_tree, hf_ipv6_dst_teredo_client_ipv4, tvb,
+ offset + IP6H_DST + 12, 4, client_v4);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_item(ipv6_tree, hf_ipv6_teredo_server_ipv4, tvb,
offset + IP6H_DST + 4, 4, FALSE);
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_HIDDEN(ti);
- ti = proto_tree_add_item(ipv6_tree, hf_ipv6_teredo_client_ipv4, tvb,
- offset + IP6H_DST + 12, 4, FALSE);
+ ti = proto_tree_add_uint(ipv6_tree, hf_ipv6_teredo_port, tvb,
+ offset + IP6H_DST + 10, 2, mapped_port);
+ PROTO_ITEM_SET_GENERATED(ti);
+ PROTO_ITEM_SET_HIDDEN(ti);
+ ti = proto_tree_add_ipv4(ipv6_tree, hf_ipv6_teredo_client_ipv4, tvb,
+ offset + IP6H_DST + 12, 4, client_v4);
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_HIDDEN(ti);
}
@@ -1770,6 +1793,10 @@ proto_register_ipv6(void)
{ "Source Teredo Server IPv4", "ipv6.src_ts_ipv4",
FT_IPv4, BASE_NONE, NULL, 0x0,
"Source IPv6 Teredo Server Encapsulated IPv4 Address", HFILL }},
+ { &hf_ipv6_src_teredo_port,
+ { "Source Teredo Port", "ipv6.src_tc_port",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Source IPv6 Teredo Client Mapped Port", HFILL }},
{ &hf_ipv6_src_teredo_client_ipv4,
{ "Source Teredo Client IPv4", "ipv6.src_tc_ipv4",
FT_IPv4, BASE_NONE, NULL, 0x0,
@@ -1794,6 +1821,10 @@ proto_register_ipv6(void)
{ "Destination Teredo Server IPv4", "ipv6.dst_ts_ipv4",
FT_IPv4, BASE_NONE, NULL, 0x0,
"Destination IPv6 Teredo Server Encapsulated IPv4 Address", HFILL }},
+ { &hf_ipv6_dst_teredo_port,
+ { "Destination Teredo Port", "ipv6.dst_tc_port",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Destination IPv6 Teredo Client Mapped Port", HFILL }},
{ &hf_ipv6_dst_teredo_client_ipv4,
{ "Destination Teredo Client IPv4", "ipv6.dst_tc_ipv4",
FT_IPv4, BASE_NONE, NULL, 0x0,
@@ -1819,6 +1850,10 @@ proto_register_ipv6(void)
{ "Teredo Server IPv4", "ipv6.ts_ipv4",
FT_IPv4, BASE_NONE, NULL, 0x0,
"IPv6 Teredo Server Encapsulated IPv4 Address", HFILL }},
+ { &hf_ipv6_teredo_port,
+ { "Teredo Port", "ipv6.tc_port",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "IPv6 Teredo Client Mapped Port", HFILL }},
{ &hf_ipv6_teredo_client_ipv4,
{ "Teredo Client IPv4", "ipv6.tc_ipv4",
FT_IPv4, BASE_NONE, NULL, 0x0,