Cosa è e come funziona un'applicazione Android

Tempo di lettura: 7 minuti
Data pubblicazione: December 20, 2016

In questo articolo vedremo i principali fondamenti delle applicazioni Android, in modo da capire come analizzarle al meglio e avere tutti gli strumenti per capire cosa sta avvenendo all’interno del sistema durante un analisi e/o pentesting.

Fondamenti delle app

Ogni applicazione scaricata da qualsiasi fonte, per essere installata necessita dell’estenzione .apk. Questi APK (Android Application Package) sono file compressi, contenenti file e cartelle necessari per il funzionamento della stessa.

Come per i file .epub, per accedere ai file interni basta modificare l’estensione in .zip

App di Trenord estratta
App di Trenord estratta

I file presenti sono di solito:

  • AndroidManifest.xml: contiene la maggior parte dei dettagli di configurazione. Include il nome del pacchetto, i componenti dell’app, le impostazioni di sicurezza e i permessi;
  • classes.dex: contiene il codice generato dal codice sorgente dagli sviluppatori. Questo è il file che viene eseguito quando l’applicazione viene avviata sullo smartphone;
  • resources.asrc: contiene la compilazione del codice;
  • Res: contiene le risorse necessarie all’app, come immagini e file xml;
  • Assets: contiene i font, i database preinstallati e altri file utili ai fini dell’utilizzo finale;
  • Meta-inf: contiene i certificati e le firme SHA1 di tutti i file nell’archivio.

In base al tipo di applicazione avremo diversi file localizzati in varie parti. I principali sono:

  1. /data/app;
  2. /system/app;
  3. /data/app-private;

Componenti di un applicazione

Solitamente le applicazioni consistono di quattro differenti componenti:

  • Attività: esse permettono all’utente di interagire tramite lo schermo ed effettuare le operazioni declarate dalla stessa;
  • Servizi: si possono visualizzare nelle impostazioni dello smartphone, possiamo paragonarli ai processi. Sono applicazioni senza interfaccia grafica, come SmsReceiverService;
  • Broadcast receivers: viene utilizzato per la notifica di determinati eventi, come l’arrivo di un messaggio o di una chiamata;
  • Content provider: viene utilizzato per condivizione di dati tra applicazioni.

Passaggi essenziali per la creazione di un app

Passaggi secondo Google Developer
Passaggi secondo Google Developer
  1. Il primo passo consiste nel creare le risorse come il file _AndroidManifest.XML _e altri file atti al design e alla presenza dei diversi componenti utilizzabili dall’applicazione. Come si può vedere nel disegno, viene chiamato aapt(Android Asset Packaging Tool);
  2. Se vengono utilizzati file .aidl (Android Interface Definition Language) devono essere convertiti in Java;
  3. Una volte che si hanno tutti i file Java, con _javac _si compila il tutto e si ottengono, come di consueto, i file .class;
  4. I file .class vengono a loro volta convertiti in un file .dex grazie al tool dx. Esso creerà un singolo file DEX chiamato classes.dex;
  5. Con il software APK Builder si uniscono i file immagine e tutti gli altri file non precedentemente compilati insieme al file DEX:
  6. Per debuggare una applicazione in modo lecito si utilizza una chiave di debug, creata al momento della programmazione. Per generarla si usa il tool **Keytool **e jarsigner;
  7. Una volta che l’applicazione è pronta, viene firmata con una chiave di rilascio.

Per chiunque volesse approfondire, la fonte è il sito di Developer Android.

Funzionamento di un applicazione

Processo di esecuzione di un applicazione
Processo di esecuzione di un applicazione

Quando si apre un applicazione, il processo che la esegue è Zygote, il quale crea una copia di se stesso (con una fork). L’applicazione chiamerà poi le sue componenti necessarie al funzionamento e, nel caso servisse, attenderà un input dell’utente che la sta utilizzando. Con adb è possibile vedere i processi attivi nello smartphone, con il comando (come su Linux) ps

Processo di Trenord dopo che è stata avviata
Processo di Trenord dopo che è stata avviata

Nel comando ho inserito anche u0, ossia l'User ID che possiede ogni applicazione. In un dispositivo con i permessi di root è possibile verificare l’UID leggendo il file /data/system/packages.

generic_x86:/ # cat /data/system/packages.xml                                                                                    
 
<package name="it.nordcom.app" codePath="/data/app/it.nordcom.app-1" nativeLibraryPath="/data/app/it.nordcom.app-1/lib" publicFlags="941145668" privateFlags="0" userId="10071">
   <sigs count="1">
     <cert index="6" key="308202e...184f9ea9dfdf52da" />
   </sigs>
   <perms>
     <item name="com.google.android.c2dm.permission.RECEIVE" granted="true" flags="0" />
     <item name="android.permission.ACCESS_FINE_LOCATION" granted="true" flags="0" />
     <item name="com.google.android.providers.gsf.permission.READ_GSERVICES" granted="true" flags="0" />
     <item name="android.permission.MANAGE_ACCOUNTS" granted="true" flags="0" />
     <item name="android.permission.RECEIVE_BOOT_COMPLETED" granted="true" flags="0" />
     <item name="android.permission.AUTHENTICATE_ACCOUNTS" granted="true" flags="0" />
     <item name="android.permission.INTERNET" granted="true" flags="0" />
     <item name="android.permission.READ_EXTERNAL_STORAGE" granted="true" flags="0" />
     <item name="android.permission.ACCESS_NETWORK_STATE" granted="true" flags="0" />
     <item name="android.permission.GET_ACCOUNTS" granted="true" flags="0" />
     <item name="android.permission.WRITE_EXTERNAL_STORAGE" granted="true" flags="0" />
     <item name="it.nordcom.app.permission.C2D_MESSAGE" granted="true" flags="0" />
     <item name="android.permission.WAKE_LOCK" granted="true" flags="0" />
   </perms>
   <proper-signing-keyset identifier="12" />
</package>

Con questo comando è anche possibile visualizzare i permessi reali di cui l’applicazione necessita. Quasi sempre sono chiari e già dal nome è possibile capire di cosa si tratta. Nel caso non capiste quale è il permesso, qui sono presenti quasi tutti. Per vedere i permessi che si hanno nello smartphone, il comando sarà

./adb shell pm list permissions

Infine, ogni app salva alcuni dati nello smartphone, utili per il funzionamento della stessa. Si trovano principalmente nella cartella /data/data/nomeapp. Nel nostro caso, avremo

File dell'applicazione
File dell'applicazione

Conclusioni

Spero di esser riuscito a spiegare a grandi linee come un’applicazione utilizza uno smartphone e come si comporta nello stesso. Per chi volesse approfondire e/o sviluppare una propria app, uno dei libri più basilari in commercio è Hello, Android. Da questo momento in poi, nella categoria Mobile, passerò a spiegare e introdurre l’analisi e il pentesting di un applicazione, argomento ancora molto poco noto rispetto al pentesting su dispositivi fissi.