diff options
-rw-r--r-- | extcap/androiddump.c | 92 |
1 files changed, 55 insertions, 37 deletions
diff --git a/extcap/androiddump.c b/extcap/androiddump.c index b7398de8e6..9440f982df 100644 --- a/extcap/androiddump.c +++ b/extcap/androiddump.c @@ -117,6 +117,9 @@ #define SOCKET_CONNECT_TIMEOUT_TRIES 10 #define SOCKET_CONNECT_DELAY_US 1000 /* (1000us = 1ms) * SOCKET_CONNECT_TIMEOUT_TRIES (10) = 10ms worst-case */ +#define ADB_HEX4_FORMAT "%04lx" +#define ADB_HEX4_LEN 4 + enum exit_code { EXIT_CODE_SUCCESS = 0, EXIT_CODE_CANNOT_GET_INTERFACES_LIST = 1, @@ -580,6 +583,13 @@ static char *adb_send_and_receive(socket_handle_t sock, const char *adb_service, return NULL; } + g_snprintf(buffer, sizeof(buffer), ADB_HEX4_FORMAT, adb_service_length); + result = send(sock, buffer, ADB_HEX4_LEN, 0); + if (result < ADB_HEX4_LEN) { + g_warning("Error while sending <%s> length to ADB daemon", adb_service); + return NULL; + } + result = send(sock, adb_service, (int) adb_service_length, 0); if (result != (gssize) adb_service_length) { g_warning("Error while sending <%s> to ADB daemon", adb_service); @@ -661,6 +671,13 @@ static char *adb_send_and_read(socket_handle_t sock, const char *adb_service, ch size_t adb_service_length; adb_service_length = strlen(adb_service); + g_snprintf(buffer, sizeof(buffer), ADB_HEX4_FORMAT, adb_service_length); + + result = send(sock, buffer, ADB_HEX4_LEN, 0); + if (result < ADB_HEX4_LEN) { + g_warning("Error while sending <%s> to ADB daemon", adb_service); + return NULL; + } result = send(sock, adb_service, (int) adb_service_length, 0); if (result != (gssize) adb_service_length) { @@ -714,12 +731,19 @@ static char *adb_send_and_read(socket_handle_t sock, const char *adb_service, ch static int adb_send(socket_handle_t sock, const char *adb_service) { - char buffer[4]; + char buffer[5]; gssize used_buffer_length; gssize result; size_t adb_service_length; adb_service_length = strlen(adb_service); + g_snprintf(buffer, sizeof(buffer), ADB_HEX4_FORMAT, adb_service_length); + + result = send(sock, buffer, ADB_HEX4_LEN, 0); + if (result < ADB_HEX4_LEN) { + g_warning("Error while sending <%s> to ADB daemon", adb_service); + return EXIT_CODE_ERROR_WHILE_SENDING_ADB_PACKET_1; + } result = send(sock, adb_service, (int) adb_service_length, 0); if (result != (gssize) adb_service_length) { @@ -729,7 +753,7 @@ static int adb_send(socket_handle_t sock, const char *adb_service) { used_buffer_length = 0; while (used_buffer_length < 4) { - result = recv(sock, buffer + used_buffer_length, (int)(sizeof(buffer) - used_buffer_length), 0); + result = recv(sock, buffer + used_buffer_length, 4 - used_buffer_length, 0); if (result <= 0) { g_warning("Broken socket connection while fetching reply status for <%s>", adb_service); @@ -754,8 +778,8 @@ static socket_handle_t adb_connect_transport(const char *server_ip, unsigned short *server_tcp_port, const char* serial_number) { - static const char *const adb_transport_serial_templace = "%04lx""host:transport:%s"; - static const char *const adb_transport_any = "0012""host:transport-any"; + static const char *const adb_transport_serial_templace = "host:transport:%s"; + static const char *const adb_transport_any = "host:transport-any"; char transport_buf[80]; const char* transport = transport_buf; socket_handle_t sock; @@ -770,7 +794,7 @@ adb_connect_transport(const char *server_ip, unsigned short *server_tcp_port, if (!serial_number) { transport = adb_transport_any; } else { - result = g_snprintf(transport_buf, sizeof(transport_buf), adb_transport_serial_templace, 15 + strlen(serial_number), serial_number); + result = g_snprintf(transport_buf, sizeof(transport_buf), adb_transport_serial_templace, serial_number); if (result <= 0 || result > (int)sizeof(transport_buf)) { g_warning("Error while completing adb packet for transport"); closesocket(sock); @@ -826,14 +850,14 @@ static int register_interfaces(extcap_parameters * extcap_conf, const char *adb_ gssize data_length; size_t device_length; socket_handle_t sock; - const char *adb_check_port_templace = "%04x""shell:cat /proc/%s/net/tcp"; - const char *adb_devices = "000E""host:devices-l"; - const char *adb_api_level = "0022""shell:getprop ro.build.version.sdk"; - const char *adb_hcidump_version = "0017""shell:hcidump --version"; - const char *adb_ps_droid_bluetooth = "0018""shell:ps droid.bluetooth"; - const char *adb_ps_bluetooth_app = "001E""shell:ps com.android.bluetooth"; - const char *adb_ps_with_grep = "0025""shell:ps | grep com.android.bluetooth"; - const char *adb_tcpdump_help = "0010""shell:tcpdump -h"; + const char *adb_check_port_templace = "shell:cat /proc/%s/net/tcp"; + const char *adb_devices = "host:devices-l"; + const char *adb_api_level = "shell:getprop ro.build.version.sdk"; + const char *adb_hcidump_version = "shell:hcidump --version"; + const char *adb_ps_droid_bluetooth = "shell:ps droid.bluetooth"; + const char *adb_ps_bluetooth_app = "shell:ps com.android.bluetooth"; + const char *adb_ps_with_grep = "shell:ps | grep com.android.bluetooth"; + const char *adb_tcpdump_help = "shell:tcpdump -h"; char serial_number[SERIAL_NUMBER_LENGTH_MAX]; char model_name[MODEL_NAME_LENGTH_MAX]; int result; @@ -997,7 +1021,7 @@ static int register_interfaces(extcap_parameters * extcap_conf, const char *adb_ if (data_str && sscanf(data_str, "%*s %s", pid) == 1) { g_debug("Android Bluetooth application PID for %s is %s", serial_number, pid); - result = g_snprintf(check_port_buf, sizeof(check_port_buf), adb_check_port_templace, strlen(adb_check_port_templace) - 6 + strlen(pid), pid); + result = g_snprintf(check_port_buf, sizeof(check_port_buf), adb_check_port_templace, pid); if (result <= 0 || result > (int)sizeof(check_port_buf)) { g_warning("Error while completing adb packet"); return EXIT_CODE_BAD_SIZE_OF_ASSEMBLED_ADB_PACKET_6; @@ -1070,7 +1094,7 @@ static int register_interfaces(extcap_parameters * extcap_conf, const char *adb_ if (data_str && sscanf(data_str, "%*s %s", pid) == 1) { g_debug("Android Bluetooth application PID for %s is %s", serial_number, pid); - result = g_snprintf(check_port_buf, sizeof(check_port_buf), adb_check_port_templace, strlen(adb_check_port_templace) - 6 + strlen(pid), pid); + result = g_snprintf(check_port_buf, sizeof(check_port_buf), adb_check_port_templace, pid); if (result <= 0 || result > (int)sizeof(check_port_buf)) { g_warning("Error while completing adb packet"); return EXIT_CODE_BAD_SIZE_OF_ASSEMBLED_ADB_PACKET_9; @@ -1172,8 +1196,8 @@ static int capture_android_bluetooth_hcidump(char *interface, char *fifo, gssize length; gssize used_buffer_length = 0; socket_handle_t sock = INVALID_SOCKET; - const char *adb_shell_hcidump = "0013""shell:hcidump -R -t"; - const char *adb_shell_su_hcidump = "0019""shell:su -c hcidump -R -t"; + const char *adb_shell_hcidump = "shell:hcidump -R -t"; + const char *adb_shell_su_hcidump = "shell:su -c hcidump -R -t"; int result; char *serial_number = NULL; time_t ts = 0; @@ -1494,13 +1518,13 @@ static int adb_forward(char *serial_number, const char *adb_server_ip, unsigned socket_handle_t sock; int result; static char helpful_packet[PACKET_LENGTH]; - static const char *adb_forward_template = "%04x""%s%s:forward:tcp:%05u;tcp:%05u"; + static const char *adb_forward_template = "%s%s:forward:tcp:%05u;tcp:%05u"; sock = adb_connect(adb_server_ip, adb_server_tcp_port); if (sock == INVALID_SOCKET) return EXIT_CODE_INVALID_SOCKET_5; - result = g_snprintf(helpful_packet, PACKET_LENGTH, adb_forward_template, (serial_number) ? 5 + 7 + strlen(serial_number) + 28 : 4 + 28, (serial_number) ? "host-serial:" : "host", (serial_number) ? serial_number: "", local_tcp_port, server_tcp_port); + result = g_snprintf(helpful_packet, PACKET_LENGTH, adb_forward_template, (serial_number) ? "host-serial:" : "host", (serial_number) ? serial_number: "", local_tcp_port, server_tcp_port); if (result <= 0 || result > PACKET_LENGTH) { g_warning("Error while completing adb packet"); closesocket(sock); @@ -1523,7 +1547,7 @@ static int capture_android_bluetooth_external_parser(char *interface, char *packet = buffer + BLUEDROID_TIMESTAMP_SIZE - sizeof(own_pcap_bluetooth_h4_header); /* skip timestamp (8 bytes) and reuse its space for header */ own_pcap_bluetooth_h4_header *h4_header; guint8 *payload = packet + sizeof(own_pcap_bluetooth_h4_header); - const char *adb_tcp_bluedroid_external_parser_template = "%04x""tcp:%05u"; + const char *adb_tcp_bluedroid_external_parser_template = "tcp:%05u"; socklen_t slen; gssize length; gssize used_buffer_length = 0; @@ -1596,7 +1620,7 @@ static int capture_android_bluetooth_external_parser(char *interface, if (sock == INVALID_SOCKET) return EXIT_CODE_INVALID_SOCKET_6; - result = g_snprintf((char *) buffer, PACKET_LENGTH, adb_tcp_bluedroid_external_parser_template, 4 + 5, *bt_server_tcp_port); + result = g_snprintf((char *) buffer, PACKET_LENGTH, adb_tcp_bluedroid_external_parser_template, *bt_server_tcp_port); if (result <= 0 || result > PACKET_LENGTH) { g_warning("Error while completing adb packet"); closesocket(sock); @@ -1754,7 +1778,7 @@ static int capture_android_bluetooth_btsnoop_net(char *interface, char *fifo, gssize length; gssize used_buffer_length = 0; socket_handle_t sock; - const char *adb_tcp_btsnoop_net = "0008""tcp:8872"; + const char *adb_tcp_btsnoop_net = "tcp:8872"; int result; char *serial_number = NULL; uint64_t ts; @@ -1885,13 +1909,12 @@ static int capture_android_logcat_text(char *interface, char *fifo, struct exported_pdu_header *exported_pdu_header_protocol; struct exported_pdu_header exported_pdu_header_end = {0, 0}; static const char *wireshark_protocol_logcat_text = "logcat_text_threadtime"; - const char *adb_logcat_template = "%04x""shell:export ANDROID_LOG_TAGS=\"\" ; exec logcat -v threadtime%s%s%s%s"; + const char *adb_logcat_template = "shell:export ANDROID_LOG_TAGS=\"\" ; exec logcat -v threadtime%s%s %s"; char *serial_number = NULL; int result; char *pos; const char *logcat_buffer; const char *logcat_log_buffer; - size_t command_length; extcap_dumper = extcap_dumper_open(fifo, EXTCAP_ENCAP_WIRESHARK_UPPER_PDU); @@ -1938,20 +1961,15 @@ static int capture_android_logcat_text(char *interface, char *fifo, return EXIT_CODE_GENERIC; } - command_length = strlen(adb_logcat_template) - 4 - 8 + strlen(logcat_buffer); - if (logcat_ignore_log_buffer) logcat_log_buffer = " -T 1"; else logcat_log_buffer = ""; - command_length += strlen(logcat_log_buffer); - if (logcat_custom_parameter) { - command_length += 1; /* additional command "space" */ - command_length += strlen(logcat_custom_parameter); - } + if (!logcat_custom_parameter) + logcat_custom_parameter = ""; - result = g_snprintf((char *) packet, PACKET_LENGTH, adb_logcat_template, command_length, logcat_buffer, logcat_log_buffer, (logcat_custom_parameter? " " : ""), logcat_custom_parameter); + result = g_snprintf((char *) packet, PACKET_LENGTH, adb_logcat_template, logcat_buffer, logcat_log_buffer, logcat_custom_parameter); if (result <= 0 || result > PACKET_LENGTH) { g_warning("Error while completing adb packet"); closesocket(sock); @@ -2058,10 +2076,10 @@ static int capture_android_logcat(char *interface, char *fifo, struct exported_pdu_header exported_pdu_header_end = {0, 0}; static const char *wireshark_protocol_logcat = "logcat"; static const char *wireshark_protocol_logcat_events = "logcat_events"; - const char *adb_log_main = "0008""log:main"; - const char *adb_log_system = "000A""log:system"; - const char *adb_log_radio = "0009""log:radio"; - const char *adb_log_events = "000A""log:events"; + const char *adb_log_main = "log:main"; + const char *adb_log_system = "log:system"; + const char *adb_log_radio = "log:radio"; + const char *adb_log_events = "log:events"; const char *adb_command; uint16_t *payload_length; uint16_t *try_header_size; @@ -2239,7 +2257,7 @@ static int capture_android_wifi_tcpdump(char *interface, char *fifo, gssize filter_buffer_length = 0; gssize frame_length=0; socket_handle_t sock; - const char *adb_shell_tcpdump = "001D" "shell:tcpdump -n -s 0 -u -w -"; + const char *adb_shell_tcpdump = "shell:tcpdump -n -s 0 -u -w -"; gint result; char *serial_number = NULL; static char filter_buffer[PACKET_LENGTH]; |