====== 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. \\