integrato ;)
iPhone iapd Reverse Engineering
Questo accessorio sarà compatibile con iPhone

 
Disclaimer
 
Trattandosi di reverse engineering c'è sempre da fare qualche considerazione preliminare e in questo caso, trattandosi anche di un 'campo' particolarmente delicato e attualmente soggetto a numeriose critiche e dibattiti, vorrei essere il più preciso possibile. Per questo riporto un estratto della licenza d'uso del software iPhone, preso direttamente dal sito:
c) Non è consentito, e accettate quindi di non farlo e di non permettere ad altri di farlo, copiare (salvo nei limiti di quanto espressamente consentito dalla presente Licenza), decompilare, disassemblare, riassemblare, tentare di ricavare il codice sorgente, decodifcare o modifcare il Software iPhone e qualunque servizio fornito dal Software iPhone [...]
Qualsiasi tentativo di compiere una delle suddette azioni costituisce una violazione dei diritti di Apple e dei licenzianti del Software iPhone. Chiunque violasse tale restrizione potrà essere perseguito legalmente e dovrà risarcire i danni.
Chiunque ha accettato questo accordo sappia quindi che la procedura descritta viola questa licenza d'uso (nel caso in cui venga praticata sul software iPhone) e se ne assume le proprie responsabilità nel caso decidesse di utilizzarla (sul software iPhone).
Per questo e per non incorrere in problemi di natura legale questo sito non pubblicherà materiale di proprietà di Apple modificato e l'utente che legge questo articolo è tenuto a sapere preventivamente che:
Il documento pubblicato presenta un'analisi puramente teorica della struttura del programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra il documento pubblicato e le istruzioni del software oggetto dell'analisi è da ritenersi puramente casuale.
Questo documento non presenta alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione e l'autore non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali informazioni.
[Tratto dal disclaimer della]

 
Premessa
 
Questo articolo vuole essere una piccola introduzione pratica al reverse engineering sul firmware iPhone 2.x.
Come per tutte le discipline anche questa materia richiederebbe tuttavia un'ampia cultura alla spalle prima di potercisi addentrate; nella realtà però risulterebbe praticamente impossibile realizzare un unico documento esautivo e completo all'argomento data la vastità del campo trattato.
Per questo motivo generalmente il reversing è introdotto tramite articoli finalizzati allo studio di un determinato problema e alla sua soluzione, realizzando di fatto tante guide auto-conclusive su ogni target proposto. Anche in questo documento sarà adottata questa tecnica, includendo solo una breve parte di teoria strettamente finalizzata a capire la motivazioni delle scelte fatteo durante la risoluzione del problema.
Nozioni più generali sull'uso di disassemblatori, sulla struttura di un programma disassemblato, sull'utilizzo di un editor esadecimale e soprattutto sull'assembly per processori ARM non verranno trattate e saranno date per scontate per gli utenti che si accingono a seguire questo articolo.

 
Target
 
Veniamo al problema dal quale partirà questo studio:
Si tratta di un messaggio che infastidisce alcuni utenti iPhone che recita: "Questo accessorio non è compatibile con iPhone. Vuoi abilitare la modalità d'uso in aereo per ridurre le interferenze audio?".
Questo nag screen può apparire in due casi: quando si è connesso un dispositivo esterno all'iPhone non ufficialmente supportato (alcuni universal dock, il modulo xGPS ...) o perchè il proprio iPhone risulta danneggiato (dock impolverato, bagnato accidentalmente ...).
Nel primo caso questo non è un problema, si rifiuta la modalità aereo e si utilizza il dispositivo tranquillamente. Per la seconda ipotesi invece il messaggio risulta molto fastidioso in quanto ricompare ad ogni schermata di sblocco e comporta il blocco totale dell'apparato audio dell'iPhone!
Quindi quello che ci prefiggiamo di fare è risolvere questo problema: evitare la continua comparsa di questo messaggio sugli iPhone con il dock danneggiato mantenendo comunque funzionante l'audio.

E' molto importante capire la finalità di questa patch: lo scopo è evitare i problemi degli iPhone con il dock danneggiato, non rendere compatibili dispositivi che altrimenti non funzionerebbero, questo non è possibile!
Dai test effettuati è risultato che (sul firmware 2.0.2, da quale è stata presa la versione del file analizzato) i dispositivi esterni risultavano comunque compatibili e perfettamente funzionanti dopo la patch e senza la visualizzazione del messaggio di non compatibilità.
Ma questa non è l'idea per cui questo studio nasce, è solo un "effetto secondario".

 
Passo 1: Analisi del file
 
