mirror of
https://github.com/tihmstar/futurerestore.git
synced 2025-06-30 14:48:15 +00:00
Update idevicerestore to upstream
This commit is contained in:
parent
97ff42fd3a
commit
234bdb31cf
|
@ -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 |
|
||||||
|
|
2
external/idevicerestore
vendored
2
external/idevicerestore
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 5d39c3027dc6dfe2e8146f62dab5874ae64ede05
|
Subproject commit c637acfadff428e1aa445975aec50cfafeccb291
|
|
@ -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:
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in a new issue