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) { | 
