summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/idevicerestore.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/idevicerestore.c b/src/idevicerestore.c
index 62fbc09..186595b 100644
--- a/src/idevicerestore.c
+++ b/src/idevicerestore.c
@@ -482,17 +482,39 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
if (dfu_client_new(client) < 0) {
return -1;
}
- info("exploiting with limera1n...\n");
- // TODO: check for non-limera1n device and fail
- if (limera1n_exploit(client->device, &client->dfu->client) != 0) {
- error("ERROR: limera1n exploit failed\n");
+
+ // Check if device is vulnerable to limera1n
+ unsigned int cpid = 0;
+ dfu_get_cpid(client, &cpid);
+
+ int limera1nDevices[] = {8920, 8922, 8930};
+ int limera1nDevicesLen = sizeof limera1nDevices / sizeof limera1nDevices[0];
+ int limera1nVuln = 0;
+
+ for (int i = 0; i < limera1nDevicesLen; i++) {
+ if (limera1nDevices[i] == cpid) {
+ limera1nVuln = 1;
+ break;
+ }
+ }
+
+ if (limera1nVuln == 1) {
+ info("exploiting with limera1n...\n");
+ if (limera1n_exploit(client->device, &client->dfu->client) != 0) {
+ error("ERROR: limera1n exploit failed\n");
+ dfu_client_free(client);
+ return -1;
+ }
+ dfu_client_free(client);
+ info("Device should be in pwned DFU state now.\n");
+
+ return 0;
+ }
+ else {
dfu_client_free(client);
+ error("ERROR: This device is not supported by the limera1n exploit");
return -1;
}
- dfu_client_free(client);
- info("Device should be in pwned DFU state now.\n");
-
- return 0;
}
if (client->flags & FLAG_LATEST) {