Come prima operazione occorre procurarci il file originale. Questo articolo farà riferimento alla versione del firmware 2.0.2, fermo restando che le stesse identiche operazioni se compiute sullo stesso file del firmware 2.1 (gli indirizzi di memoria ovviamente non saranno gli stessi) daranno i medesimi risultati in quanto a compatibilità di dispositivi esterni senza errori (ma non si otterrà lo stesso beneficio per quanto riguarda la parte audio del telefono).

Per questo si è scelto di riportare l'analisi del file in versione 2.0.2 in quanto questa versione sembra essere l'unica che, una volta modificata, riesce a mantenere funzionante l'apparato audio del dispositivo (cioè di fatto a soddifsare l'obbiettivo principale proposto).

Il file che ci interessa è:

/System/Library/PrivateFrameworks/IAP.framework/Support/iapd

Per l'analisi è stato utilizzato il programa IDA Pro versione 5.2 in quanto supporta il disassembling di programmi per microprocessori ARM.

Per cercare il punto esatto da patchare partiamo osservando la finestra delle stringhe del programma (View->General Subview->Strings ""). Di certo non possiamo sperare di trovare l'esatta frase del messaggio di errore in quanto l'iPhone preleva ogni singolo testo da un dizionario a seconda della lingua impostata, ma possiamo sperare almeno di trovare una stringa abbastanza simile che ci porti nelle "vicinanze" del punto esatto.
Fortunatamente si nota:
Proprio di seguito ad altre stringhe familiari a errori sul collegamento di dispositivi al dock. Quindi il punto potrebbe sembrare corretto.
Seguendo un paio di volte i richiami a questa stringa (Tasto destro->Jump to xref to operand...) si arriva a un'istruzione di salto all'indirizzo 0x89E4:
Ma questo non è il punto esatto da patchare. Leggendo il resto del codice di questa sotto-routine si capisce presto che in questo punto del programma è già stata avviata la procedura di errore per la mancata "compatibilità" del dispositivo.
Infatti il codice riportato si preoccupa solo di determinare se stamapre l'errore relativo al NOT_MADE_FOR_IPHONE oppure quello relativo al NOT_MADE_FOR_IPOD.
Per questo occorre proseguire la ricerca del punto esatto salendo questa funzione fino al suo indirizzo di partenza 0x88C8 (rinominata da me in notMadeFor()) e cercando in quale punto del programma essa viene invocata.
Seguendo le chiamate si può arrivare così ad un'altra funzione che parte all'indirizzo 0x90AC il cui codice:
Ed ecco anche trovato il punto che ci interessava!
E' infatti l'istruzione BEQ errorStart all'indirizzo 0x90FC che porta l'esecuzione del programma nel ramo di chiamata della routine notMadeFor() (e notMadeFor2() un'altra funzione del tutto analoga alla precedente).
Sarà questa infatti l'istruzione che andremo a modificare per evitare la comparsa dell'errore.

 
Passo 2: patching
 
Cercheremo quindi di evitare che l'esecuzione del programma venga portata sul ramo ErrorStart. Per capire come fare questo, se la visione Graph view non fosse ancora abbastanza esaustiva, si può visionare il codice anche in Text view per rendersi definitvamente conto che basta eliminare (noppare) il salto condizionato per proseguire l'esecuzione verso la label1:
Calcoliamo quindi adesso l'offset di questa istruzione BEQ errorStart all'interno del file iapd sottraendo all'indirizzo virtuale 0x90FC l'image base dell'eseguibile (cioè l'indirizzo dal quale è partito in memoria il caricamento delle istruzioni) e troviamo:

0x90FC - 0x1000 = 0x80FC

(indirizzo mostrato anche da IDA nella schermata Hex-View-A)
Apriamo quindi il file iapd con un editor esadecimale e posizioniamoci all'indirizzo 0x80FC per sostituire all'istruzione BEQ errorStart (codice operativo {0x03, 0x00, 0x00, 0x0A}) una istruzione inutile come ad esempio MOV R1,R1 (codice operativo {0x01, 0x10, 0x0A, 0xE1}):
E salviamo il tutto con un altro nome.
Il processo di modifica è quasi ultimato, ma prima di poter rimettere questo "nuovo" file al posto dell'originale occorre fare una piccola considerazione aggiuntiva:

 
Passo 3: firma
 
