summaryrefslogtreecommitdiffstats
path: root/src/irecovery.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/irecovery.c')
-rw-r--r--src/irecovery.c106
1 files changed, 60 insertions, 46 deletions
diff --git a/src/irecovery.c b/src/irecovery.c
index d53cf9b..a763272 100644
--- a/src/irecovery.c
+++ b/src/irecovery.c
@@ -33,25 +33,28 @@ enum {
static unsigned int quit = 0;
static unsigned int verbose = 0;
+int received_cb(irecv_client_t client, const irecv_event_t* event);
int precommand_cb(irecv_client_t client, const irecv_event_t* event);
int postcommand_cb(irecv_client_t client, const irecv_event_t* event);
-void print_shell_usage() {
+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/help\t\tShow this help.\n");
printf("\t/exit\t\tExit interactive shell.\n");
}
void parse_command(irecv_client_t client, unsigned char* command, unsigned int size) {
- char* cmd = strtok(strdup(command), " ");
- debug("Executing %s %s\n", cmd, command);
+ char* cmd = strdup(command);
+ char* action = strtok(cmd, " ");
+ debug("Executing %s\n", action);
if (!strcmp(cmd, "/exit")) {
quit = 1;
} else
if (!strcmp(cmd, "/help")) {
- print_shell_usage();
+ shell_usage();
} else
if (!strcmp(cmd, "/upload")) {
@@ -60,22 +63,18 @@ void parse_command(irecv_client_t client, unsigned char* command, unsigned int s
if (filename != NULL) {
irecv_send_file(client, filename);
}
- }
- free(cmd);
-}
+ } else
-int recv_callback(irecv_client_t client, unsigned char* data, int size) {
- int i = 0;
- for (i = 0; i < size; i++) {
- printf("%c", data[i]);
+ if (!strcmp(cmd, "/exploit")) {
+ char* filename = strtok(NULL, " ");
+ debug("Sending %s\n", filename);
+ if (filename != NULL) {
+ irecv_send_file(client, filename);
+ }
+ irecv_send_exploit(client);
}
- return size;
-}
-int send_callback(irecv_client_t client, unsigned char* command, int size) {
-
-
- return size;
+ free(action);
}
void load_command_history() {
@@ -90,7 +89,7 @@ void append_command_to_history(char* cmd) {
void init_shell(irecv_client_t client) {
irecv_error_t error = 0;
load_command_history();
- irecv_set_receiver(client, &recv_callback);
+ irecv_event_subscribe(client, IRECV_RECEIVED, &received_cb, NULL);
irecv_event_subscribe(client, IRECV_PRECOMMAND, &precommand_cb, NULL);
irecv_event_subscribe(client, IRECV_POSTCOMMAND, &postcommand_cb, NULL);
while (!quit) {
@@ -113,49 +112,64 @@ void init_shell(irecv_client_t client) {
}
}
-void print_usage() {
- printf("iRecovery - iDevice Recovery Utility\n");
- printf("Usage: ./irecovery [args]\n");
- printf("\t-v\t\tStart irecovery in verbose mode.\n");
- printf("\t-c <cmd>\tSend command to client.\n");
- printf("\t-f <file>\tSend file to client.\n");
- printf("\t-k [exploit]\tSend usb exploit to client.\n");
- printf("\t-h\t\tShow this help.\n");
- printf("\t-r\t\tReset client.\n");
- printf("\t-s\t\tStart interactive shell.\n");
- exit(1);
+int received_cb(irecv_client_t client, const irecv_event_t* event) {
+ if (event->type == IRECV_RECEIVED) {
+ int i = 0;
+ int size = event->size;
+ char* data = event->data;
+ for (i = 0; i < size; i++) {
+ printf("%c", data[i]);
+ }
+ }
+ return 0;
}
int precommand_cb(irecv_client_t client, const irecv_event_t* event) {
- irecv_error_t error = 0;
- if (event->data[0] == '/') {
- parse_command(client, event->data, strlen(event->data));
- return -1;
+ if (event->type == IRECV_PRECOMMAND) {
+ irecv_error_t error = 0;
+ if (event->data[0] == '/') {
+ parse_command(client, event->data, event->size);
+ return -1;
+ }
}
return 0;
}
int postcommand_cb(irecv_client_t client, const irecv_event_t* event) {
- irecv_error_t error = 0;
- if (strstr(event->data, "getenv") != NULL) {
- unsigned char* value = NULL;
- error = irecv_getenv(client, &value);
- if (error != IRECV_E_SUCCESS) {
- debug("%s\n", irecv_strerror(error));
- return error;
+ unsigned char* value = NULL;
+ if (event->type == IRECV_POSTCOMMAND) {
+ irecv_error_t error = 0;
+ if (strstr(event->data, "getenv") != NULL) {
+ error = irecv_getenv(client, &value);
+ if (error != IRECV_E_SUCCESS) {
+ debug("%s\n", irecv_strerror(error));
+ return error;
+ }
+ printf("%s\n", value);
}
- printf("%s\n", value);
- free(value);
- }
-
- if (!strcmp(event->data, "reboot")) {
- quit = 1;
+ if (!strcmp(event->data, "reboot")) {
+ quit = 1;
+ }
}
+ if (value != NULL) free(value);
return 0;
}
+void print_usage() {
+ printf("iRecovery - iDevice Recovery Utility\n");
+ printf("Usage: ./irecovery [args]\n");
+ printf("\t-v\t\tStart irecovery in verbose mode.\n");
+ printf("\t-c <cmd>\tSend command to client.\n");
+ printf("\t-f <file>\tSend file to client.\n");
+ printf("\t-k [payload]\tSend usb exploit to client.\n");
+ printf("\t-h\t\tShow this help.\n");
+ printf("\t-r\t\tReset client.\n");
+ printf("\t-s\t\tStart interactive shell.\n");
+ exit(1);
+}
+
int main(int argc, char** argv) {
int i = 0;
int opt = 0;