
Una herramienta automática de ofuscación para aplicaciones Android que funciona de manera caja negra, soporta características avanzadas de ofuscación y tiene una arquitectura modular fácilmente extensible con nuevas técnicas
[!IMPORTANT] Este proyecto está archivado y ya no recibe mantenimiento.
Algunas de las preguntas más frecuentes se responden en FAQ y solución de problemas.

Una herramienta de ofuscación de caja negra para aplicaciones Android.
Obfuscapk es una herramienta modular de Python para ofuscar aplicaciones Android sin necesidad
de su código fuente, ya que se utiliza apktool
para descompilar el archivo apk original y construir una nueva aplicación, tras aplicar algunas
técnicas de ofuscación en el código smali descompilado, los recursos y el manifiesto. La
aplicación ofuscada conserva la misma funcionalidad que la original, pero las diferencias
internas a veces hacen que la nueva aplicación sea muy diferente de la original
(por ejemplo, para los antivirus basados en firmas).
Obfuscapk está añadiendo soporte para
Android App Bundles (archivos aab) usando
BundleDecompiler (ver
#121). Para usar esta nueva
funcionalidad, descarga la última versión de BundleDecompiler disponible desde
aquí,
guárdalo como BundleDecompiler.jar en un directorio incluido en PATH (por ejemplo, en Ubuntu,
/usr/local/bin o /usr/bin) y asegúrate de que tenga el flag de ejecutable activado.
[!IMPORTANT] BundleDecompiler aún no funciona en Windows, por lo que la ofuscación de app bundles no es compatible con Obfuscapk en la plataforma Windows. Además, el soporte para app bundle está aún en desarrollo temprano, así que si enfrentas algún problema o deseas ayudarnos a mejorar, consulta contribuir.
Se pueden encontrar más detalles sobre Obfuscapk en el artículo "Obfuscapk: An open-source black-box obfuscation tool for Android apps". Puedes citar el artículo de la siguiente manera:```BibTeX @article{aonzo2020obfuscapk, title = "Obfuscapk: An open-source black-box obfuscation tool for Android apps", journal = "SoftwareX", volume = "11", pages = "100403", year = "2020", issn = "2352-7110", doi = "https://doi.org/10.1016/j.softx.2020.100403", url = "https://www.sciencedirect.com/science/article/pii/S2352711019302791", author = "Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo", keywords = "Android, Obfuscation, Program analysis" }
## ❱ Demo

## ❱ Arquitectura

Obfuscapk está diseñado para ser modular y fácil de extender, por lo que se construye utilizando un
[sistema de plugins](https://github.com/tibonihoo/yapsy). En consecuencia, cada ofuscador es
un plugin que hereda de una clase base abstracta y necesita implementar el método `obfuscate`.
Cuando la herramienta comienza a procesar un nuevo archivo de aplicación Android, crea un
[objeto de ofuscación](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscation.py)
para almacenar toda la información necesaria (por ejemplo, la ubicación del código `smali` descompilado)
y el estado interno de las operaciones (por ejemplo, la lista de ofuscadores ya usados).
Luego, el objeto de ofuscación se pasa, como parámetro al método `obfuscate`, a todos
los plugins/ofuscadores activos (en secuencia) para que sean procesados y modificados. La lista y
el orden de los plugins activos se especifica mediante las [opciones de línea de comandos](#-uso).
La herramienta se puede extender fácilmente con nuevos ofuscadores: basta con agregar el código fuente
que implementa la técnica de ofuscación y los metadatos del plugin (un
archivo `<nombre-del-ofuscador>.obfuscator`) en el directorio
[`src/obfuscapk/obfuscators`](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators)
(toma como ejemplo un ofuscador simple existente como
[`Nop`](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscators/nop/nop.py)).
La herramienta detectará automáticamente el nuevo plugin, por lo que no se necesita
configuración adicional (el nuevo plugin será tratado como todos los demás
plugins incluidos con la herramienta).
## ❱ Instalación
Hay dos formas de obtener una copia funcional de Obfuscapk en tu propio ordenador: ya sea
[usando Docker](#imagen-docker) o [usando directamente el código fuente](#desde-el-código-fuente)
en un entorno de `Python 3`. En ambos casos, lo primero que hay que hacer es obtener una copia
local de este repositorio, así que abre una terminal en el directorio donde quieras guardar
el proyecto y clona el repositorio:```Shell
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
Esta es la forma sugerida de instalar Obfuscapk, ya que el único requisito es tener una versión reciente de Docker instalada:```Shell $ docker --version Docker version 20.10.21, build baeda1f
#### Imagen oficial de Docker Hub
La [imagen oficial de Docker de Obfuscapk](https://hub.docker.com/r/claudiugeorgiu/obfuscapk)
está disponible en Docker Hub (construida automáticamente desde este repositorio):```Shell
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Si descargaste la imagen oficial desde Docker Hub, ya estás listo para usar la herramienta, así que
revisa las instrucciones de uso; de lo contrario, ejecuta el siguiente
comando en el directorio Obfuscapk/src/ previamente creado (la carpeta que contiene el
Dockerfile) para construir la imagen de Docker:```Shell
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
Cuando la imagen de Docker esté lista, realiza una prueba rápida para verificar que todo se instaló correctamente:```Shell
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk ya está listo para usarse, consulte las instrucciones de uso para más información.
Asegúrese de tener una versión reciente de
apktool,
apksigner
y zipalign instaladas
y disponibles desde la línea de comandos:```Shell
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
```Shell
$ apksigner
Usage: apksigner <command> [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
Para admitir la ofuscación de app bundles también necesitas
BundleDecompiler, así que descarga
la última versión disponible desde
aquí,
guárdalo como BundleDecompiler.jar en un directorio incluido en PATH (por ejemplo, en Ubuntu,
/usr/local/bin o /usr/bin) y asegúrate de que tenga el flag ejecutable configurado.
Para usar BundleDecompiler y apktool también necesitas una versión reciente de Java.
zipalign y apksigner están incluidos en el Android SDK. La ubicación de los
ejecutables también se puede especificar a través de las siguientes variables de entorno:
APKTOOL_PATH, BUNDLE_DECOMPILER_PATH, APKSIGNER_PATH y ZIPALIGN_PATH (por ejemplo,
en Ubuntu, ejecuta export APKTOOL_PATH=/custom/location/apktool antes de ejecutar Obfuscapk
en la misma terminal).
Aparte de las herramientas anteriores, el único requisito de este proyecto es tener instalado
un Python 3 funcional (al menos 3.7) (junto con su gestor de paquetes pip).
Ejecuta los siguientes comandos en el directorio principal del proyecto (Obfuscapk/) para
instalar las dependencias necesarias:```Shell
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended. $ python3 -m venv venv $ source venv/bin/activate
$ # Install Obfuscapk's requirements. $ python3 -m pip install -r src/requirements.txt
Después de instalar los requisitos, haz una prueba rápida para verificar que todo funciona correctamente:```Shell
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk ya está listo para ser utilizado, consulta las instrucciones de uso para más información.
A partir de ahora, Obfuscapk se considerará como un ejecutable disponible como obfuscapk,
por lo que debes adaptar los comandos según cómo hayas instalado la herramienta:
Imagen Docker: un directorio local que contenga la aplicación a ofuscar debe montarse
en /workdir dentro del contenedor (por ejemplo, el directorio actual "${PWD}"), por lo que el
comando:
$ obfuscapk [params...]
se convierte en:
$ docker run --rm -it -u $(id -u):$(id -g) -v "${PWD}":"/workdir" obfuscapk [params...]
Desde el código fuente: cada instrucción debe ejecutarse desde el directorio
Obfuscapk/src/ (o agregando el directorio Obfuscapk/src/ a la variable de entorno
PYTHONPATH) y el comando:
$ obfuscapk [params...]
se convierte en:
$ python3 -m obfuscapk.cli [params...]
Comencemos viendo el mensaje de ayuda:```Shell $ obfuscapk --help obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY] [--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD] [--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2] <APK_OR_BUNDLE_FILE>
Hay dos parámetros obligatorios: `<APK_OR_BUNDLE_FILE>`, la ruta (relativa o absoluta) al archivo apk o al paquete de aplicación a ofuscar y la lista con los nombres de las técnicas de ofuscación a aplicar (especificadas con una opción `-o` que se puede usar varias veces, p. ej., `-o Rebuild -o NewAlignment -o NewSignature`). Los otros argumentos opcionales son los siguientes:
* `-w DIR` se usa para establecer el directorio de trabajo donde guardar los archivos intermedios (generados por `apktool`). Si no se especifica, se crea un directorio llamado `obfuscation_working_dir` en el mismo directorio que la aplicación de entrada. Esto puede ser útil para fines de depuración, pero si no es necesario, se puede establecer en un directorio temporal (p. ej., `-w /tmp/`).
* `-d OUT_APK_OR_AAB` se usa para establecer la ruta del archivo de destino: el archivo apk generado por el proceso de ofuscación (p. ej., `-d /home/user/Desktop/obfuscated.apk` o `-d /home/user/Desktop/obfuscated.aab`). Si no se especifica, el archivo ofuscado final se guardará dentro del directorio de trabajo. Nota: los archivos existentes se sobrescribirán sin previo aviso.
* `-i` es una bandera para ignorar las librerías de terceros conocidas durante el proceso de ofuscación, para usar menos recursos, mejorar el rendimiento y reducir el riesgo de errores. La [lista de librerías](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/resources/libs_to_ignore.txt) a ignorar está adaptada del proyecto [LiteRadar](https://github.com/pkumza/LiteRadar).
* `-p` es una bandera para mostrar barras de progreso durante las operaciones de ofuscación. Al usar la herramienta en operaciones por lotes/construcciones automáticas, es conveniente tener las barras de progreso deshabilitadas; de lo contrario, esta bandera debe estar habilitada para ver el progreso de la ofuscación.
* `-k VT_API_KEY` solo es necesario cuando se usa el ofuscador `VirusTotal`, para establecer la clave API que se usará al comunicarse con Virus Total.
* `--keystore-file KEYSTORE_FILE`, `--keystore-password KEYSTORE_PASSWORD`, `--key-alias KEY_ALIAS` y `--key-password KEY_PASSWORD` se pueden usar para especificar un almacén de claves personalizado (necesario para la firma del apk). Si se usa `--keystore-file`, también se deben especificar `--keystore-password` y `--key-alias`, mientras que `--key-password` solo es necesario si la clave elegida tiene una contraseña diferente a la del almacén de claves. Por defecto (cuando no se especifica `--keystore-file`), se usa un [almacén de claves incluido con Obfuscapk](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/resources/obfuscation_keystore.jks) para las operaciones de firma.
* `--ignore-packages-file IGNORE_PACKAGES_FILE` es una ruta a un archivo que contiene nombres de paquetes que se deben ignorar. Todas las clases dentro de esos paquetes no se ofuscarán cuando se use esta opción. El archivo debe tener un nombre de paquete por línea, como se muestra en el siguiente ejemplo:
```
com.mycompany.dontobfuscate
com.mycompany.ignore
...
```
* `--use-aapt2` es una bandera para usar la opción aapt2 al reconstruir una aplicación con `apktool`.
Consideremos ahora un ejemplo simple de trabajo para ver cómo funciona Obfuscapk:```Shell
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
Al ejecutar el comando anterior, esto es lo que sucede detrás de escena:
ya que no se especificó un directorio de trabajo, se crea un nuevo directorio de trabajo
(obfuscation_working_dir) en la misma ubicación que original.apk (esto puede ser
útil para inspeccionar los archivos smali/manifiesto/recursos en caso de errores)
se realizan algunas comprobaciones para asegurarse de que todos los archivos/ejecutables necesarios estén disponibles y listos para usar
el proceso de ofuscación real comienza: los ofuscadores especificados se ejecutan (en orden) uno por uno hasta que no quede ningún ofuscador o hasta que se encuentre un error
al ejecutar el primer ofuscador, original.apk se descompila con apktool
y los resultados se almacenan en el directorio de trabajo
dado que el primer ofuscador es RandomManifest, las entradas en el manifiesto
de Android descompilado se reordenan aleatoriamente (sin romper las estructuras xml)
el ofuscador Rebuild simplemente reconstruye la aplicación (ahora con el manifiesto
modificado) usando apktool, y dado que no se especificó un archivo de salida,
el archivo apk resultante se guarda en el directorio de trabajo creado antes
el ofuscador utiliza la herramienta para alinear el archivo apk resultante
Como se vio en el ejemplo anterior, los ofuscadores Rebuild, NewAlignment y NewSignature
siempre son necesarios para completar una operación de ofuscación, para construir el apk ofuscado final.
No son técnicas de ofuscación reales, pero son necesarios en el proceso de compilación,
por lo que se incluyen en la lista de ofuscadores para mantener la arquitectura general modular.
¿No funciona como se esperaba? Consulte FAQ y solución de problemas.
Los ofuscadores incluidos en Obfuscapk se pueden dividir en diferentes categorías, dependiendo de las operaciones que realicen:
Trivial: como su nombre lo indica, esta categoría incluye operaciones simples (que no modifican mucho la aplicación original), como firmar el archivo apk con una nueva firma.
Renombrar: operaciones que cambian los nombres de los identificadores utilizados (clases, campos, métodos).
Cifrado: empaquetar código/recursos cifrados y descifrarlos durante la ejecución de la aplicación. Cuando Obfuscapk se inicia, genera automáticamente una clave secreta aleatoria (de 32 caracteres, usando letras y dígitos ASCII) que se utilizará para el cifrado.
Código: todas las operaciones que implican la modificación del código fuente descompilado.
Recursos: operaciones en los archivos de recursos (como modificar el manifiesto).
Otro
Los ofuscadores actualmente incluidos con Obfuscapk se presentan brevemente a continuación (en orden alfabético). Consulte el código fuente del proyecto para obtener más detalles.
[!TIP] No todos los ofuscadores siguientes corresponden a técnicas de ofuscación reales (por ejemplo,
Rebuild,NewAlignment,NewSignatureyVirusTotal), pero están implementados como ofuscadores para mantener la arquitectura modular y fácil de extender con nueva funcionalidad.
Usa reflexión para invocar APIs peligrosas del Android Framework. Para determinar si un método pertenece al Android Framework, Obfuscapk se refiere al mapeo descubierto por Backes et al.
📄 Código fuente de AdvancedReflection
Inserta código basura. En este caso, el código basura se compone de cálculos aritméticos y una instrucción de bifurcación que depende del resultado de estos cálculos, diseñada de tal manera que la bifurcación nunca se toma.
📄 Código fuente de ArithmeticBranch
Cifrar archivos de assets.
📄 Código fuente de AssetEncryption
Esta técnica modifica el grafo de flujo de control sin afectar la semántica del código: añade nuevos métodos que invocan a los originales. Por ejemplo, una invocación al método m1 será sustituida por un nuevo método envoltorio m2, que, al ser invocado, llama al método original m1.
📄 Código fuente de CallIndirection
Cambiar el nombre del paquete y renombrar clases (incluso en el archivo de manifiesto).
📄 Código fuente de ClassRename
Cifrar cadenas constantes en el código.
📄 Código fuente de ConstStringEncryption
Eliminar información de depuración.
📄 Código fuente de DebugRemoval
Renombrar campos.
📄 Código fuente de FieldRename
Dado un método, inserta una instrucción
gotoque apunta al final del método y otragotoque apunta a la instrucción después del primergoto; modifica el grafo de flujo de control añadiendo dos nuevos nodos.
📄 Código fuente de Goto
Cifrar bibliotecas nativas.
📄 Código fuente de LibEncryption
Explota la característica de sobrecarga del lenguaje de programación Java para asignar el mismo nombre a diferentes métodos pero usando diferentes argumentos. Dado un método ya existente, esta técnica crea un nuevo método void con el mismo nombre y argumentos, pero también añade nuevos argumentos aleatorios. Luego, el cuerpo del nuevo método se llena con instrucciones aritméticas aleatorias.
📄 Código fuente de MethodOverload
Renombrar métodos.
📄 Código fuente de MethodRename
Realinear la aplicación.
📄 Código fuente de NewAlignment
Volver a firmar la aplicación con una nueva firma personalizada.
📄 Código fuente de NewSignature
Inserta código basura. Nop, abreviatura de no-operation, es una instrucción dedicada que no hace nada. Esta técnica simplemente inserta instrucciones
nopaleatorias dentro de cada implementación de método.
📄 Código fuente de Nop
Reordenar aleatoriamente las entradas en el archivo de manifiesto.
📄 Código fuente de RandomManifest
Reconstruir la aplicación.
📄 Código fuente de Rebuild
Esta técnica analiza el código existente buscando invocaciones a métodos de la aplicación, ignorando las llamadas al Android framework (ver
AdvancedReflection). Si encuentra una instrucción con una invocación de método adecuada (es decir, sin métodos constructores, visibilidad pública, suficientes registros libres, etc.), dicha invocación se redirige a un método personalizado que invocará el método original usando las APIs de Reflection.
📄 Código fuente de Reflection
Esta técnica consiste en cambiar el orden de los bloques básicos en el código. Cuando se encuentra una instrucción de bifurcación, la condición se invierte (por ejemplo, bifurcar si es menor que, se convierte en bifurcar si es mayor o igual que) y los bloques básicos objetivo se reordenan en consecuencia. Además, también reordena aleatoriamente el código abusando de las instrucciones
goto.
📄 Código fuente de Reorder
Cifrar cadenas en recursos (solo aquellas llamadas dentro del código).
📄 Código fuente de ResStringEncryption
Enviar la aplicación original y la ofuscada a Virus Total. Debes proporcionar la clave de API de VT (ver opción
-k).
📄 Código fuente de VirusTotal
Eres libre de usar este código bajo la Licencia MIT.
Este software fue desarrollado con fines de investigación en el Computer Security Lab (CSecLab), alojado en DIBRIS, Universidad de Génova.
NewAlignmentzipalignel ofuscador NewSignature firma el nuevo archivo apk creado con un certificado
personalizado contenido en un
keystore incluido con Obfuscapk
(aunque se puede especificar un keystore diferente con el parámetro --keystore-file)
cuando todos los ofuscadores se han ejecutado sin errores, el archivo apk ofuscado
resultante se puede encontrar en obfuscation_working_dir/original_obfuscated.apk, firmado,
alineado y listo para instalar en un dispositivo/emulador