Chi di voi non ha un dispositivo Android? A parte i fighetti con l'iphone/ipad intendo
Ad oggi gli utilizzatori di un dispositivo con a bordo OS Android hanno superato quelli Apple.
I motivi sono semplici.
1. Costi di solito inferiori.
2. Maggiori possibilità di avere software gratuito (altrimenti dette "App"), anche grazie alla maggiore facilità di programmazione da parte degli sviluppatori rispetto ad iOS.
Normalmente su iOS è necessario effettuare un Jailbreak del dispositivo per poter utilizzare applicazioni non presenti nell'App Store o comunque scaricate da Internet.
3. Normalmente il SO viene rilasciato anche col suo codice sorgente.
Quindi, viste le motivazioni, passiamo alla parte teorica. Molte se non tutte le informazioni che scriverò qui sono normalmente disponibili in rete, per cui vi invito a documentarvi meglio che potete.
Scopo di questo tutorial non è quello di farvi una lezione teorica su Android, Google fornisce tutte le informazioni necessarie.
- Cos'è Android?
Android è un sistema operativo sviluppato e rilasciato da Google.
E' pensato per essere un sistema Open Source.
Attualmente è giunto alla versione Jelly Bean, 4.2.2. La versione 4.3 sarà rilasciata a breve.
E' un sistema operativo basato su kernel Linux, l'ultimo kernel utilizzato è la versione 3.10.
Qui bisogna fermarsi un attimo.
Il fatto che sia un SO basato su kernel Linux non vuol dire che sia Linux, vale a dire non è automaticamente possibile prendere una qualunque distro Linux e installarla al posto di Android.
Principalmente per due motivi:
- La CPU: Android è pensato per girare su processori ARM, quindi è compilato con GCC per ARM.
- I driver: I driver specifici per singolo dispositivo sono compilati in modo specifico, quindi installando Linux andrebbero ricompilati nel modo appropriato e questo non è sempre facile/possibile.
- Le librerie. In Android libc è stato sostituito da bionic.
Per far girare il suo SO, a parte il Kernel e i drivers, sia il framework che le applicazioni sono sviluppate in Java e girano in un ambiente protetto (altrimenti chiamato "sandbox") utilizzando una JVM (Java Virtual Machine).
Quindi per riassumere in due parole Android è:
Un Sistema Operativo Linux su cui girano applicazioni Java.
Le applicazioni girano in una Sandbox, vale a dire che girano in user-mode e non sono in grado, normalmente, di modificare il sistema operativo ed il suo funzionamento.
Comunque, siamo lontanti dai vecchi file .jar utilizzato da SO come Symbian.
Le applicazioni Android, così come il suo Framework, hanno estensione .APK.
I file APK sono in sostanza un file compresso che contiene:
- Il certificato utilizzato per firmare e legittimare l'applicazione.
- Un file Manifest.XML che in pratica serve a specificare di quali autorizzazioni e quali caratteristiche principali ha l'applicazione.
- Una cartella res, che contiene i diversi stili di visualizzazione e le icone e le immagini a seconda del tipo di dispositivo sul quale l'applicazione gira (quindi ad es. LDPI, MDPI, HDPI, XHDPI, a seconda della risoluzione.)
- Un file resources.arsc,
-Un file classes.dex. Questo è il file che contiene il codice del programma vero è proprio. Ha estensione .dex perché è un file deodex, avrebbe altrimenti estensione .odex.
Cosa sono .odex e .dex.
Sempre cercando di essere sintetico,
quando un'applicazione viene installata, Android prende questo file .odex e lo copia nella sua cache. In questo modo il processo di boot è più veloce perché Android già possiede la parte principale del programma.
Il problema viene quando si vuole modificare queste applicazioni perché una parte del suo codice è già stata estratta da un'altra parte prima che questa venga eseguita.
Qui viene in aiuto il deodexing.
Questo processo prende l'APK, lo riprocessa e lo ricomprime, salvando tutte le informazioni del file in un unico posto cosìcchè
modificandolo non andrà in conflitto con una sua parte contenuta nella cache di Android.
Questo ovviamente porterà ad un aumento dei tempi di boot di Android, perché questi si deve ricostruire tutta la cache. Ma in ogni caso accadrà solo per il primo boot. Perché successivamente Android riprenderà comunque a mettere insieme dei file di cache mano a mano che le applicazioni vengono usate.
Tuttavia il deodexing rimane essenziale se si vuole modificare un'applicazione.
Ricordate che non è possibile installare un'applicazione deodexed su una ROM odexed. Va prima resa odexed.
Sono ODEXED tutte le ROM STOCK, vale a dire quella originale che trovate nel dispositivo appena comprato.
Dopo questa minima spiegazione, necessaria però a capire quanto meno di cosa si sta parlando passiamo alla parte pratica:
- Modificare un'applicazione Android.
Circa un anno fa, un amico, che aveva installato una ROM custom sul suo tablet e poi un'app scaricata da Internet parlandone mi chiese come mai ogni volta che la usava internet gli andava molto lento e in genere il tablet stesso sembrava come "appesantito".
Verificai la cosa e iniziai così:
- Scaricai la versione Free dell'applicazione dal Market e la installai sul mio tablet. Risultato: Nessun problema, connessione internet stabile come al solito. Il problema si mostrava con l'applicazione modificata e scaricata chissà dove da internet.
- Avviai l'applicazione modificata sul tablet dell'amico e sul mio computer un sniffer di rete. Dopo circa un secondo iniziai a visualizzare a monitor tutte le stringhe di connessione dell'applicazione verso internet. Quello che vidi non mi piaceva per nulla. Nell'applicazione era stato inserito un trojan per Android, che in pratica apriva una porta e creava un webserver sul dispositivo permettendo a chissà chi (utilizzava purtroppo un proxy, quindi...) di accedere al dispositivo da remoto, tramite una comoda interfaccia web, e scaricare praticamente tutto il contenuto del tablet. Si, perché il furbone del mio amico aveva anche rootato il suo tablet, e l'applicazione scaricata, a differenza di quella free, richiedeva diritti di root.
- Iniziai a chiedermi come potevo leggere il codice sorgente dell'applicazione per poter trovare altre informazioni e, nel caso, ricompilare il programma eliminando la parte che non mi piaceva.
Se avete notato, da poco anche Google ha iniziato a correre ai ripari chiedendo, al momento dell'installazione dell'applicazione, se si desidera che venga monitorato il comportamento della stessa per verificare se sia "insolito". Fa in pratica quello che ho fatto io.
Detto questo...personalmente ho sempre odiato i banner pubblicitari. Quindi quando ho tempo da perdere modifico le applicazioni gratuite che possiedo per eliminarne i banner pubblicitari...
Va bene...mi sono anche tolto qualche sfizio con Ruzzle (facile) e con SkyGo (parecchio difficile, dalla versione 2.0 in poi.). Ovviamente non vi dirò mai di che sfizio si tratta per ovvie ragioni
In più mi è capitato diverse volte di andare sul Play Store e vedere sotto l'icona del programma la fascia nera che dice "Questa applicazione non è compatibile per il tuo dispositivo". E questo non mi piace.
Se ricordate ancora tutto quello che ho scritto senza aver fatto uso di qualche chilo di fosforo...
ricordate che nel momento in cui modificherete un'applicazione romperete la sua firma digitale quindi l'applicazione, nonostante risulti installata tramite Google Play (perché quest'ultimo non fa altro che leggere una stringa dal Manifest.XML e confrontarla con il suo DB) non ne potrete ricevere alcun aggiornamento.
Un'ultima precisazione.
Il codice dell'APK come ho detto prima è in Java.
Ma noi non possiamo leggerlo perché è compilato.
Possiamo decompilarlo, se non è abbastanza offuscato/criptato, ma quel codice non sarà modificabile (sarebbe troppo facile ^_^).
Per modificarlo dobbiamo DISASSEMBLARLO.
Il codice sorgente dell'apk disassemblato prende il nome di .SMALI.
Vuol dire che una volta disassemblato ci troveremo una cartella con tanti file .SMALI all'interno.
Per le prossime operazioni, ecco il tool-set necessario ad ogni cracker Android per poter procedere con il suo sporco lavoro:
- Android SDK, reperibile [URL="http://developer.android.com/sdk/index.html#download"]QUI[/URL]. Questo vi fornirà i tools necessari per poter trasferire manualmente o anche via rete gli APK tra il vostro PC e il dispositivo, nonché di creare poi una key e un keystore (certificato) con il quale firmare la vostra applicazione prima di installarla. Ricordate di inserire, dopo l'installazione, il percorso dell'SDK fra le variabili d'ambiente per un uso più dinamico.
- I driver USB per il vostro dispositivo.
- JD-GUI, Decompilatore JAVA, l'ultima versione è [URL="http://jd.benow.ca/jd-gui/downloads/jd-gui-0.3.5.windows.zip"]QUESTA.[/URL]
- dex2jar, Programma per convertire i file .DEX in file .JAR per poi analizzarli con JD-GUI, lo trovate [URL="http://code.google.com/p/dex2jar/"]QUI[/URL]
- APKTOOL , Disassemblatore APK, reperibile [URL="https://code.google.com/p/android-apktool/downloads/list"]QUI[/URL]
- Potrebbe essere che l'ultima versione di APKTOOL, la 1.5.2, che contiene all'interno gli eseguibili Java "smali.jar" e "baksmali.jar", non riesca a disassemblare correttamente alcuni APK. Scaricate perciò la versione più recente dei due file separatamente. Le trovate [URL="https://code.google.com/p/smali/"]QUI[/URL]
Nel caso vi troviate di fronte uno degli APK non disassemblabili con APKTOOL vi dirò come fare per utilizzarli.
Il mio consiglio, una volta scaricato tutto e installato il SDK Android, è di crearvi un'unica cartella dove mettere tutti gli strumenti e poi una sottocartella APK che conterrà il vostro lavoro.
Come ho fatto in passato per i tutorial su Linux per Xbox, anche qui ho deciso di dividere i tutorial in parti. La parte pratica sarà molto corposa e quindi, forte anche dell'esperienza passata dove mi si chiedeva istruzioni anche su come allacciarsi le scarpe, preferisco andare per gradi.
Bene, le basi le avete, vi lascio il tempo di trovare e scaricare il tutto, di scrivere i primi commenti (siate educati ) e poi passiamo alla parte pratica, volendo, dopo la teoria anche con un esempio richiesto da voi, prendiamo un APK e lo osserviamo insieme.
Riguardo a questo, però badate bene, anche per richieste future:
L'APK contiene del codice.
Il codice è proprietà intellettuale del suo/suoi sviluppatori.
Quindi, qui NON potrete/dovrete MAI, MAI e poi MAI postare APK, perché sono protetti da diritto d'autore.
Quello che potrete fare, e attendo comunque il via libera degli amministratori, è scrivere il nome di un APK e porzioni di codice sorgente, perché come vi accorgerete non portano con sé, nel 90% dei casi, stringhe identificative.
Detto questo...Alla prossima parte!
Ethereal.
Segnalibri