Dal firmware 2.0 tutto il codice che si vuole eseguire sul dispositivo deve essere stato precedentemente firmato ed autenticato e per ogni applicativo è presente, generalmente in fondo al file, l'hash SHA1 del programma in origine protetto dalla firma dal distrubutore.
Quando si tenta di eseguire del codice sul firmware iPhone vengono effettuati dei controlli preliminari: viene ricalcolato l'hash del programma che richiede l'esecuzione e lo si confronta con quello presente nel programma stesso (e protetto dal certificato). Se l'hash non coincide con quello originario o se manca la firma del distributore (o è stata falsificata) il firmware iPhone impedirà l'esecuzione del programma.
Da questo si capisce il motivo per cui non è possibile reintrodurre così com'è il file che abbiamo appena patchato all'interno dell'iPhone.
Avendo modificato l'eseguibile il check sull'hash corrente del programma confrontato con quello originario fallirebbe e il firmware rifiuterebbe l'esecuzione. Per questo occorre sostituire al vecchio hash quello attuale del programma (e di conseguenza anche ri-firmare l'intera applicazione). Qui però si potrebbe pensare di essere arrivati ad un punto morto, infatti la chiave privata per la firma delle applicazioni la conosce solo Apple (se no non sussisterebbe il problema del jailbreak :D).
Ed ora si rende fondamentale il lavoro di jailbreaking del Dev Team che si occupato appunto di tagliare fuori dal kernel iPhone tutti i controlli sulla autenticità del certificato di Apple. Per questo di fatto il problema della certificazione del programma non sussite in quanto ora qualsiasi firma sarà accettata.
Dunque l'unica operazione che resta da compiere è la sostizione del vecchio hash del programma con quello nuovo e la rifirma dell'applicazione con un qualsiasi certificato. Per fare queste operazioni ci viene in aiuto il lavoro di un altro grande dell'ambiente iPhone: saurik e la sua guida. Quindi in conclusione:
Creiamo una copia di backup del file originale dell'iPhone /System/Library/PrivateFrameworks/IAP.framework/Support/ipad per sicurezza
Sostituiamo il file originale con la nostra versione modificata (sempre in /System/Library/PrivateFrameworks/IAP.framework/Support/)
Impostiamo i permessi del nuovo file a 755
Installiamo da Cydia il package MobileTerminal (che servirà per lanciare l’operazione di certificazione) ed il package ldid (l'utility di saurik che effettuerà fisicamente il signing dell'eseguibile).
Da MobileTerminal autentichiamoci come root per poter proseguire con l'installazione del programma desiderato. Digitiamo:

su root

e introduciamo la password "alpine"
E infine firmiamo il file che abbiamo patchato lanciando il comando:

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...

 
ipad patched (2.0.2)
 
Una versione già modificata e firmata del file analizzato in questo articolo (versione 2.0.2) è scaricabile all'indirizzo:
Per l'uso di questa copia già preparata è necessario unicamente copiare il file scaricato in /System/Library/PrivateFrameworks/IAP.framework/Support/iapd e impostare i permessia 755. Tutte gli altri passi illustrati in questo articolo sono già stati realizzati.

 
ipad patched (3.0)
 
Per il firmware 3.0 è possibile utilizzare la seguente versione:
Il procedimento di sostituzione è analogo a quello per la versione 2.0.2 al paragrafo precedente. Ricordo ancora una volta che questa modifica non aggiunge nessuna compatibilità a nuovi dispositivi (e non funziona con i cavi video non originali) ma rimuove unicamente il pop-up di notifica.

 
ipad patched (3.1.2)
 
Per il firmware 3.1.2 è possibile utilizzare la seguente versione:
In questa versione il procedimento di patching è cambiato totalmente rispetto a quello dell'articolo. Se siete curiosi di capire come funziona e come arrivare da soli alla soluzione consiglio comunque di seguire quanto scritto, ma il punto da patchare sarà completamente diverso.
Se volete solo sapere dove e cosa modificare allora:
addr 0x21A14, cambiare BNE con B in hex da 02 00 00 1A a 02 00 00 EA.

NOTA: Mi è stato segnalato che questa versione non funziona a tutti gli utenti. Se qualcuno dovesse avere problemi gli consiglio di attendere un patching definitivo o, in alternativa, provare a usare il file in versione 2.0.2.

 
Aggiornamento definitivo firmware 3.x
 
Per qualsiasi versione (escluse le 4.x) è possibile usare questa patch software (da installare con dpkg -i):
Questo pacchetto non modificherà il file ipad del vostro firmware, si tratta invece di un pop-up blocker mirato appunto al messaggio di errore trattato in questo articolo (e per questo compatibile con tutte le versioni firmware).

Nota: Se i suoni continuano a non funzionare con questo patch software si può provare a usare la versione 2.0.2 (anche su firmware 3.x) e se questo non dovesse ancora bastare allora (personalmente) non ho soluzione.
Il consiglio comunque è sempre quello di provare a pulire il dock dell'iPhone con aria compressa e un vecchio spazzolino da denti medio.

 
Links e fonti
 

Script Execution Time: 0.02153 seconds - Visite: 645993
Copyright © 2007-2017 Suondmao v0.1.5-1