Spire + Xcode = UUID mismatch detected with the loaded library? Ecco la soluzione!

di Roberto Coluccio 3

 

Nuovi orizzonti si sono recentemente aperti per i possessori di iDevice precedenti l’arrivo di iPhone 4S ed il tanto discusso Siri: grazie ad un tool installabile tramite Cydia (parliamo quindi di dispositivi jailbroken) chiamato Spire ed alcuni accorgimenti riguardanti il proxy al quale inviare le proprie richieste è possibile godere e fruire del nuovo assistente vocale targato Cupertino.

Su iPhone 4, anche connesso tramite 3G e non Wi-Fi, il porting di Siri targato @Chpwn ed altri chiarissimi hacker del panorama iOS restituisce risposte corrette in tempi apprezzabilissimi.

Ma non è tutto oro quel che luccica. Qualora infatti anche voi utilizziate come me lo stesso dispositivo sul quale avete installato Spire anche per “debuggare” applicazioni sviluppate con Xcode si spengono le luci e finisce la festa: Xcode e Spire litigano inequivocabilmente in uno scontro all’ultima dyld cache!

Poiché in rete le informazioni a riguardo sono davvero poche e lo stesso sviluppatore di Spire, Chpwn, non ha risposto/saputo rispondere alle richieste di aiuto su Twitter (di un utente prima e mia poi), ci pensa TheAppleLounge a mettere nero su bianco una guida step-by-step su come risolvere l’increscioso conflitto, scongiurando così la strada spesso consigliata e dichiarata da molti come unica possibile per il ritorno al mondo del development: la disinstallazione di Spire.

DISCLAIMER: “Don’t try this at home” direbbero in territorio a stelle e strisce! Se non siete pratici nello “sporcarvi le mani” con il file system del vostro dispositivo, nell’utilizzare il Terminale di Mac OS e nel modificare file di sistema a vostro rischio e pericolo fermatevi qui perchè TAL non si assume nessuna responsabilità per eventuali danni provocati da errate manovre di smanettamento informatico.

Innanzitutto descriviamo il caso in esame. Gli ingredienti sono:

  • iPhone 4 iOS 5.0.1 jailbroken
  • Spire 1.0-2
  • iFile
  • Xcode 4.2

Dopo aver installato Spire ed aver chiacchierato piacevolmente con Siri per una mattinata intera, tutto ebbe inizio con un bel:

warning: UUID mismatch detected with the loaded library - on disk is: /Users/<myusername>/Library/Developer/Xcode/iOS DeviceSupport/5.0.1  (9A405)/Symbols/System/Library/Frameworks/CoreLocation.framework/CoreLocation  unable to load symbol file:  warning: Unable to read symbols for /Library/MobileSubstrate/MobileSubstrate.dylib (file not found). warning: No copy of MobileSubstrate.dylib found locally, reading from memory on remote device.  This may slow down the debug session.

Warning: UUID mismatch detected with the loaded library: non potete capire quanto ho odiato questa frase!

Cercando questo warning in rete viene fuori di tutto e di più. E’ un warning non troppo specifico, che non termina ma nemmeno fa proseguire il processo di debug. Le cause che lo provocano possono essere molteplici, ma se prima non l’avevate mai visto e dopo aver installato Spire vi ha iniziato a far strappare i capelli, beh, è il caso che vi armiate di pazienza e continuiate a leggere questa guida Mac OS only.

Procediamo per punti, come da manuale. Tranquilli che è più semplice di quel che può sembrare a prima vista:

  • innanzitutto scarichiamo il firmware per il ripristino di iOS 5.0.1 su iPhone 4S (si, avete letto bene, iPhone 4S INDIPENDENTEMENTE da quale sia il VOSTRO dispositivo con Spire installato). A voi il link diretto: iPhone4,1_5.0.1_9A406_Restore.ipsw
  • Modifichiamo l’estensione del file appena scaricato da iPhone4,1_5.0.1_9A406_Restore.ipsw a iPhone4,1_5.0.1_9A406_Restore.zip
  • Estraiamo l’archivio iPhone4,1_5.0.1_9A406_Restore.zip (il doppio-click dovrebbe aiutarci): dovreste trovare nella cartella generatasi, tra i vari file, un’immagine disco chiamata 038-3763-001.dmg della dimensione di 794,9MB. Se non c’è avete sbagliato qualcosa, ritornate al punto 1!
  • Estraiamo il contenuto del file .zip scaricato all’interno della cartella precedentemente creata in seguito all’estrazione di iPhone4,1_5.0.1_9A406_Restore.zip

  • Apriamo una finestra del Terminale di Mac OS e navighiamo all’interno della cartella sopra citata (tip: digitiamo cd e poi trasciniamo la cartella stessa all’interno del terminale)
  • Diamo il seguente comando:

