diff options
author | Nicolas Haunold | 2011-03-09 20:14:12 +0100 |
---|---|---|
committer | Nicolas Haunold | 2011-03-09 20:14:12 +0100 |
commit | ee84c231a361ccb85f9eebc40a4c2e1551bcf010 (patch) | |
tree | e1706dd7100b2ce827e1f7802f697f5af2799682 | |
parent | 95fb4802fe4d76d3ed76a77197ec48ad51f28deb (diff) | |
download | libirecovery-ee84c231a361ccb85f9eebc40a4c2e1551bcf010.tar.gz libirecovery-ee84c231a361ccb85f9eebc40a4c2e1551bcf010.tar.bz2 |
Added irecv_get_srnm (serial number) and irecv_get_imei (imei) to libirecovery and /deviceinfo to the irecovery shell which displays basic device information.
-rw-r--r-- | irecovery.c | 34 | ||||
-rw-r--r-- | libirecovery.c | 43 |
2 files changed, 75 insertions, 2 deletions
diff --git a/irecovery.c b/irecovery.c index 40e6021..a7d6429 100644 --- a/irecovery.c +++ b/irecovery.c @@ -46,6 +46,7 @@ void shell_usage() { printf("Usage:\n"); printf("\t/upload <file>\tSend file to client.\n"); printf("\t/exploit [file]\tSend usb exploit with optional payload\n"); + printf("\t/deviceinfo\tShow device information (ECID, IMEI, etc.)\n"); printf("\t/help\t\tShow this help.\n"); printf("\t/exit\t\tExit interactive shell.\n"); } @@ -70,6 +71,38 @@ void parse_command(irecv_client_t client, unsigned char* command, unsigned int s } } else + if (!strcmp(cmd, "/deviceinfo")) { + int ret; + unsigned int cpid, bdid; + unsigned long long ecid; + unsigned char srnm[12], imei[15], bt[15]; + + ret = irecv_get_cpid(client, &cpid); + if(ret == IRECV_E_SUCCESS) { + printf("CPID: %d\n", cpid); + } + + ret = irecv_get_bdid(client, &bdid); + if(ret == IRECV_E_SUCCESS) { + printf("BDID: %d\n", bdid); + } + + ret = irecv_get_ecid(client, &ecid); + if(ret == IRECV_E_SUCCESS) { + printf("ECID: %lld\n", ecid); + } + + ret = irecv_get_srnm(client, srnm); + if(ret == IRECV_E_SUCCESS) { + printf("SRNM: %s\n", srnm); + } + + ret = irecv_get_imei(client, imei); + if(ret == IRECV_E_SUCCESS) { + printf("IMEI: %s\n", imei); + } + } else + if (!strcmp(cmd, "/exploit")) { char* filename = strtok(NULL, " "); debug("Sending exploit %s\n", filename); @@ -109,6 +142,7 @@ void init_shell(irecv_client_t client) { irecv_event_subscribe(client, IRECV_POSTCOMMAND, &postcommand_cb, NULL); while (!quit) { error = irecv_receive(client); + if (error != IRECV_E_SUCCESS) { debug("%s\n", irecv_strerror(error)); break; diff --git a/libirecovery.c b/libirecovery.c index 84c7b6f..540e01c 100644 --- a/libirecovery.c +++ b/libirecovery.c @@ -844,7 +844,7 @@ irecv_error_t irecv_get_cpid(irecv_client_t client, unsigned int* cpid) { irecv_error_t irecv_get_bdid(irecv_client_t client, unsigned int* bdid) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; - + char* bdid_string = strstr(client->serial, "BDID:"); if (bdid_string == NULL) { *bdid = 0; @@ -868,6 +868,45 @@ irecv_error_t irecv_get_ecid(irecv_client_t client, unsigned long long* ecid) { return IRECV_E_SUCCESS; } +irecv_error_t irecv_get_srnm(irecv_client_t client, unsigned char* srnm) { + if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; + + char* srnmp; + char* srnm_string = strstr(client->serial, "SRNM:["); + if(srnm_string == NULL) { + srnm = NULL; + return IRECV_E_UNKNOWN_ERROR; + } + + sscanf(srnm_string, "SRNM:[%s]", srnm); + srnmp = strrchr(srnm, ']'); + if(srnmp != NULL) { + *srnmp = '\0'; + } + + return IRECV_E_SUCCESS; +} + +irecv_error_t irecv_get_imei(irecv_client_t client, unsigned char* imei) { + if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; + + char* imeip; + char* imei_string = strstr(client->serial, "IMEI:["); + if (imei_string == NULL) { + *imei = 0; + return IRECV_E_UNKNOWN_ERROR; + } + + + sscanf(imei_string, "IMEI:[%s]", imei); + imeip = strrchr(imei, ']'); + if(imeip != NULL) { + *imeip = '\0'; + } + + return IRECV_E_SUCCESS; +} + irecv_error_t irecv_send_exploit(irecv_client_t client) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; irecv_control_transfer(client, 0x21, 2, 0, 0, NULL, 0, 1000); @@ -877,7 +916,7 @@ irecv_error_t irecv_send_exploit(irecv_client_t client) { irecv_error_t irecv_execute_script(irecv_client_t client, const char* filename) { irecv_error_t error = IRECV_E_SUCCESS; if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; - + char* file_data = NULL; unsigned int file_size = 0; if(irecv_read_file(filename, &file_data, &file_size) < 0) { |