Questo accessorio non è compatibile con iPhone? Ecco come risolvere

A quanti capita di vedere questo messaggio sul proprio dispositivo?
E se fosse l’opportunità per iniziare uno studio approfondito su una parte del firmware iPhone? L’occasione per imparare qualcosa di nuovo e risolvere un problema allo stesso tempo non si dovrebbe mai rifiutare!


L’idea alla base di questo articolo è quella di patchare una parte del firmware iPhone per bloccare alla base la comparsa di questo messaggio:

Occorre però specificare che la procedura descritta ha lo scopo di risolvere il problema solo a coloro i quali si trovano nella condizione di veder apparire a ripetizione questo messaggio sulla propria schermata di sblocco, pur non avendo nessun dispositivo esterno collegato.

Questo capita solitamente unicamente alle persone con il dock danneggiato, molto impolverato o che è stato bagnato accidentalmente e il grosso problema che comporta questo messaggio è il blocco dell’intero sistema audio del proprio iPhone!.
Questa patch quindi non ha lo scopo di rendere “compatibili” tutti i dispositivi esterni collegati all’iPhone senza la visualizzazione del messaggio, questo sarà solo un effetto collaterale della modifica!

Iniziamo adesso con lo studio (il file a cui faremo riferimento è stato prelevato dal firmware 2.0.2):

  • Accediamo al filesystem dell’iPhone e preleviamo il file iapd situato nella directory /System/Library/PrivateFrameworks/IAP.framework/Support/
  • Apriamolo con un disassemblatore che supporti la decodifica di istruzioni per processori ARM, ad esempio IDA Pro
  • Posizioniamoci all’indirizzo 0x90AC e cioè il punto esatto della routine responsabile della chiamata alla funzione di visualizzazione dell’errore, troveremo:


In questo codice possiamo individuare all’interno del ramo destro evidenziato le istruzioni che si occupano della visualizzazione dell’errore in questione.

L’idea per la nostra patch è quindi quella di impedire che l’esecuzione del programma entri mai in questo ramo e questo, come si vede dall’immagine, può essere fatto modificando l’istruzione BEQ errorStart (all’indirizzo 0x90FC). Il nostro scopo sarà quello di bloccare questo salto verso la label errorStart e di far proseguire l’esecuzione verso label1.

Per far questo possiamo semplicemente sostituire l’istruzione BEQ errorStart con una istruzione ininfluente, come ad esempio MOV R1,R1.

  • Ora che abbiamo individuato il punto esatto da modificare apriamo il file con un editor esadecimale e posizioniamoci all’indirizzo 0x80FC (cioè l’offset all’interno del file della nostra istruzione). Modifichiamola sostituendo al codice operativo della BEQ errorStart {0x03, 0x00, 0x00, 0x0A} quello della nostra istruzione MOV R1,R1 {0x01, 0x10, 0x0A, 0xE1}:


E salviamo il nuovo file.

  • Come ultimo passo occorre firmare l’eseguibile modificato secondo la guida Bypassing iPhone Code Signatures di saurik, per cui:
    • Creiamo (per sicurezza) una copia di backup del file originale dell’iPhone /System/Library/PrivateFrameworks/IAP.framework/Support/ipad
    • Sostituiamo il file originale con la nostra versione appena modificata
    • Impostiamo i permessi del nuovo file a 755
    • Installiamo da Cydia il package MobileTerminal, che servirà per effettuare l’operazione di certificazione dell’applicazione.
    • Da MobileTerminal autentichiamoci come root per poter proseguire con l’installazione del programma desiderato. Digitiamo: su root e introduciamo la password alpine
    • Ora installiamo il programma ldid di saurik utilizzando il comando: apt-get install ldid
    • E infine firmiamo il file che abbiamo patchato: ldid -s /System/Library/PrivateFrameworks/IAP.framework/Support/iapd

Bene! Ora è tutto pronto per verificare o meno il funzionamento dalla nostra modifica!
Riavviamo l’iPhone e godiamoci il risultato…

Per tutti quelli che non hanno intenzione di compiere questa modifica da soli, ma necessitano comunque del file modificato per poter utilizzare il proprio dispositivo danneggiato, possono scaricarlo direttamente da qui:

Ovviamente queste persone dovranno unicamente posizionare il file sotto /System/Library/PrivateFrameworks/IAP.framework/Support/ al posto dell’originale (di cui farete comunque un backup) ed impostarne i permessi a 755

Una nota conclusiva:
La modifica del file in versione 2.0.2 è stata testata senza problemi su iPhone con il dock danneggiato e con firmware in versione sia 2.0.2 che 2.1.
Sugli iPhone con il firmware 2.1 però questa modifica rende non utilizzabili i dispositivi esterni (risolvendo comunque il problema iniziale del freeze dall’apparato audio). Per cui se qualche utente volesse utilizzare questa patch sul nuovo firmware unicamente per evitare il messaggio deve ripetere la procedura descritta applicandola sul file iapd in versione 2.1 (ovviamente a questo punto gli indirizzi di memoria riportati in questo articolo non saranno più validi).

Se qualcuno è interessato alla guida dettagliata di questa patch può leggere il documento originale: Progetto iPhoneiapdReverseEngineering

Approfondimenti