Update idevicerestore to upstream

This commit is contained in:
Cryptic 2021-09-22 04:56:34 -07:00
parent 97ff42fd3a
commit 234bdb31cf
No known key found for this signature in database
GPG key ID: 6027B509EFE3A76B
4 changed files with 48 additions and 48 deletions

View file

@ -69,7 +69,7 @@ Usage: `futurerestore [OPTIONS] iPSW`
| ` -d ` | ` --debug ` | Show all code, use to save a log for debug testing | | ` -d ` | ` --debug ` | Show all code, use to save a log for debug testing |
| ` -e ` | ` --exit-recovery ` | Exit recovery mode and quit | | ` -e ` | ` --exit-recovery ` | Exit recovery mode and quit |
| | ` --use-pwndfu ` | Restoring devices with Odysseus method. Device needs to be in pwned DFU mode already | | | ` --use-pwndfu ` | Restoring devices with Odysseus method. Device needs to be in pwned DFU mode already |
| | ` --no-ibss ` | Restoring devices with Odysseus method. For checkm8 devices general, bootrom needs to be patched already. | | | ` --no-ibss ` | Restoring devices with Odysseus method. For checkm8/iPwnder32 specifically, bootrom needs to be patched already with unless iPwnder. |
| | ` --just-boot "-v" ` | Tethered booting the device from pwned DFU mode. You can optionally set ` boot-args ` | | | ` --just-boot "-v" ` | Tethered booting the device from pwned DFU mode. You can optionally set ` boot-args ` |
| | ` --latest-sep ` | Use latest signed SEP instead of manually specifying one (may cause bad restore) | | | ` --latest-sep ` | Use latest signed SEP instead of manually specifying one (may cause bad restore) |
| ` -s ` | ` --sep PATH ` | Manually specify SEP to be flashed | | ` -s ` | ` --sep PATH ` | Manually specify SEP to be flashed |

@ -1 +1 @@
Subproject commit 5d39c3027dc6dfe2e8146f62dab5874ae64ede05 Subproject commit c637acfadff428e1aa445975aec50cfafeccb291

View file

