diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/irecovery.c | 61 |
1 files changed, 38 insertions, 23 deletions
diff --git a/tools/irecovery.c b/tools/irecovery.c index faf0a92..34e80bf 100644 --- a/tools/irecovery.c +++ b/tools/irecovery.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * irecovery.c | 2 | * irecovery.c |
| 3 | * Software frontend for iBoot/iBSS communication with iOS devices | 3 | * Software frontend for iBoot/iBSS communication with iOS devices |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2012-2020 Nikias Bassen <nikias@gmx.li> | 5 | * Copyright (c) 2012-2023 Nikias Bassen <nikias@gmx.li> |
| 6 | * Copyright (c) 2012-2015 Martin Szulecki <martin.szulecki@libimobiledevice.org> | 6 | * Copyright (c) 2012-2015 Martin Szulecki <martin.szulecki@libimobiledevice.org> |
| 7 | * Copyright (c) 2010-2011 Chronic-Dev Team | 7 | * Copyright (c) 2010-2011 Chronic-Dev Team |
| 8 | * Copyright (c) 2010-2011 Joshua Hill | 8 | * Copyright (c) 2010-2011 Joshua Hill |
| @@ -43,7 +43,7 @@ | |||
| 43 | #endif | 43 | #endif |
| 44 | 44 | ||
| 45 | #define FILE_HISTORY_PATH ".irecovery" | 45 | #define FILE_HISTORY_PATH ".irecovery" |
| 46 | #define debug(...) if(verbose) fprintf(stderr, __VA_ARGS__) | 46 | #define debug(...) if (verbose) fprintf(stderr, __VA_ARGS__) |
| 47 | 47 | ||
| 48 | enum { | 48 | enum { |
| 49 | kNoAction, | 49 | kNoAction, |
| @@ -68,7 +68,8 @@ int progress_cb(irecv_client_t client, const irecv_event_t* event); | |||
| 68 | int precommand_cb(irecv_client_t client, const irecv_event_t* event); | 68 | int precommand_cb(irecv_client_t client, const irecv_event_t* event); |
| 69 | int postcommand_cb(irecv_client_t client, const irecv_event_t* event); | 69 | int postcommand_cb(irecv_client_t client, const irecv_event_t* event); |
| 70 | 70 | ||
| 71 | static void shell_usage() { | 71 | static void shell_usage() |
| 72 | { | ||
| 72 | printf("Usage:\n"); | 73 | printf("Usage:\n"); |
| 73 | printf(" /upload FILE\t\tsend FILE to device\n"); | 74 | printf(" /upload FILE\t\tsend FILE to device\n"); |
| 74 | printf(" /limera1n [FILE]\trun limera1n exploit and send optional payload from FILE\n"); | 75 | printf(" /limera1n [FILE]\trun limera1n exploit and send optional payload from FILE\n"); |
| @@ -77,7 +78,8 @@ static void shell_usage() { | |||
| 77 | printf(" /exit\t\t\texit interactive shell\n"); | 78 | printf(" /exit\t\t\texit interactive shell\n"); |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | static const char* mode_to_str(int mode) { | 81 | static const char* mode_to_str(int mode) |
| 82 | { | ||
| 81 | switch (mode) { | 83 | switch (mode) { |
| 82 | case IRECV_K_RECOVERY_MODE_1: | 84 | case IRECV_K_RECOVERY_MODE_1: |
| 83 | case IRECV_K_RECOVERY_MODE_2: | 85 | case IRECV_K_RECOVERY_MODE_2: |
| @@ -97,7 +99,8 @@ static const char* mode_to_str(int mode) { | |||
| 97 | } | 99 | } |
| 98 | } | 100 | } |
| 99 | 101 | ||
| 100 | static void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length) { | 102 | static void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length) |
| 103 | { | ||
| 101 | FILE *f; | 104 | FILE *f; |
| 102 | uint64_t size; | 105 | uint64_t size; |
| 103 | 106 | ||
| @@ -187,7 +190,8 @@ static void print_device_info(irecv_client_t client) | |||
| 187 | } | 190 | } |
| 188 | } | 191 | } |
| 189 | 192 | ||
| 190 | static void print_devices() { | 193 | static void print_devices() |
| 194 | { | ||
| 191 | struct irecv_device *devices = irecv_devices_get_all(); | 195 | struct irecv_device *devices = irecv_devices_get_all(); |
| 192 | struct irecv_device *device = NULL; | 196 | struct irecv_device *device = NULL; |
| 193 | int i = 0; | 197 | int i = 0; |
| @@ -209,7 +213,8 @@ static int _is_breq_command(const char* cmd) | |||
| 209 | ); | 213 | ); |
| 210 | } | 214 | } |
| 211 | 215 | ||
| 212 | static void parse_command(irecv_client_t client, unsigned char* command, unsigned int size) { | 216 | static void parse_command(irecv_client_t client, unsigned char* command, unsigned int size) |
| 217 | { | ||
| 213 | char* cmd = strdup((char*)command); | 218 | char* cmd = strdup((char*)command); |
| 214 | char* action = strtok(cmd, " "); | 219 | char* action = strtok(cmd, " "); |
| 215 | 220 | ||
| @@ -254,16 +259,19 @@ static void parse_command(irecv_client_t client, unsigned char* command, unsigne | |||
| 254 | free(action); | 259 | free(action); |
| 255 | } | 260 | } |
| 256 | 261 | ||
| 257 | static void load_command_history() { | 262 | static void load_command_history() |
| 263 | { | ||
| 258 | read_history(FILE_HISTORY_PATH); | 264 | read_history(FILE_HISTORY_PATH); |
| 259 | } | 265 | } |
| 260 | 266 | ||
| 261 | static void append_command_to_history(char* cmd) { | 267 | static void append_command_to_history(char* cmd) |
| 268 | { | ||
| 262 | add_history(cmd); | 269 | add_history(cmd); |
| 263 | write_history(FILE_HISTORY_PATH); | 270 | write_history(FILE_HISTORY_PATH); |
| 264 | } | 271 | } |
| 265 | 272 | ||
| 266 | static void init_shell(irecv_client_t client) { | 273 | static void init_shell(irecv_client_t client) |
| 274 | { | ||
| 267 | irecv_error_t error = 0; | 275 | irecv_error_t error = 0; |
| 268 | load_command_history(); | 276 | load_command_history(); |
| 269 | irecv_event_subscribe(client, IRECV_PROGRESS, &progress_cb, NULL); | 277 | irecv_event_subscribe(client, IRECV_PROGRESS, &progress_cb, NULL); |
| @@ -294,7 +302,8 @@ static void init_shell(irecv_client_t client) { | |||
| 294 | } | 302 | } |
| 295 | } | 303 | } |
| 296 | 304 | ||
| 297 | int received_cb(irecv_client_t client, const irecv_event_t* event) { | 305 | int received_cb(irecv_client_t client, const irecv_event_t* event) |
| 306 | { | ||
| 298 | if (event->type == IRECV_RECEIVED) { | 307 | if (event->type == IRECV_RECEIVED) { |
| 299 | int i = 0; | 308 | int i = 0; |
| 300 | int size = event->size; | 309 | int size = event->size; |
| @@ -307,7 +316,8 @@ int received_cb(irecv_client_t client, const irecv_event_t* event) { | |||
| 307 | return 0; | 316 | return 0; |
| 308 | } | 317 | } |
| 309 | 318 | ||
| 310 | int precommand_cb(irecv_client_t client, const irecv_event_t* event) { | 319 | int precommand_cb(irecv_client_t client, const irecv_event_t* event) |
| 320 | { | ||
| 311 | if (event->type == IRECV_PRECOMMAND) { | 321 | if (event->type == IRECV_PRECOMMAND) { |
| 312 | if (event->data[0] == '/') { | 322 | if (event->data[0] == '/') { |
| 313 | parse_command(client, (unsigned char*)event->data, event->size); | 323 | parse_command(client, (unsigned char*)event->data, event->size); |
| @@ -318,7 +328,8 @@ int precommand_cb(irecv_client_t client, const irecv_event_t* event) { | |||
| 318 | return 0; | 328 | return 0; |
| 319 | } | 329 | } |
| 320 | 330 | ||
| 321 | int postcommand_cb(irecv_client_t client, const irecv_event_t* event) { | 331 | int postcommand_cb(irecv_client_t client, const irecv_event_t* event) |
| 332 | { | ||
| 322 | char* value = NULL; | 333 | char* value = NULL; |
| 323 | char* action = NULL; | 334 | char* action = NULL; |
| 324 | char* command = NULL; | 335 | char* command = NULL; |
| @@ -350,7 +361,8 @@ int postcommand_cb(irecv_client_t client, const irecv_event_t* event) { | |||
| 350 | return 0; | 361 | return 0; |
| 351 | } | 362 | } |
| 352 | 363 | ||
| 353 | int progress_cb(irecv_client_t client, const irecv_event_t* event) { | 364 | int progress_cb(irecv_client_t client, const irecv_event_t* event) |
| 365 | { | ||
| 354 | if (event->type == IRECV_PROGRESS) { | 366 | if (event->type == IRECV_PROGRESS) { |
| 355 | print_progress_bar(event->progress); | 367 | print_progress_bar(event->progress); |
| 356 | } | 368 | } |
| @@ -358,21 +370,22 @@ int progress_cb(irecv_client_t client, const irecv_event_t* event) { | |||
| 358 | return 0; | 370 | return 0; |
| 359 | } | 371 | } |
| 360 | 372 | ||
| 361 | void print_progress_bar(double progress) { | 373 | void print_progress_bar(double progress) |
| 374 | { | ||
| 362 | int i = 0; | 375 | int i = 0; |
| 363 | 376 | ||
| 364 | if(progress < 0) { | 377 | if (progress < 0) { |
| 365 | return; | 378 | return; |
| 366 | } | 379 | } |
| 367 | 380 | ||
| 368 | if(progress > 100) { | 381 | if (progress > 100) { |
| 369 | progress = 100; | 382 | progress = 100; |
| 370 | } | 383 | } |
| 371 | 384 | ||
| 372 | printf("\r["); | 385 | printf("\r["); |
| 373 | 386 | ||
| 374 | for(i = 0; i < 50; i++) { | 387 | for (i = 0; i < 50; i++) { |
| 375 | if(i < progress / 2) { | 388 | if (i < progress / 2) { |
| 376 | printf("="); | 389 | printf("="); |
| 377 | } else { | 390 | } else { |
| 378 | printf(" "); | 391 | printf(" "); |
| @@ -383,12 +396,13 @@ void print_progress_bar(double progress) { | |||
| 383 | 396 | ||
| 384 | fflush(stdout); | 397 | fflush(stdout); |
| 385 | 398 | ||
| 386 | if(progress == 100) { | 399 | if (progress == 100) { |
| 387 | printf("\n"); | 400 | printf("\n"); |
| 388 | } | 401 | } |
| 389 | } | 402 | } |
| 390 | 403 | ||
| 391 | static void print_usage(int argc, char **argv) { | 404 | static void print_usage(int argc, char **argv) |
| 405 | { | ||
| 392 | char *name = NULL; | 406 | char *name = NULL; |
| 393 | name = strrchr(argv[0], '/'); | 407 | name = strrchr(argv[0], '/'); |
| 394 | printf("Usage: %s [OPTIONS]\n", (name ? name + 1: argv[0])); | 408 | printf("Usage: %s [OPTIONS]\n", (name ? name + 1: argv[0])); |
| @@ -415,7 +429,8 @@ static void print_usage(int argc, char **argv) { | |||
| 415 | printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n"); | 429 | printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n"); |
| 416 | } | 430 | } |
| 417 | 431 | ||
| 418 | int main(int argc, char* argv[]) { | 432 | int main(int argc, char* argv[]) |
| 433 | { | ||
| 419 | static struct option longopts[] = { | 434 | static struct option longopts[] = { |
| 420 | { "ecid", required_argument, NULL, 'i' }, | 435 | { "ecid", required_argument, NULL, 'i' }, |
| 421 | { "command", required_argument, NULL, 'c' }, | 436 | { "command", required_argument, NULL, 'c' }, |
| @@ -605,7 +620,7 @@ int main(int argc, char* argv[]) { | |||
| 605 | buffer[buffer_length] = '\0'; | 620 | buffer[buffer_length] = '\0'; |
| 606 | 621 | ||
| 607 | error = irecv_execute_script(client, buffer); | 622 | error = irecv_execute_script(client, buffer); |
| 608 | if(error != IRECV_E_SUCCESS) { | 623 | if (error != IRECV_E_SUCCESS) { |
| 609 | debug("%s\n", irecv_strerror(error)); | 624 | debug("%s\n", irecv_strerror(error)); |
| 610 | } | 625 | } |
| 611 | 626 | ||
