From aaf89f20af3e26bb9230f2475ab3c753b2d87e8b Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Fri, 6 Jan 2017 01:58:03 +0100 Subject: irecovery: Add new -q command line switch to print device info --- tools/irecovery.c | 90 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/tools/irecovery.c b/tools/irecovery.c index 58b93f3..5e21921 100644 --- a/tools/irecovery.c +++ b/tools/irecovery.c @@ -51,7 +51,8 @@ enum { kSendExploit, kSendScript, kShowMode, - kRebootToNormalMode + kRebootToNormalMode, + kQueryInfo }; static unsigned int quit = 0; @@ -127,6 +128,44 @@ static void print_hex(unsigned char *buf, size_t len) } } +static void print_device_info(irecv_client_t client) +{ + int ret, mode; + const struct irecv_device_info *devinfo = irecv_get_device_info(client); + if (devinfo) { + printf("CPID: %04x\n", devinfo->cpid); + printf("CPRV: %02x\n", devinfo->cprv); + printf("BDID: %02x\n", devinfo->bdid); + printf("ECID: " _FMT_lld "\n", devinfo->ecid); + printf("CPFM: %02x\n", devinfo->cpfm); + printf("SCEP: %02x\n", devinfo->scep); + printf("IBFL: %02x\n", devinfo->ibfl); + printf("SRNM: %s\n", (devinfo->srnm) ? devinfo->srnm : "N/A"); + printf("IMEI: %s\n", (devinfo->imei) ? devinfo->imei : "N/A"); + printf("NONC: "); + if (devinfo->ap_nonce) { + print_hex(devinfo->ap_nonce, devinfo->ap_nonce_size); + } else { + printf("N/A"); + } + printf("\n"); + printf("SNON: "); + if (devinfo->sep_nonce) { + print_hex(devinfo->sep_nonce, devinfo->sep_nonce_size); + } else { + printf("N/A"); + } + printf("\n"); + } else { + printf("Could not get device info?!\n"); + } + + ret = irecv_get_mode(client, &mode); + if (ret == IRECV_E_SUCCESS) { + printf("MODE: %s\n", mode_to_str(mode)); + } +} + static void parse_command(irecv_client_t client, unsigned char* command, unsigned int size) { char* cmd = strdup((char*)command); char* action = strtok(cmd, " "); @@ -142,42 +181,7 @@ static void parse_command(irecv_client_t client, unsigned char* command, unsigne irecv_send_file(client, filename, 0); } } else if (!strcmp(cmd, "/deviceinfo")) { - int ret, mode; - const struct irecv_device_info *devinfo = irecv_get_device_info(client); - - if (devinfo) { - printf("CPID: %04x\n", devinfo->cpid); - printf("CPRV: %02x\n", devinfo->cprv); - printf("BDID: %02x\n", devinfo->bdid); - printf("ECID: " _FMT_lld "\n", devinfo->ecid); - printf("CPFM: %02x\n", devinfo->cpfm); - printf("SCEP: %02x\n", devinfo->scep); - printf("IBFL: %02x\n", devinfo->ibfl); - printf("SRNM: %s\n", (devinfo->srnm) ? devinfo->srnm : "N/A"); - printf("IMEI: %s\n", (devinfo->imei) ? devinfo->imei : "N/A"); - printf("NONC: "); - if (devinfo->ap_nonce) { - print_hex(devinfo->ap_nonce, devinfo->ap_nonce_size); - } else { - printf("N/A"); - } - printf("\n"); - printf("SNON: "); - if (devinfo->sep_nonce) { - print_hex(devinfo->sep_nonce, devinfo->sep_nonce_size); - } else { - printf("N/A"); - } - printf("\n"); - } else { - printf("Could not get device info?!\n"); - } - - ret = irecv_get_mode(client, &mode); - if (ret == IRECV_E_SUCCESS) { - printf("MODE: %s\n", mode_to_str(mode)); - } - + print_device_info(client); } else if (!strcmp(cmd, "/limera1n")) { char* filename = strtok(NULL, " "); debug("Sending limera1n payload %s\n", filename); @@ -353,6 +357,7 @@ static void print_usage(int argc, char **argv) { printf(" -n\t\treboot device into normal mode (exit recovery loop)\n"); printf(" -e FILE\texecutes recovery script from FILE\n"); printf(" -s\t\tstart an interactive shell\n"); + printf(" -q\t\tquery device info\n"); printf(" -v\t\tenable verbose output, repeat for higher verbosity\n"); printf(" -h\t\tprints this usage information\n"); printf("\n"); @@ -376,7 +381,7 @@ int main(int argc, char* argv[]) { return 0; } - while ((opt = getopt(argc, argv, "i:vhrsmnc:f:e:k::")) > 0) { + while ((opt = getopt(argc, argv, "i:vhrsmnc:f:e:k::q")) > 0) { switch (opt) { case 'i': if (optarg) { @@ -436,6 +441,10 @@ int main(int argc, char* argv[]) { argument = optarg; break; + case 'q': + action = kQueryInfo; + break; + default: fprintf(stderr, "Unknown argument\n"); return -1; @@ -539,6 +548,11 @@ int main(int argc, char* argv[]) { debug("%s\n", irecv_strerror(error)); } break; + + case kQueryInfo: + print_device_info(client); + break; + default: fprintf(stderr, "Unknown action\n"); break; -- cgit v1.1-32-gdbae