Red de conocimiento informático - Conocimiento informático - Cómo evitar que el código sea descompilado

Cómo evitar que el código sea descompilado

Dado que el apk será cargado por la máquina virtual de Android, tiene ciertas especificaciones. Después de cifrar el apk, Dalvik ya no podrá reconocer el apk. Es imposible evitar completamente esta situación porque siempre hay alguien que puede descifrar tu código. Pero hay varias maneras de hacer que su código sea más difícil de descompilar.

1 El código clave usa jni para llamar al código nativo escrito en c o c, por lo que es relativamente difícil descompilar

2 Ofuscar el código java. La ofuscación consiste en agregar código inútil sin cambiar la lógica del código o cambiarle el nombre para que el código fuente sea difícil de entender después de la descompilación. Hay muchas herramientas de ofuscación de código Java de código abierto en Internet, que generalmente se compilan mediante ant.

1. Agregue el siguiente proguard.config=proguard.cfg en el archivo de proyecto project.properties de la siguiente manera:

target=android-8

proguard.config =proguard.cfg

Eclipse generará un archivo proguard.cfg con esta configuración en el directorio del proyecto

2. Generar almacén de claves (si ya tiene uno)

p>.

De acuerdo con la siguiente línea de comando en el directorio D:\Program Files\Java\jdk1.6.0_07\bingt;, ingrese keytool -genkey -alias android.validity 100000 -keystore android.keystore

Significado del parámetro: -validez es el período de validez del certificado, escrito como 100.000 días, los espacios y los retrocesos se cuentan como contraseñas.

Después de ejecutar el comando, el archivo android.keystore se generará en el directorio D:\Program Files\Java\jdk1.6.0_07\bingt;

3. Operaciones en Eclipce

Archivo-gt; Exportar aplicación de Android-gt; Seleccione el proyecto-gt; Archivo APK

Después de la ofuscación, los nombres de clase y método originales serán reemplazados por caracteres a, b, c, etc. El código fuente estará ofuscado. El principio de ofuscación es el mapeo de nombres de clases y métodos.

Pero 4 componentes no se ofuscarán (todos los componentes definidos en el archivo de manifiesto no se ofuscarán) porque el sistema requiere el archivo de manifiesto para encontrar y ejecutar la aplicación.

Lectura de código del archivo Proguard.cfg

-optimizationpasses 5 -gt; establece la relación de compresión ofuscada 0 ~ 7

-dontusemixedcaseclassnames -gt; /p>

- dontskipnonpubliclibraryclasses -gt; Establece la relación de compresión ofuscada 0 ~ 7

-dontusemixedcaseclassnames -gt; Aa aA

- dontskipnonpubliclibraryclasses -gt; >

p>

; Si la aplicación introduce un paquete jar y desea ofuscar las clases en el paquete jar

-dontpreverify

-verbose -gt; un archivo de mapeo después de la ofuscación. asignar nombres de clases -gt; asignar nombres de clases convertidos.

mapa después del nombre de la clase

-optimizaciones !code/simplification/arithmetic, !field/*, !class/merging/* -gt;

-mantener clase pública * extiende android.app.service

-mantener clase pública * extiende android.app.service

-mantener clase pública * extiende android .content.BroadcastReceiver

-mantener la clase pública * extiende android.content.contentProvider

-mantener la clase pública * extiende android.app.backup.class * extiende android.preference.Preference

-mantener la clase pública com.android.vending.licensing.ILicensingService

-mantener la clase pública com.android.vending.licensing.keepclasseswithmembernames clase * {

nativa lt; métodosgt;; -gt; No se pueden ofuscar todos los métodos nativos.

}

- clase keepclasseswithmembers * {

public lt; initgt; (android.content.Context, android.util.AttributeSet

);

- -gt; Algunos métodos no se pueden confundir. -gt; algunos constructores no se pueden desofuscar

}

- keepclasseswithmembers class * {

public initgt; .AttributeSet, int);

}

-keepclassmembers clase * extiende android.app.Activity {

public void *(android.view.View);

}

-keepclassmembers enum * { -gt; Las clases de enumeración no se pueden ofuscar.

público estático **[] valores();

público estático ** valorDe(java.lang.String);

}

-keep class * implementa android.os.

-keep class * implementa android.os.

public static final android.os.Parcelable$Creator *;

}