./vfdecrypt -i 038-3763-001.dmg -o decrypted.dmg -k a31ffd506c6711c5a0c52c9f0a2f7208a2f63ad9dd40506e70d80ea20a981eb1312bc774

L’immagine disco 038-3763-001.dmg è criptata da Apple. Essa contiene il file system di iOS 5.0.1 una volta installato dal quale dobbiamo andare a recuperare un file che poi sostituiremo all’interno del file system stessso del nostro dispositivo. In particolare:

-i 038-3763-001.dmg: indica proprio 038-3763-001.dmg come input file da decriptare;

o decrypted.dmg: indica un arbitrario nome di file di output che verrà creato al termine del processo;

-k a31ffd506c6711c5a0c52c9f0a2f7208a2f63ad9dd40506e70d80ea20a981eb1312bc774: indica la chiave utilizzata per decriptare (fonte theiPhoneWiki);

  • Attendiamo di vedere una nuova linea di attesa comandi nel Terminale. Il processo durerà qualche istante.

  • Montiamo l’immagine disco decrypted.dmg appena creata nella cartella dove stiamo lavorando (anche in questo caso il doppio-click dovrebbe aiutare)
  • Navighiamo all’interno del percorso file:

/System/Library/Caches/com.apple.dyld

e facciamo una copia del file dyld_shared_cache_armv7, l’unico presente nella directory, che andremo poi a rinominare in dyld_shared_cache_armv7.new

  • A questo punto dovremo copiare questo file all’interno del nostro dispositivo. Potete utilizzare programmi come DiskAid, iFunBox oppure client SSH: a voi la scelta, l’importante è che trasferiate dyld_shared_cache_armv7.new all’interno del path

/var/spire

e già che ci siamo salviamo una copia di backup sul nostro Mac del file dyld_shared_cache_armv7 attualmente presente in /var/spire.

  • A questo punto il tutorial si può completare tramite iFile, un comodissimo tool che ogni iDevice jailbrekkato dovrebbe avere. Apriamo iFile e navighiamo nella sopra menzionata directory /var/spire. Dobbiamo fare in modo di sostituire i due file in conflitto: consigliamo di farlo effettuando questi passaggi di sicurezza:
  • rinominiamo dyld_shared_cache_armv7 in dyld_shared_cache_armv7.bak
  • rinominiamo dyld_shared_cache_armv7.new in dyld_shared_cache_armv7
  • cancelliamo dyld_shared_cache_armv7.bak
  • aggiungiamo la proprietà “esecuzione” al file dyld_shared_cache_armv7.new come da immagine seguente:

 

Gran finale: salviamo, usciamo da iFile ed riavviamo il nostro dispositivo.

A questo punto avviando Xcode e collegando l’ iDevice al Mac dovremmo riscontrare che il dispositivo non viene proprio riconosciuto. Don’t worry! Con Xcode aperto e dispositivo collegato apriamo Organizer (Window > Organizer) e constatiamo che accanto al nome del dispositivo ci sia un pallino giallo anziché verde: senza paura selezioniamolo e poi clicchiamo sul pulsante in basso “Remove“.

Chiudiamo Organizer, Xcode e scolleghiamo il dispostivo.

Riavviamo Xcode, riapriamo Organizer e ricollegando il dispositivo aspettiamo: dovremmo vedere in breve tempo il nostro iDevice automaticamente reinstallato (i certificati di provisioning vengono recuperati automaticamente da Xcode).

Beh, non ci resta che testare la procedura. Apriamo un progetto e diamo un bel “Run“: funziona? Spero proprio di si: così è stato per me!

Sarebbe stato un vero peccato “perdere” Spire, sebbene in queste ultime ore apprendiamo che Apple sembrerebbe aver dichiarato guerra ai proxy di Spire, arrivando a cambiare lo stesso protocollo di Siri. Staremo a vedere: su TAL troverete, come sempre, tutte le notizie più significative.