iPhone iapd Reverse Engineering Questo accessorio sarà compatibile con iPhone
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:
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:
[Tratto dal disclaimer della]
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.
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! ![]() 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".
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: ![]() 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: ![]() 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: ![]() 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.
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:
![]() 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}): ![]() Il processo di modifica è quasi ultimato, ma prima di poter rimettere questo "nuovo" file al posto dell'originale occorre fare una piccola considerazione aggiuntiva:
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 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 Riavviamo l'iPhone e godiamoci il risultato...
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.
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.
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.
![]() ![]() ![]() ![]() Script Execution Time: 0.038144 seconds - Visite: 112552 Copyright © 2007-2009 Suondmao v0.1.5-1 |