Modificando el código de una aplicación

También resulta posible modificar el código de una aplicación para cambiar su funcionamiento. Por supuesto, nunca hay que distribuir una aplicación manipulada sin la autorización del autor. Nosotros aprenderemos a hacerlo exclusivamente con fines didácticos. Si queremos evitar que manipulen nuestras aplicaciones, primero tenemos que aprender a hacerlo.

Existen dos alternativas para modificar el código. La primera consiste en modificar los códigos Dalvik (o su representación equivalente en ensamblador). La segunda consiste en modificar el código Java decompilado. Aunque la segunda opción resulte la más interesante por tratarse de un lenguaje que conocemos, en la práctica no resulta viable.

Este código ensamblador es una representación en formato texto equivalente al código máquina. De esta forma va a resultar mucho más fácil entender o modificar un programa. En el caso del código Dalvik se suele representar utilizando el código ensamblador smali (https://code.google.com/p/smali).

Ejercicio paso a paso: Modificar el código ensamblador de una aplicación Android.

En primer lugar debemos tener claro qué parte del código queremos modificar. Hemos visto como la primera actividad de Apalabrados corresponde a la clase LiteSplashActivity_. En esta actividad se muestra una vista durante un par de segundos antes de entrar en el juego. Vamos a plantearnos modificar este tiempo para que esté 10 segundos.

1.     Repite el ejercicio Obtención del código Java de una aplicación tratando de localizar la clase y la variable donde se programa este tiempo.

2.     La solución al punto anterior se encuentra en el siguiente fragmento de código:


package com.etermax.games common.login.ui;

...

public abstract class BaseSplashActivity extends FragmentActivity

{

  protected static final int LOGIN_REQUEST;

  protected static int SPLASH_DURATION = 2000;

3.    Si no lo acabas de realizar, repite los puntos 1 al 4 del ejercicio Modificar recursos XML de una aplicación.

4.     Abre la carpeta APK-Multi-Tool\projects\Apalabrados.apk\smali. En esta carpeta se ha almacenado el código desensamblado de la aplicación en formato smali. Observa cómo se ha creado una estructura de directorios correspondientes a los nombres de paquete de cada clase.

5.     Para localizar la clase que queremos cambiar abre la carpeta com\etermax\gamescommon\login\ui.

6.     Con un editor de texto abre el fichero BaseSplashActivity.smali. Parte de su contenido se muestra a continuación:

.

.class public abstract Lcom/etermax/gamescommon/login/ui/BaseSplashActivity;

.super Landroid/support/v4/app/FragmentActivity;

.source "BaseSplashActivity.java"

 

# static fields

.field protected static final LOGIN_REQUEST:I

.field protected static SPLASH_DURATION:I

 

# direct methods

.method static constructor <clinit>()V

    .locals 1

    .prologue

    .line 21

    const/16 v0, 0x7d0

    sput v0, Lcom/etermax/gamescommon/login/ui/BaseSplashActivity;> 
                                                                                                            SPLASH_DURATION:I

    return-void

.end method

 

.method public constructor <init>()V

    .locals 0

    .prologue

    .line 19

    invoke-direct {p0}, Landroid/support/v4/app/FragmentActivity;-><init>()V

    return-void

.end method


Compara la clase original en Java con su equivalente ensamblador smali.

Observa cómo aunque en Java no se ha incluido sus recursos binarios, recursos XML ni su código constructor, de forma implícita se han creado un par: uno estático y otro público.  El primero tiene como objetivo inicializar la variable  SPLASH_DURATION = 2000. Puedes verificar como el valor hexadecimal 7d0 equivale a 2000 en decimal, que es el valor asignado a esta variable.


 

7.     Reemplaza el valor 0x7d0por 0x2710que equivale a 10000en decimal. De esta forma alargaremos el tiempo de la actividad splash.

8.     En APK-Multi-Tool selecciona la opción 12 Compile Non-System APK Files.

9.     Selecciona la opción 2 Create an unsigned apk. Dentro de la carpeta place-apk-here-for-modding se creará el fichero unsignedApalabrados.apk.

10.     Selecciona la opción 13 Sign apk. Dentro de la carpeta anterior se creará el fichero signedApalabrados.apk.

11.     Instala este fichero en un dispositivo móvil.

12.     Verifica los cambios realizados ejecutando la aplicación.

13.     Selecciona la opción 00 Quit para salir de la herramienta.

 

Ejercicio paso a paso: Modificar el código Java de una aplicación Android.

También podemos tratar de crear un proyecto en Eclipse correspondiente a la aplicación Apalabrados; pero ya adelantamos que el resultado no va a ser tan satisfactorio como en el ejercicio anterior. Aunque luego no podamos compilarlo, nos va a ser muy útil disponer del código y los recursos en la herramienta con la que trabajamos habitualmente.

1.    Crea una nueva carpeta con nombre Proyecto. Copia dentro las carpetas assets, res y el fichero AndroidManifest.xml que encontrarás en APK-Multi-Tool\Projects\Apalabrados.apk

2.     Ejecuta la aplicación jd-gui y abre el fichero classes-dex2jar.jar que encontrarás dentro de Apalabrados.apk, tal y como se hizo en el ejercicio Obtención del código Java de una aplicación.

3.     Selecciona la opción File/Save All Source para guardar en código Java en un fichero ZIP.

4.     Crea la carpeta src dentro de la carpeta Proyecto y descomprime en ella el contenido de este ZIP.

5.     Ejecuta Eclipse y selecciona File/Import/Existing Android Code Into Workspace. Pulsa «Next». En Root Directory selecciona la carpeta Proyecto, marca la casilla Copy project into workspace y pulsa «Finish». Se creará el proyecto LiteSplashActivity_. El nombre se ha tomado de la actividad que se lanzará en primer lugar.

6.     Observa que el número de errores es importante. Será muy complicado llegar a eliminarlos todos, por lo que no podremos crear la aplicación a partir de este proyecto. No obstante, aunque el proyecto no compila, disponemos del código y los recursos de esta aplicación dentro de nuestro entorno de programación.

Práctica: Modificar otros comportamientos de la aplicación.

¿Te animarías a realizar otros cambios en la aplicación? Por ejemplo, elimina las consultas para obtener la posición del dispositivo.

Preguntas de repaso: Modificando aplicaciones  Android.