¿Cómo desensamblar una aplicación Android?
Ver el código fuente de una aplicación Android es tan sencillo como teclear en Google “apk decompiler ” y nos salen 283 mil resultados.

android decompiler

Aplicando lo que en cualquiera de esas páginas nos indiquen, llegamos a las entrañas de una aplicación en menos de 5 minutos y sin ningún conocimiento técnico. Es fácil imaginar lo que podría hacer alguien con conocimientos.

¿Qué es la ofuscación de código?
Ahora que ya conocemos lo sencillo que es ver el código fuente de una aplicación, nos vemos en la necesidad de dotar a nuestras apps de un puntito extra de seguridad para impedir posibles ataques, robos de algoritmos, claves, etc.

Ese puntito extra se puede ganar ofuscando el código, que no es más que renombrar las clases, métodos, atributos, etc. para que su lectura y comprensión sea lo más difícil posible. Con ello reducimos también el tamaño de nuestro “.apk”. La explicación de esto es que, por ejemplo, una variable “alumnos” ocupa, sólo con su nombre, 7 bytes, pero si la renombramos como “a” ocuparía sólo 1 byte. Cuando en una aplicación tenemos cientos de variables, clases, métodos… la reducción en tamaño puede ser notable.

Otra característica de los ofuscadores de código es que nos permiten hacer una limpieza, eliminando todo el código no usado y, por tanto, sobrante, mejorando todavía más la reducción de espacio, lo que conlleva la mejora de la carga de la aplicación en memoria.

Si utilizamos librerías externas es muy común hacer uso sólo de parte de la librería, o incluso de una parte ínfima, por lo que nos queda mucho código no utilizado.

android_shades

En el mercado existen diversos ofuscadores de código tanto open source como de pago, nosotros nos vamos a centrar en uno que nos interesa mucho, Proguard. Nos interesa mucho porque ya hemos visto lo sencillo que es desensamblar una aplicación Android, porque viene integrado en el eclipse ADT, es gratuito y es muy usado en la ofuscación de cualquier aplicación que haga uso de la sintaxis de lenguaje java.

Si estáis más interesados en una comparativa de ofuscadores, la propia página web de Proguard cuenta con una. O en herramientas o servicios de ofuscación para la plataforma iOS: Arxan, Metaforic, Cryptanium.

arxan

Hasta ahora todo son ventajas, pero la ofuscación de código contempla algunas circunstancias que pueden resultar problemáticas si no se tratan adecuadamente.

El primer problema es el tratamiento de los “logs”, que puede ser común para cualquier plataforma. Cuando ofuscamos una aplicación, los “logs” también estarán ofuscados haciendo ilegible el análisis de los mismos si queremos arreglar un “bug”.

El segundo es el fichero “manifest” de la plataforma Android. El archivo “manifest” de Android registra entidades como las “activities”, “broadcast receivers”, servicios, “content providers”, etc. Si se modifica el nombre de la entidad pero no se modifica en el “manifest” la aplicación no funcionará.

Otro problema es la generación de librerías, que también puede ser común para cualquier plataforma. Si ofuscamos una librería el desarrollador que tenga que usarla se volverá loco.

Y finalmente debido a las circunstancias propias de la plataforma Android las referencias a “R” o a “Enums” pueden ser también problemáticas.

Solución a todas ellas: añadir excepciones. Por ejemplo, el caso de la generación de librerías. Si queremos ofuscar una librería porque contiene datos o lógica muy sensible, podemos ofuscar todas sus clases excepto la interfaz o “API” pública. De esta forma, toda la lógica está protegida y el desarrollador podrá tener un “API” de llamadas legible.

Finalmente, hay que resaltar que estas herramientas introducen modificaciones en nuestro código por lo que es muy recomendable ofuscar sólo en fases de pre-producción, cuando todo el desarrollo está finalizado y probado, y volver a pasar una batería de pruebas para asegurarnos de que no estamos generando nuevos “bugs”. Con ello mantenemos una versión ofuscada para la fase de producción y otra sin ofuscar sobre la que haremos el mantenimiento y futuras ampliaciones.


¿Cómo ofuscar una “web app”?
La ofuscación en las “web apps” es la misma que se utiliza en las aplicaciones web de toda la vida. Existen diversas herramientas que nos ayudan tanto a reducir el tamaño de nuestro código como a modificarlo para que su legibilidad sea lo más compleja posible. Las más importantes son: YUI, Uglify y Google Closure Tools.

google-closure-tools

Si sólo reducimos el tamaño del código eliminando caracteres sobrantes, comentarios, etc. estaríamos “minimificando” nuestro código. Los famosos ficheros “.min.js” javascript. Esta técnica reduce considerablemente el tamaño de un fichero o librería lo que ayuda a mejorar su rendimiento cuando es ejecutada por el motor web. Uglify sería de este tipo.

Después entran en juego los ofuscadores, modificando el código para reducirlo en tamaño, hacerlo menos legible y algunos incluso aplicando algunas optimizaciones. Donde se engloban YUI y las Closure Tools.

Como vemos, de momento ocurre igual que con los ofuscadores nativos.

cordova-phonegap-build

Cordova/Phonegap. Minimificación y ofuscación
El desarrollo en Cordova introduce el concepto de “plugin”, que no es más que una porción de código nativo que implementa una interfaz para ser llamado a través de javascript. Se pueden desarrollar “plugins” para Android, iOS, etc. con lo que todo lo que no puede abarcar javascript con el soporte que el motor web le brinda, se puede hacer con un “plugin”. Esto nos lleva a que una “web app” puede en algún momento tener tanto código html + javascript + css como nativo. Si se da el caso, habrá que aplicar las pautas del uso de Proguard para el código nativo y las pautas de los ofuscadores y minimificadores web. Y sobre todo tener muy en cuenta que cualquier modificación de las interfaces públicas de javascript y nativo puede hacer que no funcionen los plugins.

Román R. B. @ameu8