diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/idevicerestore.c | 38 |
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) { |