Tercera contramedida: verificar que no ha modificado nuestra APK

Parece que todo lo realizado hasta el momento no es suficiente. Como veremos en el siguiente ejercicio, las medidas implementadas hasta ahora no evitan que nos craqueen la aplicación con una herramienta automática.

 

Ejercicio paso a paso: Evitar la comprobación de licencia con Lucky Patcher.

Lucky Patcheres una herramienta para Android que permite evitar los anuncios, modificar permisos y saltarse la verificación de licencia de las aplicaciones instaladas. Aunque se trata de un proceso automático suele dar resultados satisfactorios con la mayoría de aplicaciones.

1.     Abre la web http://lucky-patcher.netbew.comdesde un dispositivo móvil.

2.     Ves a la sección Download y descarga la última versión de la aplicación. En este tutorial hemos usado la v3.2.6.

3.      Instala la aplicación[1].

 

 

4.     Al ejecutar esta herramienta te mostrará una lista con las aplicaciones encontradas que puede craquear.

5.     Selecciona ObtencionLicencia. Te mostrará información detallada sobre la aplicación.

6.     Selecciona el botón «Abrir menú de parches», luego «Crear archivo Apk modificado» y finalmente «Apk con verificación de licencia removida».

7.     Aparecerá un menú con los tipos de parches disponibles. En este caso es suficiente con seleccionar «Modo Automático! ». Pulsa en «Reconstruir aplicación! ». Aparecerá la siguiente información:

 

8.     Desinstala la aplicación ObtenciónLicencia e instala el nueva APK que acabas de crear.

9.     Entra dentro de Google Play Developer Console y en la izquierda selecciona la pestaña de Configuración ().

10.     Modifica el valor de Respuesta de licencia de prueba a NOT_LICENSEC.

11.     En nuestra aplicación pulsa el botón «Comprobar Licencia». Verifica que se obtiene la licencia.

Las medidas implementadas en el punto anterior se han centrado en alterar la comunicación entre nuestra aplicación y la librería LVL. Seguramente es Lucky Patcher el que trate de localizar y modificar la comunicación entre LVL y el cliente Google Play. En este apartado vamos a utilizar un planteamiento diferente: vamos a tratar de verificar si la aplicación ha sido modificada.

Una de las alternativas para resolver esta cuestión es verificar si ha sido firmada con un certificado diferente al nuestro. Si alguien modifica nuestra aplicación no podrá usar nuestro certificado (solo nosotros tenemos la clave privada), por lo que tendrá que usar uno diferente.


Ejercicio paso a paso: Verificar la firma de nuestra aplicación.


1.     En el proyecto ObtencionLicencia añade el siguiente método a la clase MainActivity [2].

public boolean verificarFirma() {

    try{

        Signature[] firmas = getPackageManager().getPackageInfo(
            getPackageName(), PackageManager.GET_SIGNATURES).signatures;

        int i = firmas[0].hashCode();

        Toast.makeText(this, i+","+firmas[0].toCharsString(),
                                                                                  Toast.LENGTH_LONG).show();

        return i == -633674321; //Reemplaza este valor

    } catch (NameNotFoundException e) {

        return false;

    }

}

Este método devolverá true en caso de comprobar que la firma es la original y false en caso contrario. Comenzamos utilizando el PackageManager para obtener información sobre el paquete de nuestra aplicación. En concreto le pedimos un array con las firmas de nuestra aplicación. La del certificado de la aplicación se almacena en la primera posición. La firma es muy larga, por lo que para manipularla de forma más cómoda vamos a obtener un código hash en un entero de 32 bits. En la siguiente línea se muestra en un Toast el código hash de la firma, seguido de una coma y de la firma en hexadecimal. Este Toast mostrará algo similar a:

A continuación, comprobamos que el código hash obtenido coincide con el nuestro y devolvemos el valor correspondiente. Cuando la aplicación esté firmada, tendrás que ejecutarla y poner el valor que aparezca en el Toast en sustitución del código hash que aparece en el código. El método termina capturando una excepción: si el nombre de nuestro paquete no es encontrado devolvemos que no podemos verificar la firma.

2.     Modifica el método entrar() para que llame a la función anterior:

public void entrar(View view) {

   if(permitir) {

      if(verificarFirma()) {

         Toast.makeText(this, "Entrando en aplicación",

                                                                                 Toast.LENGTH_LONG).show();

      } else {

         Toast.makeText(this, "Firma cambiada",Toast.LENGTH_LONG).show();

      }

   } else {

      Toast.makeText(this, "Licencia no válida",Toast.LENGTH_LONG).show();

   }

}

3.     Firma la aplicación con un certificado y ejecuta en APK obtenido. Si obtienes la licencia y luego pulsas el botón «Entrar» te mostrará Firma cambiada.

4.     Reemplaza el código hash de la firma como se ha explicado en el primer punto.

5.     Firma la aplicación con el mismo certificado y ejecuta el APK obtenido. Ahora te ha de mostrar Entrando en aplicación.

6.     Repite el ejercicio Evitar la comprobación de licencia con Lucky Patcher. Verifica que aunque sigue eludiendo la comprobación de licencia, esta nueva contramedida evita que se pueda entrar en la aplicación.

Otra alternativa para verificar que nuestra aplicación no ha sido modificada podría consistir en usar de una función hash, como CRC32, para calcular el código hash del fichero APK de la aplicación. Puedes encontrar la ruta de los archivos de la aplicación llamando context.GetApplicationInfo(). Compara el resultado con el valor esperado. Por supuesto este código hash no puede almacenarse en el mismo código que estás usando para calcularlo. Puedes guardar este código en un archivo que no se utilice en este cálculo o en un servidor.

Preguntas de repaso: Evitar que pirateen nuestra aplicación.


[1]Fuente: http://stackoverflow.com/questions/13445598/lucky-patcher-how-can-i-

protect-from-it.

 


[2]Esta acción puede resultar peligrosa. La hemos descargado de una fuente desconocida y además nos pide los permisos: editar o borrar contenido de USB, acceso completo a red y ejecutarse al inicio. Los datos almacenados en la memoria USB podrían estar comprometidos, por lo que sería interesante borrar la información comprometidaque tengas en la memoria USBantes de instalarla. También es recomendable desinstalarlatras realizar el ejercicio.