@ -120,7 +120,7 @@ futurerestore::futurerestore(bool isUpdateInstall, bool isPwnDfu, bool noIBSS, b
bool futurerestore::init(){ bool futurerestore::init(){
if (_didInit) return _didInit; if (_didInit) return _didInit;
// If device is in an invalid state, don't check if it supports img4 // If device is in an invalid state, don't check if it supports img4
if ((_didInit = check_mode(_client) != MODE_UNKNOWN)) { if ((_didInit = check_mode(_client) != _MODE_UNKNOWN)) {
if (!(_client->image4supported = is_image4_supported(_client))){ if (!(_client->image4supported = is_image4_supported(_client))){
info("[INFO] 32-bit device detected\n"); info("[INFO] 32-bit device detected\n");
}else{ }else{
@ -139,7 +139,7 @@ uint64_t futurerestore::getDeviceEcid(){
int futurerestore::getDeviceMode(bool reRequest){ int futurerestore::getDeviceMode(bool reRequest){
retassure(_didInit, "did not init\n"); retassure(_didInit, "did not init\n");
if (!reRequest && _client->mode && _client->mode->index != MODE_UNKNOWN) { if (!reRequest && _client->mode && _client->mode->index != _MODE_UNKNOWN) {
return _client->mode->index; return _client->mode->index;
}else{ }else{
dfu_client_free(_client); dfu_client_free(_client);
@ -157,7 +157,7 @@ void futurerestore::putDeviceIntoRecovery(){
getDeviceMode(false); getDeviceMode(false);
info("Found device in %s mode\n", _client->mode->string); info("Found device in %s mode\n", _client->mode->string);
if (_client->mode->index == MODE_NORMAL){ if (_client->mode == MODE_NORMAL){
irecv_device_event_subscribe(&_client->irecv_e_ctx, irecv_event_cb, _client); irecv_device_event_subscribe(&_client->irecv_e_ctx, irecv_event_cb, _client);
idevice_event_subscribe(idevice_event_cb, _client); idevice_event_subscribe(idevice_event_cb, _client);
#ifdef HAVE_LIBIPATCHER #ifdef HAVE_LIBIPATCHER
@ -165,9 +165,9 @@ void futurerestore::putDeviceIntoRecovery(){
#endif #endif
info("Entering recovery mode...\n"); info("Entering recovery mode...\n");
retassure(!normal_enter_recovery(_client),"Unable to place device into recovery mode from %s mode\n", _client->mode->string); retassure(!normal_enter_recovery(_client),"Unable to place device into recovery mode from %s mode\n", _client->mode->string);
}else if (_client->mode->index == MODE_RECOVERY){ }else if (_client->mode == MODE_RECOVERY){
info("Device already in recovery mode\n"); info("Device already in recovery mode\n");
}else if (_client->mode->index == MODE_DFU && _isPwnDfu && }else if (_client->mode == MODE_DFU && _isPwnDfu &&
#ifdef HAVE_LIBIPATCHER #ifdef HAVE_LIBIPATCHER
true true
#else #else
@ -190,7 +190,7 @@ void futurerestore::putDeviceIntoRecovery(){
void futurerestore::setAutoboot(bool val){ void futurerestore::setAutoboot(bool val){
retassure(_didInit, "did not init\n"); retassure(_didInit, "did not init\n");
retassure(getDeviceMode(false) == MODE_RECOVERY, "can't set auto-boot, when device isn't in recovery mode\n"); retassure(getDeviceMode(false) == _MODE_RECOVERY, "can't set auto-boot, when device isn't in recovery mode\n");
if(!_client->recovery){ if(!_client->recovery){
retassure(!recovery_client_new(_client),"Could not connect to device in recovery mode.\n"); retassure(!recovery_client_new(_client),"Could not connect to device in recovery mode.\n");
} }
@ -206,8 +206,8 @@ void futurerestore::exitRecovery(){
plist_t futurerestore::nonceMatchesApTickets(){ plist_t futurerestore::nonceMatchesApTickets(){
retassure(_didInit, "did not init\n"); retassure(_didInit, "did not init\n");
if (getDeviceMode(true) != MODE_RECOVERY){ if (getDeviceMode(true) != _MODE_RECOVERY){
if (getDeviceMode(false) != MODE_DFU || *_client->version != '9') if (getDeviceMode(false) != _MODE_DFU || *_client->version != '9')
reterror("Device is not in recovery mode, can't check ApNonce\n"); reterror("Device is not in recovery mode, can't check ApNonce\n");
else else
_rerestoreiOS9 = (info("Detected iOS 9.x 32-bit re-restore, proceeding in DFU mode\n"),true); _rerestoreiOS9 = (info("Detected iOS 9.x 32-bit re-restore, proceeding in DFU mode\n"),true);
@ -249,8 +249,8 @@ plist_t futurerestore::nonceMatchesApTickets(){
if (memcmp(realnonce, nonce, ticketNonceSize) == 0 && if (memcmp(realnonce, nonce, ticketNonceSize) == 0 &&
( (ticketNonceSize == realNonceSize && realNonceSize+ticketNonceSize > 0) || ( (ticketNonceSize == realNonceSize && realNonceSize+ticketNonceSize > 0) ||
(!ticketNonceSize && *_client->version == '9' && (!ticketNonceSize && *_client->version == '9' &&
(getDeviceMode(false) == MODE_DFU || (getDeviceMode(false) == _MODE_DFU ||
( getDeviceMode(false) == MODE_RECOVERY && !strncmp(getiBootBuild(), "iBoot-2817", strlen("iBoot-2817")) ) ( getDeviceMode(false) == _MODE_RECOVERY && !strncmp(getiBootBuild(), "iBoot-2817", strlen("iBoot-2817")) )
) )
) )
) )
@ -266,7 +266,7 @@ plist_t futurerestore::nonceMatchesApTickets(){
std::pair<const char *,size_t> futurerestore::nonceMatchesIM4Ms(){ std::pair<const char *,size_t> futurerestore::nonceMatchesIM4Ms(){
retassure(_didInit, "did not init\n"); retassure(_didInit, "did not init\n");
retassure(getDeviceMode(true) == MODE_RECOVERY, "Device is not in recovery mode, can't check ApNonce\n"); retassure(getDeviceMode(true) == _MODE_RECOVERY, "Device is not in recovery mode, can't check ApNonce\n");
unsigned char* realnonce; unsigned char* realnonce;
int realNonceSize = 0; int realNonceSize = 0;
@ -320,7 +320,7 @@ void futurerestore::waitForNonce(vector<const char *>nonces, size_t nonceSize){
recovery_client_free(_client); recovery_client_free(_client);
usleep(1*USEC_PER_SEC); usleep(1*USEC_PER_SEC);
} }
while (getDeviceMode(true) != MODE_RECOVERY) usleep(USEC_PER_SEC*0.5); while (getDeviceMode(true) != _MODE_RECOVERY) usleep(USEC_PER_SEC*0.5);
retassure(!recovery_client_new(_client), "Could not connect to device in recovery mode\n"); retassure(!recovery_client_new(_client), "Could not connect to device in recovery mode\n");
recovery_get_ap_nonce(_client, &realnonce, &realNonceSize); recovery_get_ap_nonce(_client, &realnonce, &realNonceSize);
@ -474,7 +474,7 @@ void futurerestore::enterPwnRecovery(plist_t build_identity, string bootargs){
getDeviceMode(false); getDeviceMode(false);
mutex_lock(&_client->device_event_mutex); mutex_lock(&_client->device_event_mutex);
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 1000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 1000);
retassure(((_client->mode->index == MODE_DFU) || (mutex_unlock(&_client->device_event_mutex),0)), "Device isn't in DFU mode!"); retassure(((_client->mode == MODE_DFU) || (mutex_unlock(&_client->device_event_mutex),0)), "Device isn't in DFU mode!");
retassure(((dfu_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in DFU Mode!"); retassure(((dfu_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in DFU Mode!");
mutex_unlock(&_client->device_event_mutex); mutex_unlock(&_client->device_event_mutex);
info("Device found in DFU Mode.\n"); info("Device found in DFU Mode.\n");
@ -522,12 +522,12 @@ void futurerestore::enterPwnRecovery(plist_t build_identity, string bootargs){
info("Booting iBSS, waiting for device to disconnect...\n"); info("Booting iBSS, waiting for device to disconnect...\n");
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_UNKNOWN]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBSS. Reset device and try again"); retassure(((_client->mode != MODE_UNKNOWN) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBSS. Reset device and try again");
info("Booting iBSS, waiting for device to reconnect...\n"); info("Booting iBSS, waiting for device to reconnect...\n");
bool dfu = false; bool dfu = false;
if((_client->device->chip_id >= 0x7000 && _client->device->chip_id <= 0x8004) || (_client->device->chip_id >= 0x8900 && _client->device->chip_id <= 0x8965)) { if((_client->device->chip_id >= 0x7000 && _client->device->chip_id <= 0x8004) || (_client->device->chip_id >= 0x8900 && _client->device->chip_id <= 0x8965)) {
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_DFU]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBSS. Reset device and try again"); retassure(((_client->mode == MODE_DFU) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBSS. Reset device and try again");
if (_client->build_major > 8) { if (_client->build_major > 8) {
mutex_unlock(&_client->device_event_mutex); mutex_unlock(&_client->device_event_mutex);
getDeviceMode(true); getDeviceMode(true);
@ -541,10 +541,10 @@ void futurerestore::enterPwnRecovery(plist_t build_identity, string bootargs){
info("Booting iBEC, waiting for device to disconnect...\n"); info("Booting iBEC, waiting for device to disconnect...\n");
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_UNKNOWN]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); retassure(((_client->mode == MODE_UNKNOWN) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again");
info("Booting iBEC, waiting for device to reconnect...\n"); info("Booting iBEC, waiting for device to reconnect...\n");
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_RECOVERY]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again"); retassure(((_client->mode == MODE_RECOVERY) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again");
mutex_unlock(&_client->device_event_mutex); mutex_unlock(&_client->device_event_mutex);
getDeviceMode(true); getDeviceMode(true);
retassure(((recovery_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in Recovery Mode!"); retassure(((recovery_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in Recovery Mode!");
@ -553,7 +553,7 @@ void futurerestore::enterPwnRecovery(plist_t build_identity, string bootargs){
} else if((_client->device->chip_id >= 0x8006 && _client->device->chip_id <= 0x8030) || (_client->device->chip_id >= 0x8101 && _client->device->chip_id <= 0x8301)) { } else if((_client->device->chip_id >= 0x8006 && _client->device->chip_id <= 0x8030) || (_client->device->chip_id >= 0x8101 && _client->device->chip_id <= 0x8301)) {
dfu = true; dfu = true;
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_RECOVERY]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBSS. Reset device and try again"); retassure(((_client->mode == MODE_RECOVERY) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBSS. Reset device and try again");
} else { } else {
mutex_unlock(&_client->device_event_mutex); mutex_unlock(&_client->device_event_mutex);
reterror("Device not supported!\n"); reterror("Device not supported!\n");
@ -602,10 +602,10 @@ void futurerestore::enterPwnRecovery(plist_t build_identity, string bootargs){
info("Booting iBEC, waiting for device to disconnect...\n"); info("Booting iBEC, waiting for device to disconnect...\n");
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_UNKNOWN]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); retassure(((_client->mode == MODE_UNKNOWN) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again");
info("Booting iBEC, waiting for device to reconnect...\n"); info("Booting iBEC, waiting for device to reconnect...\n");
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_RECOVERY]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again"); retassure(((_client->mode == MODE_RECOVERY) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again");
mutex_unlock(&_client->device_event_mutex); mutex_unlock(&_client->device_event_mutex);
getDeviceMode(true); getDeviceMode(true);
retassure(((recovery_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in Recovery Mode after ApNonce hax!"); retassure(((recovery_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in Recovery Mode after ApNonce hax!");
@ -626,10 +626,10 @@ void futurerestore::enterPwnRecovery(plist_t build_identity, string bootargs){
info("Booting iBEC, waiting for device to disconnect...\n"); info("Booting iBEC, waiting for device to disconnect...\n");
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_UNKNOWN]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); retassure(((MODE_UNKNOWN) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again");
info("Booting iBEC, waiting for device to reconnect...\n"); info("Booting iBEC, waiting for device to reconnect...\n");
cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000); cond_wait_timeout(&_client->device_event_cond, &_client->device_event_mutex, 10000);
retassure(((_client->mode == &idevicerestore_modes[MODE_RECOVERY]) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again"); retassure(((MODE_RECOVERY) || (mutex_unlock(&_client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again");
mutex_unlock(&_client->device_event_mutex); mutex_unlock(&_client->device_event_mutex);
getDeviceMode(true); getDeviceMode(true);
retassure(((recovery_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in Recovery Mode after ApNonce hax!"); retassure(((recovery_client_new(_client) == IRECV_E_SUCCESS) || (mutex_unlock(&_client->device_event_mutex),0)), "Failed to connect to device in Recovery Mode after ApNonce hax!");
@ -1128,9 +1128,9 @@ void futurerestore::doRestore(const char *ipsw){
mutex_lock(&client->device_event_mutex); mutex_lock(&client->device_event_mutex);
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000);
retassure(client->mode != &idevicerestore_modes[MODE_UNKNOWN], "Unable to discover device mode. Please make sure a device is attached.\n"); retassure(client->mode != MODE_UNKNOWN, "Unable to discover device mode. Please make sure a device is attached.\n");
if (client->mode != &idevicerestore_modes[MODE_RECOVERY]) { if (client->mode != MODE_RECOVERY) {
retassure(client->mode == &idevicerestore_modes[MODE_DFU], "Device is in unexpected mode detected!"); retassure(client->mode == MODE_DFU, "Device is in unexpected mode detected!");
retassure(_enterPwnRecoveryRequested, "Device is in DFU mode detected, but we were expecting recovery mode!"); retassure(_enterPwnRecoveryRequested, "Device is in DFU mode detected, but we were expecting recovery mode!");
}else{ }else{
retassure(!_enterPwnRecoveryRequested, "--use-pwndfu was specified, but device found in recovery mode!"); retassure(!_enterPwnRecoveryRequested, "--use-pwndfu was specified, but device found in recovery mode!");
@ -1329,7 +1329,7 @@ void futurerestore::doRestore(const char *ipsw){
//check for enterpwnrecovery, because we could be in DFU mode //check for enterpwnrecovery, because we could be in DFU mode
if (_enterPwnRecoveryRequested){ if (_enterPwnRecoveryRequested){
retassure((getDeviceMode(true) == MODE_DFU) || (getDeviceMode(false) == MODE_RECOVERY && _noIBSS), "unexpected device mode\n"); retassure((getDeviceMode(true) == _MODE_DFU) || (getDeviceMode(false) == _MODE_RECOVERY && _noIBSS), "unexpected device mode\n");
enterPwnRecovery(build_identity); enterPwnRecovery(build_identity);
} }
@ -1429,13 +1429,13 @@ void futurerestore::doRestore(const char *ipsw){
info("Booting iBSS, Waiting for device to disconnect...\n"); info("Booting iBSS, Waiting for device to disconnect...\n");
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000);
retassure((client->mode == &idevicerestore_modes[MODE_UNKNOWN] || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBSS. Reset device and try again"); retassure((client->mode == MODE_UNKNOWN || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBSS. Reset device and try again");
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
info("Booting iBSS, Waiting for device to reconnect...\n"); info("Booting iBSS, Waiting for device to reconnect...\n");
mutex_lock(&_client->device_event_mutex); mutex_lock(&_client->device_event_mutex);
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000);
retassure((client->mode == &idevicerestore_modes[MODE_DFU] || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBSS. Reset device and try again"); retassure((client->mode == MODE_DFU || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBSS. Reset device and try again");
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
dfu_client_new(client); dfu_client_new(client);
@ -1452,13 +1452,13 @@ void futurerestore::doRestore(const char *ipsw){
info("Booting iBEC, Waiting for device to disconnect...\n"); info("Booting iBEC, Waiting for device to disconnect...\n");
mutex_lock(&_client->device_event_mutex); mutex_lock(&_client->device_event_mutex);
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000);
/* retassure((client->mode == &idevicerestore_modes[MODE_UNKNOWN] || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); */ /* retassure((client->mode == MODE_UNKNOWN || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); */
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
info("Booting iBEC, Waiting for device to reconnect...\n"); info("Booting iBEC, Waiting for device to reconnect...\n");
mutex_lock(&_client->device_event_mutex); mutex_lock(&_client->device_event_mutex);
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000);
retassure((client->mode == &idevicerestore_modes[MODE_RECOVERY] || (mutex_unlock(&client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again"); retassure((client->mode == MODE_RECOVERY || (mutex_unlock(&client->device_event_mutex),0)), "Device did not reconnect. Possibly invalid iBEC. Reset device and try again");
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
}else{ }else{
@ -1487,24 +1487,24 @@ void futurerestore::doRestore(const char *ipsw){
debug("Waiting for device to disconnect...\n"); debug("Waiting for device to disconnect...\n");
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000);
/* retassure((client->mode == &idevicerestore_modes[MODE_UNKNOWN] || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); */ /* retassure((client->mode == MODE_UNKNOWN || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); */
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
debug("Waiting for device to reconnect...\n"); debug("Waiting for device to reconnect...\n");
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 10000);
/* retassure((client->mode == &idevicerestore_modes[MODE_RECOVERY] || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); */ /* retassure((client->mode == MODE_RECOVERY || (mutex_unlock(&client->device_event_mutex),0)), "Device did not disconnect. Possibly invalid iBEC. Reset device and try again"); */
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
} }
retassure(client->mode == &idevicerestore_modes[MODE_RECOVERY], "failed to reconnect to device in recovery (iBEC) mode\n"); retassure(client->mode == MODE_RECOVERY, "failed to reconnect to device in recovery (iBEC) mode\n");
//do magic //do magic
if (_client->image4supported) get_sep_nonce(client, &client->sepnonce, &client->sepnonce_size); if (_client->image4supported) get_sep_nonce(client, &client->sepnonce, &client->sepnonce_size);
get_ap_nonce(client, &client->nonce, &client->nonce_size); get_ap_nonce(client, &client->nonce, &client->nonce_size);
get_ecid(client, &client->ecid); get_ecid(client, &client->ecid);
if (client->mode->index == MODE_RECOVERY) { if (client->mode == MODE_RECOVERY) {
retassure(client->srnm,"ERROR: could not retrieve device serial number. Can't continue.\n"); retassure(client->srnm,"ERROR: could not retrieve device serial number. Can't continue.\n");
if(client->device->chip_id < 0x8015) { if(client->device->chip_id < 0x8015) {
@ -1527,7 +1527,7 @@ void futurerestore::doRestore(const char *ipsw){
mutex_lock(&client->device_event_mutex); mutex_lock(&client->device_event_mutex);
debug("Waiting for device to enter restore mode...\n"); debug("Waiting for device to enter restore mode...\n");
cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 180000); cond_wait_timeout(&client->device_event_cond, &client->device_event_mutex, 180000);
retassure((client->mode == &idevicerestore_modes[MODE_RESTORE] || (mutex_unlock(&client->device_event_mutex),0)), "Device can't enter to restore mode"); retassure((client->mode == MODE_RESTORE || (mutex_unlock(&client->device_event_mutex),0)), "Device can't enter to restore mode");
mutex_unlock(&client->device_event_mutex); mutex_unlock(&client->device_event_mutex);
info("About to restore device... \n"); info("About to restore device... \n");
@ -1654,17 +1654,17 @@ const char *futurerestore::getDeviceModelNoCopy(){
if (!_client->device || !_client->device->product_type){ if (!_client->device || !_client->device->product_type){
int mode = getDeviceMode(true); int mode = getDeviceMode(true);
retassure(mode == MODE_NORMAL || mode == MODE_RECOVERY || mode == MODE_DFU, "unexpected device mode=%d\n",mode); retassure(mode == _MODE_NORMAL || mode == _MODE_RECOVERY || mode == _MODE_DFU, "unexpected device mode=%d\n",mode);
switch (mode) { switch (mode) {
case MODE_RESTORE: case _MODE_RESTORE:
_client->device = restore_get_irecv_device(_client); _client->device = restore_get_irecv_device(_client);
break; break;
case MODE_NORMAL: case _MODE_NORMAL:
_client->device = normal_get_irecv_device(_client); _client->device = normal_get_irecv_device(_client);
break; break;
case MODE_DFU: case _MODE_DFU:
case MODE_RECOVERY: case _MODE_RECOVERY:
_client->device = dfu_get_irecv_device(_client); _client->device = dfu_get_irecv_device(_client);
break; break;
default: default:
@ -1679,17 +1679,17 @@ const char *futurerestore::getDeviceBoardNoCopy(){
if (!_client->device || !_client->device->product_type){ if (!_client->device || !_client->device->product_type){
int mode = getDeviceMode(true); int mode = getDeviceMode(true);
retassure(mode == MODE_NORMAL || mode == MODE_RECOVERY || mode == MODE_DFU, "unexpected device mode=%d\n",mode); retassure(mode == _MODE_NORMAL || mode == _MODE_RECOVERY || mode == _MODE_DFU, "unexpected device mode=%d\n",mode);
switch (mode) { switch (mode) {
case MODE_RESTORE: case _MODE_RESTORE:
_client->device = restore_get_irecv_device(_client); _client->device = restore_get_irecv_device(_client);
break; break;
case MODE_NORMAL: case _MODE_NORMAL:
_client->device = normal_get_irecv_device(_client); _client->device = normal_get_irecv_device(_client);
break; break;
case MODE_DFU: case _MODE_DFU:
case MODE_RECOVERY: case _MODE_RECOVERY:
_client->device = dfu_get_irecv_device(_client); _client->device = dfu_get_irecv_device(_client);
break; break;
default: default:

View file

@ -80,7 +80,7 @@ void cmd_help(){
printf("\nOptions for downgrading with Odysseus:\n"); printf("\nOptions for downgrading with Odysseus:\n");
printf(" --use-pwndfu\t\tRestoring devices with Odysseus method. Device needs to be in pwned DFU mode already\n"); printf(" --use-pwndfu\t\tRestoring devices with Odysseus method. Device needs to be in pwned DFU mode already\n");
printf(" --just-boot=\"-v\"\t\tTethered booting the device from pwned DFU mode. You can optionally set boot-args\n"); printf(" --just-boot=\"-v\"\t\tTethered booting the device from pwned DFU mode. You can optionally set boot-args\n");
printf(" --no-ibss\t\t\tRestoring devices with Odysseus method. For checkm8 devices general, bootrom needs to be patched already.\n"); printf(" --no-ibss\t\t\tRestoring devices with Odysseus method. For checkm8/iPwnder32 specifically, bootrom needs to be patched already with unless iPwnder.\n");
#endif #endif
printf("\nOptions for SEP:\n"); printf("\nOptions for SEP:\n");