====== Decompilació d'aplicacions Android ======
{{ android-security-1.jpg?200 }}
{{tag> #Ceti #CetiMp03 #Ciber #CiberMp03 android seguretat java }}
===== Referències =====
* [[https://cacauet.org/wiki/index.php/Conceptes_generals_de_programaci%C3%B3|Codi compilat vs codi interpretat]]
* [[https://cacauet.org/wiki/index.php/Microprocessador|Microprocessadors i arquitectura Von Neumann]]
* [[https://github.com/skylot/jadx/|Decompilador JADX]]
* Desenvolupament [[Android]] en aquesta mateixa wiki.
Paraules clau
* Arquitectura Von Neumann
* Codi compilat vs codi interpretat
* Compilacions //debug// vs //release//.
\\
===== Posada a punt de les eines =====
- Descarrega i instal·la **Android Studio**.
- Descarrega el SDK adequat amb el **SDK Manager**.
* Cal acceptar termes d'ús
- Crea una màquina virtual Android amb **AVD Manager**.
* Ull, si el disc dur principal està molt ple donarà un error indeterminat a l'intentar arrencar.
- Crear una aplicació amb la plantilla //empty activity//.
- Comprovar que es pot compilar i executar sobre l'emulador.
* Si tens una màquina poc potent l'emulador anirà molt lent. Pots llençar la teva app sobre el teu propi mòbil si el poses en mode de desenvolupament
\\
===== Decompilació de codi Java amb JADX =====
Per a poder analitzar correctament les aplicacions amb una mica de contingut convé disposar d'una mica de codi. Es recomana que feu una simple aplicació amb un [[https://developer.android.com/guide/topics/ui/controls/button?hl=es-419|Button]] que, en prémer-ho, llanci un [[https://developer.android.com/guide/topics/ui/notifiers/toasts?hl=es-419|Toast]] amb "hello world" (utilitza un ''onClickListener'' del ''Button'').
Dins del ''onCreate'' també podem crear algun fragment de codi //dummy//, només per comprovar què fa el compilador. Un exemple senzill pot ser aquest, que ens mostrarà alguns missatges per
for( int cosa=1; cosa<10; cosa++) {
Log.v("test","aquest missatge es mostrarà als logs d'Android");
}
- [[https://github.com/skylot/jadx/releases/|Descarregar JADX]].
- Crea una aplicació d'exemple Android Java com s'ha descrit més amunt.
- Buscar l'arxiu APK dins el directori de projecte dins la app. Sol estar a: app/build/intermediates/apk
app/build/outputs/apk
- Engegar la versió GUI de jadx:$ ./jadx-gui
- Obrir la APK i comprovar si es pot veure el codi original de l'aplicació.
- Quant ocupa la APK?
- Es mantenen els noms de carpetes i arxius?
- Es veuen les estructures de control?
- Es recupera el nom de variables i objectes?
Captura pantalles per a l'informe per il·lustrar el procés d'obtenció del codi descompilat.
\\
===== Ofuscació de codi Java =====
Pots ofuscar el codi amb el mecanisme ProGuard. Simplement activant el //minifier// del codi ja aconseguirem que la APK ja no sigui llegible al descompilar-la.
Tens un parell de referències sobre ProGuard:
* [[https://learntutorials.net/es/android/topic/9205/-que-es-proguard---que-es-el-uso-en-android-|Qué es ProGuard]]
* [[https://medium.com/@angelhiadefiesta/how-to-obfuscate-in-android-with-proguard-acab47701577|Ofuscació amb ProGuard]]
- Activa el //minifier// de ProGuard a la **versió //release// de l'aplicació**.
- Compila (build) l'aplicació en versió //release// anant al menú lateral d'Android Studio:Build Variants -> :app -> release
* Nota: no cal que la posis en marxa a l'emulador ja que et demanarà que tinguis claus per signar-la.
- Localitza la nova APK versió //release//.
- Obra la APK amb JADX i respon:
- Quant ocupa la APK?
- Pots trobar el codi de l'aplicació?
- Es mantenen els noms de carpetes i arxius?
- Es veuen les estructures de control?
- Es recupera el nom de variables i objectes?
Captura pantalles per a l'informe per il·lustrar el procés d'obtenció del codi ofuscat.
\\
===== JavaScript en Android: Cordova =====
Cal fer instal·lació de les eines de [[Cordova]]. Aquest framework permet treballar amb aplicacions JavaScript i aplicar-les a dispositius Android.
- Clonem aplicació [[Cordova]]$ git clone https://github.com/emieza/materialapp
- Canviem a la branca //spacenews//:$ git checkout spacenews
- Afegim plataforma:$ cordova platform add android
- Provem que funcioni la aplicació:$ cordova run android
- Si no es llença l'emulador, obre el AVD Manager del Android Studio i engega'l manualment.
- Busca la APK (debug) dins la carpeta de projecte.
- Obre la APK amb JADX i respon:
- Pots veure els arxius Java?
- Estan ofuscats?
- Pots veure els arxius JavaScript?
- On son?
- Estan ofuscats?
Captura pantalles per a l'informe per il·lustrar el procés d'obtenció del codi descompilat.
\\
===== Ofuscant aplicacions Android basades en JavaScript =====
Aplicarem 2 plugins per ofuscar el codi de l'aplicació:
* **ProGuard** (l'hem vist més amunt) per a ofuscar el codi Java (base comú de totes les apps Cordova).
* Emprarem la versió [[https://github.com/greybax/cordova-plugin-proguard|plugin Cordova ProGuard]].
* **Uglify-JS** : ens permet ofuscar el codi JavaScript. Cal distingir 2 parts:
- [[https://www.npmjs.com/package/uglify-js|Programa genèric UglifyJS]] que podem fer servir sempre per línia de comandes per qualsevol JS.
- [[https://www.npmjs.com/package/cordova-uglify|Plugin cordova-uglifyjs]] que ens facilita aplicar-ho al nostre projecte.
- Utilitza el [[https://github.com/emieza/materialapp|projecte materialapp]] que hem vist anteriorment.
- Recorda treballar a la branca //spacenews//:$ git checkout spacenews
- Instal·lem el plugin per activar ProGuard per al codi Java:$ cordova plugin add cordova-plugin-proguard
- Instal·lem el plugin d'ofuscació ''uglifyjs'':$ npm install cordova-uglify --save-dev
- Actualitzem la versió de uglify-js (si no, ens donarà un error ja que el //plugin// ens ve amb una versió antiga que no reconeix jQuery):$ npm install uglify-js
- Compilem l'aplicació en versió release:$ cordova build android --release
- Obre el //bundle// resultant amb JADX.
- Localitza els arxius JavaScript i respon:
- Estan ofuscats?
- Quins ho estan i quins no?
Captura pantalles per a l'informe per il·lustrar el procés d'obtenció del codi ofuscat.
\\