Smali - Decompiling/[Modifying]/Compiling
A veces es interesante modificar el código de la aplicación para acceder a información oculta para ti (quizás contraseñas o flags bien ofuscadas). Entonces, podría ser interesante descompilar el apk, modificar el código y recompilarlo.
Referencia de Opcodes: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Fast Way
Usando Visual Studio Code y la extensión APKLab, puedes descompilar automáticamente, modificar, recompilar, firmar e instalar la aplicación sin ejecutar ningún comando.
Otro script que facilita mucho esta tarea es https://github.com/ax/apk.sh
Decompile the APK
Usando APKTool puedes acceder al código smali y recursos:
Si apktool te da algún error, intenta instalar la última versión
Algunos archivos interesantes que deberías revisar son:
res/values/strings.xml (y todos los xml dentro de res/values/*)
AndroidManifest.xml
Cualquier archivo con extensión .sqlite o .db
Si apktool
tiene problemas decodificando la aplicación, echa un vistazo a https://ibotpeaches.github.io/Apktool/documentation/#framework-files o intenta usar el argumento -r
(No decodificar recursos). Entonces, si el problema estaba en un recurso y no en el código fuente, no tendrás el problema (tampoco descompilarás los recursos).
Cambiar código smali
Puedes cambiar instrucciones, cambiar el valor de algunas variables o agregar nuevas instrucciones. Yo cambio el código Smali usando VS Code, luego instalas la extensión smalise y el editor te dirá si alguna instrucción es incorrecta. Algunos ejemplos se pueden encontrar aquí:
O puedes revisar a continuación algunos cambios en Smali explicados.
Recompilar el APK
Después de modificar el código, puedes recompilar el código usando:
Se compilará el nuevo APK dentro de la carpeta dist.
Si apktool lanza un error, intenta instalar la última versión
Firma el nuevo APK
Luego, necesitas generar una clave (se te pedirá una contraseña y algo de información que puedes llenar aleatoriamente):
Finalmente, firma el nuevo APK:
Optimizar nueva aplicación
zipalign es una herramienta de alineación de archivos que proporciona una optimización importante a los archivos de aplicación de Android (APK). Más información aquí.
Firma el nuevo APK (¿de nuevo?)
Si prefieres usar apksigner en lugar de jarsigner, debes firmar el apk después de aplicar la optimización con zipalign. PERO NOTA QUE SOLO TIENES QUE FIRMAR LA APLICACIÓN UNA VEZ CON jarsigner (antes de zipalign) O CON apksigner (después de zipalign).
Modificando Smali
Para el siguiente código Java Hello World:
El código Smali sería:
El conjunto de instrucciones Smali está disponible aquí.
Cambios ligeros
Modificar valores iniciales de una variable dentro de una función
Algunas variables se definen al principio de la función utilizando el opcode const, puedes modificar sus valores, o puedes definir nuevos:
Operaciones Básicas
Cambios Más Grandes
Registro
Recomendaciones:
Si vas a usar variables declaradas dentro de la función (declaradas v0,v1,v2...) coloca estas líneas entre el .local <número> y las declaraciones de las variables (const v0, 0x1)
Si quieres poner el código de registro en medio del código de una función:
Agrega 2 al número de variables declaradas: Ej: de .locals 10 a .locals 12
Las nuevas variables deben ser los siguientes números de las variables ya declaradas (en este ejemplo deberían ser v10 y v11, recuerda que comienza en v0).
Cambia el código de la función de registro y usa v10 y v11 en lugar de v5 y v1.
Toasting
Recuerda agregar 3 al número de .locals al principio de la función.
Este código está preparado para ser insertado en el medio de una función (cambia el número de las variables según sea necesario). Tomará el valor de this.o, lo transformará a String y luego hará un toast con su valor.
Last updated