aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-adb_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-adb_cs.c')
-rw-r--r--epan/dissectors/packet-adb_cs.c684
1 files changed, 62 insertions, 622 deletions
diff --git a/epan/dissectors/packet-adb_cs.c b/epan/dissectors/packet-adb_cs.c
index 27cb11f492..10c824e62e 100644
--- a/epan/dissectors/packet-adb_cs.c
+++ b/epan/dissectors/packet-adb_cs.c
@@ -30,97 +30,42 @@
#include <epan/wmem/wmem.h>
#include <wiretap/wtap.h>
+#include "packet-adb_service.h"
+
static int proto_adb_cs = -1;
static int hf_role = -1;
static int hf_hex_ascii_length = -1;
static int hf_length = -1;
-static int hf_hex_ascii_version = -1;
-static int hf_version = -1;
static int hf_service = -1;
static int hf_status = -1;
-static int hf_fragment = -1;
static int hf_data = -1;
static int hf_fail_reason = -1;
-static int hf_framebuffer_version = -1;
-static int hf_framebuffer_depth = -1;
-static int hf_framebuffer_size = -1;
-static int hf_framebuffer_width = -1;
-static int hf_framebuffer_height = -1;
-static int hf_framebuffer_red_offset = -1;
-static int hf_framebuffer_red_length = -1;
-static int hf_framebuffer_blue_offset = -1;
-static int hf_framebuffer_blue_length = -1;
-static int hf_framebuffer_green_offset = -1;
-static int hf_framebuffer_green_length = -1;
-static int hf_framebuffer_alpha_offset = -1;
-static int hf_framebuffer_alpha_length = -1;
-static int hf_framebuffer_pixel = -1;
-static int hf_framebuffer_red_5 = -1;
-static int hf_framebuffer_green_6 = -1;
-static int hf_framebuffer_blue_5 = -1;
-static int hf_framebuffer_red = -1;
-static int hf_framebuffer_green = -1;
-static int hf_framebuffer_blue = -1;
-static int hf_framebuffer_alpha = -1;
-static int hf_framebuffer_unused = -1;
-static int hf_devices = -1;
-static int hf_stdin = -1;
-static int hf_stdout = -1;
-static int hf_pids = -1;
-static int hf_result = -1;
static gint ett_adb_cs = -1;
static gint ett_length = -1;
-static gint ett_version = -1;
-static gint ett_pixel = -1;
-static gint ett_data = -1;
static expert_field ei_incomplete_message = EI_INIT;
static dissector_handle_t adb_cs_handle;
-static dissector_handle_t logcat_handle;
+static dissector_handle_t adb_service_handle;
static dissector_handle_t data_handle;
static wmem_tree_t *client_requests = NULL;
-static wmem_tree_t *fragments = NULL;
static guint server_port = 5037;
-static gboolean pref_dissect_more_detail_framebuffer = FALSE;
-
-typedef struct _framebuffer_data_t {
- guint32 red_offset;
- guint32 red_length;
- guint32 green_offset;
- guint32 green_length;
- guint32 blue_offset;
- guint32 blue_length;
- guint32 alpha_offset;
- guint32 alpha_length;
-} framebuffer_data_t;
typedef struct _client_request_t {
- guint16 service_length;
+ gint64 service_length;
guint8 *service;
guint32 first_in;
gint64 service_in;
- gint64 data_in;
gint64 response_frame;
guint8 status;
- gint data_length;
- union {
- void *allocated;
- framebuffer_data_t *framebuffer_data;
- } data;
+ gint64 data_length;
} client_request_t;
-typedef struct _fragment_t {
- gint64 reassembled_in_frame;
- gint length;
- guint8 *data;
-} fragment_t;
-
static const value_string role_vals[] = {
{ 0x00, "Unknown" },
{ 0x01, "Server" },
@@ -137,40 +82,20 @@ static const value_string role_vals[] = {
void proto_register_adb_cs(void);
void proto_reg_handoff_adb_cs(void);
-
-static gint
-dissect_ascii_data_length(proto_tree *tree, tvbuff_t *tvb, gint offset, gint *data_length)
-{
- proto_item *sub_item;
- proto_tree *sub_tree;
- guint8 hex_ascii[5];
-
- DISSECTOR_ASSERT(data_length);
-
- tvb_memcpy(tvb, hex_ascii, offset, 4);
- hex_ascii[4]='\0';
-
- sub_item = proto_tree_add_item(tree, hf_hex_ascii_length, tvb, offset, 4, ENC_NA | ENC_ASCII);
- sub_tree = proto_item_add_subtree(sub_item, ett_length);
- *data_length = (gint)g_ascii_strtoull(hex_ascii, NULL, 16);
- proto_tree_add_uint(sub_tree, hf_length, tvb, offset, 4, *data_length);
- offset += 4;
-
- return offset;
-}
-
static gint
dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
proto_item *main_item;
proto_tree *main_tree;
proto_item *sub_item;
- proto_tree *sub_tree;
proto_item *p_item;
gint offset = 0;
- gint length = -1;
- guint8 *hex_ascii;
+ gint64 length = -1;
+ gint direction;
gboolean client_request_service = FALSE;
+ tvbuff_t *next_tvb;
+ adb_service_data_t adb_service_data;
+ guint32 wireshark_interface_id = 0;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "ADB CS");
col_clear(pinfo->cinfo, COL_INFO);
@@ -178,13 +103,17 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
main_item = proto_tree_add_item(tree, proto_adb_cs, tvb, offset, -1, ENC_NA);
main_tree = proto_item_add_subtree(main_item, ett_adb_cs);
+ if (pinfo->phdr->presence_flags & WTAP_HAS_INTERFACE_ID)
+ wireshark_interface_id = pinfo->phdr->interface_id;
+
if (pinfo->destport == server_port) { /* Client sent to Server */
client_request_t *client_request;
guint8 *service = SERVICE_NONE;
- guint32 wireshark_interface_id = 0;
wmem_tree_t *subtree;
wmem_tree_key_t key[5];
+ direction = P2P_DIR_SENT;
+
p_item = proto_tree_add_uint(main_tree, hf_role, tvb, offset, 0, 0x02);
PROTO_ITEM_SET_GENERATED(p_item);
@@ -218,6 +147,7 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
/* heuristic to recognize type of (partial) packet */
if (tvb_reported_length_remaining(tvb, offset) >= 4) {
guint8 hex_ascii_length[5];
+ guint32 ulength;
hex_ascii_length[4] = 0;
@@ -227,19 +157,29 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
g_ascii_xdigit_value(hex_ascii_length[2]) >= 0 &&
g_ascii_xdigit_value(hex_ascii_length[3]) >= 0) {
/* probably 4 bytes ascii hex length field */
- offset = dissect_ascii_data_length(main_tree, tvb, offset, &length);
- col_append_fstr(pinfo->cinfo, COL_INFO, " Length=%u", length);
+ offset = dissect_ascii_uint32(main_tree, hf_hex_ascii_length, ett_length, hf_length, tvb, offset, &ulength);
+ length = (gint64) ulength;
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Length=%u", ulength);
}
}
+
if (length == -1 && service) {
col_append_fstr(pinfo->cinfo, COL_INFO, " Service=<%s>", service);
+ length = tvb_captured_length(tvb);
- if (g_str_has_prefix(service, "shell:")) {
- proto_tree_add_item(main_tree, hf_stdin, tvb, offset, -1, ENC_NA | ENC_ASCII);
- } else {
- proto_tree_add_item(main_tree, hf_data, tvb, offset, -1, ENC_NA);
- }
+ /* Decode services */
+ adb_service_data.service = service;
+ adb_service_data.direction = direction;
+
+ adb_service_data.session_key_length = 3;
+ adb_service_data.session_key = (guint32 *) wmem_alloc(wmem_packet_scope(), adb_service_data.session_key_length * sizeof(guint32));
+ adb_service_data.session_key[0] = wireshark_interface_id;
+ adb_service_data.session_key[1] = pinfo->destport;
+ adb_service_data.session_key[2] = pinfo->srcport;
+
+ next_tvb = tvb_new_subset(tvb, offset, tvb_captured_length_remaining(tvb, offset), tvb_captured_length_remaining(tvb, offset));
+ call_dissector_with_data(adb_service_handle, next_tvb, pinfo, tree, &adb_service_data);
return tvb_captured_length(tvb);
}
@@ -266,8 +206,6 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
client_request->response_frame = -1;
client_request->first_in = pinfo->fd->num;
client_request->service_in = -1;
- client_request->data_in = -1;
- client_request->data.allocated = NULL;
client_request->data_length = -1;
wmem_tree_insert32_array(client_requests, key, client_request);
}
@@ -291,8 +229,8 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
}
if (client_request) {
- client_request->service = (guint8 *) wmem_alloc(wmem_file_scope(), client_request->service_length + 1);
- tvb_memcpy(tvb, client_request->service, offset, client_request->service_length);
+ client_request->service = (guint8 *) wmem_alloc(wmem_file_scope(), (const size_t)(client_request->service_length + 1));
+ tvb_memcpy(tvb, client_request->service, offset, (size_t) client_request->service_length);
client_request->service[client_request->service_length] = '\0';
client_request->service_in = pinfo->fd->num;
}
@@ -313,17 +251,14 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
offset = tvb_captured_length(tvb);
} else if (pinfo->srcport == server_port) { /* Server sent to Client */
- guint32 wireshark_interface_id = 0;
- guint8 *service = SERVICE_NONE;
- wmem_tree_t *subtree;
- wmem_tree_key_t key[5];
- client_request_t *client_request;
- gint64 response_frame = -1;
- gint64 data_in = -1;
- guint8 status = STATUS_UNKNOWN;
+ guint8 *service = SERVICE_NONE;
+ wmem_tree_t *subtree;
+ wmem_tree_key_t key[5];
+ client_request_t *client_request;
+ gint64 response_frame = -1;
+ guint8 status = STATUS_UNKNOWN;
- if (pinfo->phdr->presence_flags & WTAP_HAS_INTERFACE_ID)
- wireshark_interface_id = pinfo->phdr->interface_id;
+ direction = P2P_DIR_RECV;
key[0].length = 1;
key[0].key = &wireshark_interface_id;
@@ -341,7 +276,6 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
status = client_request->status;
length = client_request->data_length;
response_frame = client_request->response_frame;
- data_in = client_request->data_in;
}
p_item = proto_tree_add_uint(main_tree, hf_role, tvb, offset, 0, 0x01);
@@ -366,7 +300,10 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
offset += 4;
if (tvb_memeql(tvb, offset - 4, "FAIL", 4) == 0) {
- offset = dissect_ascii_data_length(main_tree, tvb, offset, &length);
+ guint32 ulength;
+
+ offset = dissect_ascii_uint32(main_tree, hf_hex_ascii_length, ett_length, hf_length, tvb, offset, &ulength);
+ length = (gint64) ulength;
status = STATUS_FAIL;
} else if (tvb_memeql(tvb, offset - 4, "OKAY", 4) == 0) {
@@ -385,11 +322,6 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
if (tvb_reported_length_remaining(tvb, offset) <= 0) return offset;
- if (!pinfo->fd->flags.visited && client_request && client_request->data_in == -1) {
- client_request->data_in = pinfo->fd->num;
- data_in = client_request->data_in;
- }
-
if (status == STATUS_FAIL) {
sub_item = proto_tree_add_item(main_tree, hf_fail_reason, tvb, offset, -1, ENC_NA | ENC_ASCII);
if (length < tvb_reported_length_remaining(tvb, offset)) {
@@ -400,353 +332,20 @@ dissect_adb_cs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
return tvb_captured_length(tvb);
}
- if (g_strcmp0(service, "host:version") == 0) {
- guint version;
- gint data_length;
-
- offset = dissect_ascii_data_length(main_tree, tvb, offset, &data_length);
-
- hex_ascii = (guint8 *) wmem_alloc(wmem_packet_scope(), data_length + 1);
- tvb_memcpy(tvb, hex_ascii, offset, data_length);
- hex_ascii[data_length]='\0';
-
- sub_item = proto_tree_add_item(main_tree, hf_hex_ascii_version, tvb, offset, 4, ENC_NA | ENC_ASCII);
- sub_tree = proto_item_add_subtree(sub_item, ett_version);
- version = (guint)g_ascii_strtoull(hex_ascii, NULL, 16);
- proto_tree_add_uint(sub_tree, hf_version, tvb, offset, 4, version);
- offset += 4;
-
- col_append_fstr(pinfo->cinfo, COL_INFO, " Version=%u", version);
- } else if (g_strcmp0(service, "host:devices") == 0 ||
- g_strcmp0(service, "host:devices-l") == 0 ||
- g_strcmp0(service, "host:track-devices") == 0) {
- gint data_length;
-
- offset = dissect_ascii_data_length(main_tree, tvb, offset, &data_length);
-
- sub_item = proto_tree_add_item(main_tree, hf_devices, tvb, offset, -1, ENC_NA | ENC_ASCII);
- if (data_length < tvb_reported_length_remaining(tvb, offset)) {
- expert_add_info(pinfo, sub_item, &ei_incomplete_message);
- }
- } else if (g_strcmp0(service, "host:get-state") == 0 ||
- g_strcmp0(service, "host:get-serialno") == 0 ||
- g_strcmp0(service, "host:get-devpath") == 0 ||
- g_str_has_prefix(service, "connect:") ||
- g_str_has_prefix(service, "disconnect:")) {
- gint data_length;
-
- offset = dissect_ascii_data_length(main_tree, tvb, offset, &data_length);
-
- sub_item = proto_tree_add_item(main_tree, hf_result, tvb, offset, -1, ENC_NA | ENC_ASCII);
- if (data_length < tvb_reported_length_remaining(tvb, offset)) {
- expert_add_info(pinfo, sub_item, &ei_incomplete_message);
- }
- } else if (g_str_has_prefix(service, "framebuffer:")) {
- if (data_in == pinfo->fd->num) {
- if (!pinfo->fd->flags.visited && client_request && client_request->data.allocated == NULL) {
- client_request->data.framebuffer_data = wmem_new(wmem_file_scope(), framebuffer_data_t);
- memset(client_request->data.framebuffer_data, 0, sizeof(framebuffer_data_t));
- }
-
- proto_tree_add_item(main_tree, hf_framebuffer_version, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_depth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_width, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_height, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_red_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->red_offset = tvb_get_letohl(tvb, offset);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_red_length, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->red_length = tvb_get_letohl(tvb, offset);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_blue_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->blue_offset = tvb_get_letohl(tvb, offset);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_blue_length, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->blue_length = tvb_get_letohl(tvb, offset);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_green_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->green_offset = tvb_get_letohl(tvb, offset);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_green_length, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->green_length = tvb_get_letohl(tvb, offset);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_alpha_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->alpha_offset = tvb_get_letohl(tvb, offset);
- offset += 4;
-
- proto_tree_add_item(main_tree, hf_framebuffer_alpha_length, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!pinfo->fd->flags.visited && client_request && client_request->data.framebuffer_data)
- client_request->data.framebuffer_data->alpha_length = tvb_get_letohl(tvb, offset);
- offset += 4;
- }
-
- if (tvb_reported_length_remaining(tvb, offset) > 0) {
- proto_item *pixel_item;
- proto_tree *pixel_tree;
-
- sub_item = proto_tree_add_item(main_tree, hf_data, tvb, offset, -1, ENC_NA);
- sub_tree = proto_item_add_subtree(sub_item, ett_data);
-
- if (pref_dissect_more_detail_framebuffer) {
- if (client_request && client_request->data.framebuffer_data &&
- client_request->data.framebuffer_data->red_length == 5 &&
- client_request->data.framebuffer_data->green_length == 6 &&
- client_request->data.framebuffer_data->blue_length == 5 &&
- client_request->data.framebuffer_data->red_offset == 11 &&
- client_request->data.framebuffer_data->green_offset == 5 &&
- client_request->data.framebuffer_data->blue_offset == 0) {
- while (tvb_reported_length_remaining(tvb, offset) > 0) {
- if (tvb_reported_length_remaining(tvb, offset) < 2) {
- proto_tree_add_item(main_tree, hf_fragment, tvb, offset, -1, ENC_NA);
- offset += 1;
- }
-
- pixel_item = proto_tree_add_item(sub_tree, hf_framebuffer_pixel, tvb, offset, 2, ENC_NA);
- pixel_tree = proto_item_add_subtree(pixel_item, ett_pixel);
-
- proto_tree_add_item(pixel_tree, hf_framebuffer_blue_5, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(pixel_tree, hf_framebuffer_green_6, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(pixel_tree, hf_framebuffer_red_5, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- } else if (client_request && client_request->data.framebuffer_data &&
- client_request->data.framebuffer_data->red_length == 8 &&
- client_request->data.framebuffer_data->green_length == 8 &&
- client_request->data.framebuffer_data->blue_length == 8 &&
- (client_request->data.framebuffer_data->alpha_length == 0 ||
- client_request->data.framebuffer_data->alpha_length == 8)) {
- while (tvb_reported_length_remaining(tvb, offset) > 0) {
- if (tvb_reported_length_remaining(tvb, offset) < 3 || (tvb_reported_length_remaining(tvb, offset) < 4 && client_request->data.framebuffer_data->alpha_offset > 0)) {
- proto_tree_add_item(main_tree, hf_fragment, tvb, offset, -1, ENC_NA);
- offset = tvb_captured_length(tvb);
- break;
- }
-
- pixel_item = proto_tree_add_item(sub_tree, hf_framebuffer_pixel, tvb, offset, 3, ENC_NA);
- pixel_tree = proto_item_add_subtree(pixel_item, ett_pixel);
-
- proto_tree_add_item(pixel_tree, hf_framebuffer_red, tvb, offset + client_request->data.framebuffer_data->red_offset / 8, 1, ENC_NA);
- proto_tree_add_item(pixel_tree, hf_framebuffer_green, tvb, offset + client_request->data.framebuffer_data->green_offset / 8, 1, ENC_NA);
- proto_tree_add_item(pixel_tree, hf_framebuffer_blue, tvb, offset + client_request->data.framebuffer_data->blue_offset / 8, 1, ENC_NA);
-
- if (client_request->data.framebuffer_data->alpha_offset > 0) {
- if (client_request->data.framebuffer_data->alpha_length == 0)
- proto_tree_add_item(pixel_tree, hf_framebuffer_unused, tvb, offset + client_request->data.framebuffer_data->alpha_offset / 8, 1, ENC_NA);
- else
- proto_tree_add_item(pixel_tree, hf_framebuffer_alpha, tvb, offset + client_request->data.framebuffer_data->alpha_offset / 8, 1, ENC_NA);
- offset += 1;
- proto_item_set_len(pixel_item, 4);
- }
- offset += 3;
- }
- } else {
- offset = tvb_captured_length(tvb);
- }
- } else {
- offset = tvb_captured_length(tvb);
- }
- }
- } else if (g_strcmp0(service, "track-jdwp") == 0) {
- gint data_length;
-
- offset = dissect_ascii_data_length(main_tree, tvb, offset, &data_length);
-
- if (tvb_reported_length_remaining(tvb, offset) > 0) {
- sub_item = proto_tree_add_item(main_tree, hf_pids, tvb, offset, -1, ENC_NA | ENC_ASCII);
- if (data_length < tvb_reported_length_remaining(tvb, offset)) {
- expert_add_info(pinfo, sub_item, &ei_incomplete_message);
- }
- }
- offset = tvb_captured_length(tvb);
- } else if ((g_strcmp0(service, "shell:export ANDROID_LOG_TAGS=\"\" ; exec logcat -B") == 0) ||
- (g_strcmp0(service, "shell:logcat -B") == 0)) {
- tvbuff_t *next_tvb;
- tvbuff_t *new_tvb;
- guint8 *buffer = NULL;
- gint size = 0;
- gint i_offset = offset;
- gint old_offset;
- gint i_char = 0;
- guint8 c1;
- guint8 c2 = '\0';
- guint16 payload_length;
- guint16 try_header_size;
- gint logcat_length = 0;
- fragment_t *fragment;
-
- if (pinfo->phdr->presence_flags & WTAP_HAS_INTERFACE_ID)
- wireshark_interface_id = pinfo->phdr->interface_id;
-
- key[0].length = 1;
- key[0].key = &wireshark_interface_id;
- key[1].length = 1;
- key[1].key = &pinfo->destport;
- key[2].length = 1;
- key[2].key = &pinfo->srcport;
- key[3].length = 0;
- key[3].key = NULL;
-
- subtree = (wmem_tree_t *) wmem_tree_lookup32_array(fragments, key);
- fragment = (subtree) ? (fragment_t *) wmem_tree_lookup32_le(subtree, pinfo->fd->num - 1) : NULL;
- if (fragment) {
- if (!pinfo->fd->flags.visited && fragment->reassembled_in_frame == -1)
- fragment->reassembled_in_frame = pinfo->fd->num;
-
- if (fragment->reassembled_in_frame == pinfo->fd->num) {
- size += fragment->length;
- i_char += fragment->length;
- }
- }
-
- size += tvb_reported_length_remaining(tvb, i_offset);
- if (size > 0) {
- buffer = (guint8 *) wmem_alloc(pinfo->pool, size);
- if (fragment && i_char > 0)
- memcpy(buffer, fragment->data, i_char);
-
- if (i_char >= 1 && buffer[i_char - 1] == '\r' && tvb_get_guint8(tvb, i_offset) == '\n') {
- buffer[i_char - 1] = '\n';
- i_offset += 1;
- }
-
- c1 = tvb_get_guint8(tvb, i_offset);
- i_offset += 1;
- old_offset = i_offset;
-
- while (tvb_reported_length_remaining(tvb, i_offset) > 0) {
- c2 = tvb_get_guint8(tvb, i_offset);
-
- if (c1 == '\r' && c2 == '\n') {
- buffer[i_char] = c2;
- if (tvb_reported_length_remaining(tvb, i_offset) > 1) {
- c1 = tvb_get_guint8(tvb, i_offset + 1);
- i_offset += 2;
- i_char += 1;
- } else {
- i_offset += 1;
- }
-
- continue;
- }
-
- buffer[i_char] = c1;
- c1 = c2;
- i_char += 1;
- i_offset += 1;
- }
-
- if (tvb_reported_length_remaining(tvb, old_offset) == 0) {
- buffer[i_char] = c1;
- i_char += 1;
- } else if (tvb_reported_length_remaining(tvb, old_offset) > 0) {
- buffer[i_char] = c2;
- i_char += 1;
- }
-
- next_tvb = tvb_new_child_real_data(tvb, buffer, i_char, i_char);
- add_new_data_source(pinfo, next_tvb, "Logcat");
-
- i_offset = 0;
- while (tvb_reported_length_remaining(next_tvb, i_offset) > 0) {
- if (tvb_reported_length_remaining(next_tvb, i_offset) >= 4) {
- payload_length = tvb_get_letohs(next_tvb, i_offset);
- try_header_size = tvb_get_letohs(next_tvb, i_offset + 2);
-
- if (try_header_size == 0 || try_header_size != 24)
- logcat_length = payload_length + 20;
- else
- logcat_length = payload_length + 24;
- }
-
- if (tvb_reported_length_remaining(next_tvb, i_offset) >= 4 && tvb_reported_length_remaining(next_tvb, i_offset) >= logcat_length) {
- new_tvb = tvb_new_subset_length(next_tvb, i_offset, logcat_length);
-
- call_dissector(logcat_handle, new_tvb, pinfo, main_tree);
- i_offset += logcat_length;
- } else {
-
- if (!pinfo->fd->flags.visited) {
- if (pinfo->phdr->presence_flags & WTAP_HAS_INTERFACE_ID)
- wireshark_interface_id = pinfo->phdr->interface_id;
-
- key[0].length = 1;
- key[0].key = &wireshark_interface_id;
- key[1].length = 1;
- key[1].key = &pinfo->destport;
- key[2].length = 1;
- key[2].key = &pinfo->srcport;
- key[3].length = 1;
- key[3].key = &pinfo->fd->num;
- key[4].length = 0;
- key[4].key = NULL;
-
- fragment = wmem_new(wmem_file_scope(), fragment_t);
-
- fragment->length = tvb_captured_length_remaining(next_tvb, i_offset);
- fragment->data = (guint8 *) wmem_alloc(wmem_file_scope(), fragment->length);
- tvb_memcpy(next_tvb, fragment->data, i_offset, fragment->length);
- fragment->reassembled_in_frame = -1;
-
- wmem_tree_insert32_array(fragments, key, fragment);
- }
-
- proto_tree_add_item(main_tree, hf_fragment, next_tvb, i_offset, -1, ENC_NA);
- i_offset = tvb_captured_length(next_tvb);
- }
- }
- }
+ /* Decode services */
+ adb_service_data.service = service;
+ adb_service_data.direction = direction;
- offset = tvb_captured_length(tvb);
- } else if (g_str_has_prefix(service, "shell:")) {
- proto_tree_add_item(main_tree, hf_stdout, tvb, offset, -1, ENC_NA | ENC_ASCII);
- offset = tvb_captured_length(tvb);
- } else if (g_str_has_prefix(service, "jdwp:")) {
- proto_tree_add_item(main_tree, hf_data, tvb, offset, -1, ENC_NA);
- offset = tvb_captured_length(tvb);
- } else if (g_str_has_prefix(service, "sync:")) {
- proto_tree_add_item(main_tree, hf_data, tvb, offset, -1, ENC_NA);
- offset = tvb_captured_length(tvb);
- } else if (g_strcmp0(service, "host:list-forward") == 0 ||
- g_str_has_prefix(service, "root:") ||
- g_str_has_prefix(service, "remount:") ||
- g_str_has_prefix(service, "tcpip:") ||
- g_str_has_prefix(service, "usb:")) {
- if (tvb_reported_length_remaining(tvb, offset)) {
- proto_tree_add_item(main_tree, hf_result, tvb, offset, -1, ENC_NA | ENC_ASCII);
- offset = tvb_captured_length(tvb);
- }
- } else {
- proto_tree_add_item(main_tree, hf_data, tvb, offset, -1, ENC_NA);
- offset = tvb_captured_length(tvb);
- }
+ adb_service_data.session_key_length = 3;
+ adb_service_data.session_key = (guint32 *) wmem_alloc(wmem_packet_scope(), adb_service_data.session_key_length * sizeof(guint32));
+ adb_service_data.session_key[0] = wireshark_interface_id;
+ adb_service_data.session_key[1] = pinfo->destport;
+ adb_service_data.session_key[2] = pinfo->srcport;
+ next_tvb = tvb_new_subset(tvb, offset, tvb_captured_length_remaining(tvb, offset), tvb_captured_length_remaining(tvb, offset));
+ call_dissector_with_data(adb_service_handle, next_tvb, pinfo, tree, &adb_service_data);
+ offset = tvb_captured_length(tvb);
} else {
- tvbuff_t *next_tvb;
-
col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown role");
p_item = proto_tree_add_uint(main_tree, hf_role, tvb, offset, 0, 0x00);
@@ -779,16 +378,6 @@ proto_register_adb_cs(void)
},
{ &hf_length,
{ "Length", "adb_cs.length",
- FT_UINT16, BASE_DEC_HEX, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_hex_ascii_version,
- { "Hex ASCII String Version", "adb_cs.hex_ascii_version",
- FT_STRING, STR_ASCII, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_version,
- { "Version", "adb_cs.version",
FT_UINT32, BASE_DEC_HEX, NULL, 0x00,
NULL, HFILL }
},
@@ -807,159 +396,16 @@ proto_register_adb_cs(void)
FT_STRING, STR_ASCII, NULL, 0x00,
NULL, HFILL }
},
- { &hf_fragment,
- { "Fragment", "adb_cs.fragment",
- FT_NONE, BASE_NONE, NULL, 0x00,
- NULL, HFILL }
- },
{ &hf_data,
{ "Data", "adb_cs.data",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
- { &hf_framebuffer_version,
- { "Version", "adb_cs.framebuffer.version",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_depth,
- { "Depth", "adb_cs.framebuffer.depth",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_size,
- { "Size", "adb_cs.framebuffer.size",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_width,
- { "Width", "adb_cs.framebuffer.width",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_height,
- { "Height", "adb_cs.framebuffer.height",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_red_offset,
- { "Red Offset", "adb_cs.framebuffer.red_offset",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_red_length,
- { "Red Length", "adb_cs.framebuffer.red_length",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_blue_offset,
- { "Blue Offset", "adb_cs.framebuffer.blue_offset",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_blue_length,
- { "Blue Length", "adb_cs.framebuffer.blue_length",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_green_offset,
- { "Green Offset", "adb_cs.framebuffer.green_offset",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_green_length,
- { "Green Length", "adb_cs.framebuffer.green_length",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_alpha_offset,
- { "Alpha Offset", "adb_cs.framebuffer.alpha_offset",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_alpha_length,
- { "Alpha Length", "adb_cs.framebuffer.alpha_length",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_pixel,
- { "Pixel", "adb_cs.framebuffer.pixel",
- FT_NONE, BASE_NONE, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_blue_5,
- { "Blue", "adb_cs.framebuffer.pixel.blue",
- FT_UINT16, BASE_DEC, NULL, 0xF800,
- NULL, HFILL }
- },
- { &hf_framebuffer_green_6,
- { "Green", "adb_cs.framebuffer.pixel.green",
- FT_UINT16, BASE_DEC, NULL, 0x07E0,
- NULL, HFILL }
- },
- { &hf_framebuffer_red_5,
- { "Red", "adb_cs.framebuffer.pixel.red",
- FT_UINT16, BASE_DEC, NULL, 0x001F,
- NULL, HFILL }
- },
- { &hf_framebuffer_blue,
- { "Blue", "adb_cs.framebuffer.pixel.blue",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_green,
- { "Green", "adb_cs.framebuffer.pixel.green",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_red,
- { "Red", "adb_cs.framebuffer.pixel.red",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_alpha,
- { "Alpha", "adb_cs.framebuffer.pixel.alpha",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_framebuffer_unused,
- { "Unused", "adb_cs.framebuffer.pixel.unused",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_devices,
- { "Devices", "adb_cs.devices",
- FT_STRING, STR_ASCII, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_stdin,
- { "Stdin", "adb_cs.stdin",
- FT_STRING, STR_ASCII, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_stdout,
- { "Stdout", "adb_cs.stdout",
- FT_STRING, STR_ASCII, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_result,
- { "Result", "adb_cs.result",
- FT_STRING, STR_ASCII, NULL, 0x00,
- NULL, HFILL }
- },
- { &hf_pids,
- { "PIDs", "adb_cs.pids",
- FT_STRING, STR_ASCII, NULL, 0x00,
- NULL, HFILL }
- },
};
static gint *ett[] = {
&ett_adb_cs,
- &ett_length,
- &ett_version,
- &ett_pixel,
- &ett_data
+ &ett_length
};
static ei_register_info ei[] = {
@@ -967,7 +413,6 @@ proto_register_adb_cs(void)
};
client_requests = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
- fragments = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
proto_adb_cs = proto_register_protocol("Android Debug Bridge Client-Server", "ADB CS", "adb_cs");
adb_cs_handle = new_register_dissector("adb_cs", dissect_adb_cs, proto_adb_cs);
@@ -983,21 +428,16 @@ proto_register_adb_cs(void)
"Version of protocol supported by this dissector.");
prefs_register_uint_preference(module, "server_port",
- "Server Port",
- "Server Port",
- 10, &server_port);
-
- prefs_register_bool_preference(module, "framebuffer_more_details",
- "Dissect more detail for framebuffer service",
- "Dissect more detail for framebuffer service",
- &pref_dissect_more_detail_framebuffer);
+ "Server Port",
+ "Server Port",
+ 10, &server_port);
}
void
proto_reg_handoff_adb_cs(void)
{
- logcat_handle = find_dissector("logcat");
data_handle = find_dissector("data");
+ adb_service_handle = find_dissector("adb_service");
dissector_add_for_decode_as("tcp.port", adb_cs_handle);
}