aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-adb_cs.c
diff options
context:
space:
mode:
authorMichal Labedzki <michal.labedzki@tieto.com>2014-02-02 19:12:55 +0100
committerMichal Labedzki <michal.labedzki@tieto.com>2014-10-22 11:25:06 +0000
commitc2f58d396212f59e1c0c572319d74107f82c4a8c (patch)
tree2cab5ab35b6dd2cecc42a2ccec9f0e1acafd4046 /epan/dissectors/packet-adb_cs.c
parent0ce3640cab2b911a6a46838df024bc52c1affb09 (diff)
Android: Add ADB dissector
Previoulsy added "adb_cs" is only for adb client <-> adb daemon communication by loopback interface (by TCP). But there is also communication between adb daemon and device (by TCP or USB). This transport protocol is different, but now support is done. ADB services are shared between ADB and ADB_CS so put them into "adb_service" dissector. There is still some services to be added. Change-Id: I754331d3dc6ccf3c17445f5563d01cf2fe1489c7 Reviewed-on: https://code.wireshark.org/review/4651 Tested-by: Michal Labedzki <michal.labedzki@tieto.com> Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
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);
}