Importante
Este proyecto está archivado y ya no se mantiene.
Algunas de las preguntas más comunes se responden en Preguntas frecuentes y solución de problemas.
Una herramienta de ofuscación de caja negra para aplicaciones de Android.
Obfuscapk es una herramienta modular de Python para ofuscar aplicaciones de Android sin necesidad de su código fuente, ya que apktool
se utiliza para descompilar el archivo apk original y construir una nueva aplicación, después de aplicar algunas técnicas de ofuscación en el código smali
, los recursos y el manifiesto descompilados. 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, al software antivirus basado en firmas).
Obfuscapk está agregando soporte para paquetes de aplicaciones de Android (archivos aab) mediante el uso de BundleDecompiler (consulte el n.º 121). Para utilizar esta nueva característica, descargue la última versión de BundleDecompiler disponible desde aquí, guárdela como BundleDecompiler.jar
en un directorio incluido en PATH
(por ejemplo, en Ubuntu, /usr/local/bin
o /usr/bin
) y haga asegúrese de que tenga configurado el indicador ejecutable.
Importante
BundleDecompiler aún no funciona en Windows, por lo que Obfuscapk no admite la ofuscación de paquetes de aplicaciones en la plataforma Windows. Además, la compatibilidad con paquetes de aplicaciones aún se encuentra en desarrollo inicial, por lo que si tuvo algún problema o desea ayudarnos a mejorar, consulte Contribuir.
Se pueden encontrar más detalles sobre Obfuscapk en el artículo "Obfuscapk: una herramienta de ofuscación de caja negra de código abierto para aplicaciones de Android". Puede citar el artículo de la siguiente manera:
@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 "
}
Obfuscapk está diseñado para ser modular y fácil de ampliar, por lo que se construye mediante un sistema de complementos. En consecuencia, cada ofuscador es un complemento 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 de Android, crea un objeto de ofuscación 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 utilizados). . Luego, el objeto de ofuscación se pasa, como parámetro del método obfuscate
, a todos los complementos/ofuscadores activos (en secuencia) para ser procesados y modificados. La lista y el orden de los complementos activos se especifican mediante opciones de línea de comando.
La herramienta es fácilmente extensible con nuevos ofuscadores: basta con agregar el código fuente que implementa la técnica de ofuscación y los metadatos del complemento (un archivo <obfuscator-name>.obfuscator
) en el directorio src/obfuscapk/obfuscators
(tome un ofuscador simple existente como Nop
como ejemplo inicial). La herramienta detectará automáticamente el nuevo complemento, por lo que no es necesaria ninguna configuración adicional (el nuevo complemento se tratará como todos los demás complementos incluidos con la herramienta).
Hay dos formas de obtener una copia funcional de Obfuscapk en su propia computadora: usando Docker o usando directamente el código fuente en un entorno Python 3
. En ambos casos, lo primero que debe hacer es obtener una copia local de este repositorio, así que abra una terminal en el directorio donde desea guardar el proyecto y clone el repositorio:
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
Esta es la forma sugerida de instalar Obfuscapk, ya que el único requisito es tener instalada una versión reciente de Docker:
$ docker --version
Docker version 20.10.21, build baeda1f
La imagen oficial de Obfuscapk Docker está disponible en Docker Hub (creada automáticamente desde este repositorio):
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Si descargó la imagen oficial de Docker Hub, está listo para usar la herramienta, así que continúe y verifique las instrucciones de uso; de lo contrario, ejecute el siguiente comando en el directorio Obfuscapk/src/
creado anteriormente (la carpeta que contiene el Dockerfile
) para compilar el Imagen acoplable:
$ # 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, haz una prueba rápida para comprobar que todo se instaló correctamente:
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk ahora está listo para usarse; consulte las instrucciones de uso para obtener más información.
Asegúrese de tener una versión reciente de apktool
, apksigner
y zipalign
instalada y disponible desde la línea de comando:
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ 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 paquetes de aplicaciones, también necesita BundleDecompiler, así que descargue la última versión disponible desde aquí, guárdela como BundleDecompiler.jar
en un directorio incluido en PATH
(por ejemplo, en Ubuntu, /usr/local/bin
o /usr/bin
) y asegúrese de que tenga configurado el indicador ejecutable.
Para utilizar BundleDecompiler y apktool
también necesitas una versión reciente de Java. zipalign
y apksigner
están incluidos en el SDK de Android. 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, ejecute 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 una instalación funcional Python 3
(al menos 3.7
) (junto con su administrador de paquetes pip
).
Ejecute los siguientes comandos en el directorio principal del proyecto ( Obfuscapk/
) para instalar las dependencias necesarias:
$ # 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
Una vez instalados los requisitos, haz una prueba rápida para comprobar que todo funciona correctamente:
$ 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 ahora está listo para usarse; consulte las instrucciones de uso para obtener más información.
De ahora en adelante, Obfuscapk será considerado como un ejecutable disponible como obfuscapk
, por lo que deberás adaptar los comandos según cómo hayas instalado la herramienta:
Imagen de Docker : se debe montar un directorio local que contiene la aplicación a ofuscar en /workdir
en el 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 la 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 mirando el mensaje de ayuda:
$ 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 paquete de aplicaciones 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 utilizar varias veces). veces, por ejemplo, -o Rebuild -o NewAlignment -o NewSignature
). Los otros argumentos opcionales son los siguientes:
-w DIR
se usa para configurar el directorio de trabajo donde guardar los archivos intermedios (generado 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 resultar útil para fines de depuración, pero si no es necesario, se puede configurar en un directorio temporal (por ejemplo, -w /tmp/
).
-d OUT_APK_OR_AAB
se utiliza para establecer la ruta del archivo de destino: el archivo apk generado por el proceso de ofuscación (por ejemplo, -d /home/user/Desktop/obfuscated.apk
o -d /home/user/Desktop/obfuscated.aab
). Si no se especifica, el archivo final ofuscado se guardará dentro del directorio de trabajo. Nota: los archivos existentes se sobrescribirán sin previo aviso.
-i
es una señal para ignorar bibliotecas conocidas de terceros durante el proceso de ofuscación, para utilizar menos recursos, aumentar el rendimiento y reducir el riesgo de errores. La lista de bibliotecas a ignorar está adaptada del proyecto LiteRadar.
-p
es una bandera para mostrar barras de progreso durante las operaciones de ofuscación. Cuando se utiliza la herramienta en operaciones por lotes/compilaciones 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 se necesita cuando se usa el ofuscador VirusTotal
, para configurar 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 de apk). Si se utiliza --keystore-file
, también se deben especificar --keystore-password
y --key-alias
, mientras que --key-password
solo se necesita si la clave elegida tiene una contraseña diferente a la contraseña del almacén de claves. De forma predeterminada (cuando no se especifica --keystore-file
), se utiliza un almacén de claves incluido con Obfuscapk para las operaciones de firma.
--ignore-packages-file IGNORE_PACKAGES_FILE
es una ruta a un archivo que incluye nombres de paquetes que se ignorarán. Todas las clases dentro de esos paquetes no se ofuscarán cuando se utilice 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 marca para usar la opción aapt2 al reconstruir una aplicación con apktool
.
Consideremos ahora un ejemplo de trabajo simple para ver cómo funciona Obfuscapk:
$ # 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:
Dado que no se especificó ningún 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/manifiestos/recursos smali
en caso de errores)
Se realizan algunas comprobaciones para garantizar que todos los archivos/ejecutables necesarios estén disponibles y listos para ser utilizados.
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.
cuando se ejecuta 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ó ningún archivo de salida, el archivo apk resultante se guarda en el directorio de trabajo creado anteriormente.
El ofuscador NewAlignment
utiliza la herramienta zipalign
para alinear el archivo apk resultante
El ofuscador NewSignature
firma el archivo apk recién creado con un certificado personalizado contenido en un almacén de claves incluido con Obfuscapk (aunque se puede especificar un almacén de claves 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 ser instalado en un dispositivo/emulador.
Como se vio en el ejemplo anterior, los ofuscadores Rebuild
, NewAlignment
y NewSignature
siempre son necesarios para completar una operación de ofuscación y construir la apk ofuscada final. No son técnicas de ofuscación reales, pero son necesarias en el proceso de construcción, por lo que se incluyen en la lista de ofuscadores para mantener modular la arquitectura general.
¿No funciona como se esperaba? Consulte Preguntas frecuentes y solución de problemas.
Los ofuscadores incluidos en Obfuscapk se pueden dividir en diferentes categorías, dependiendo de las operaciones que realizan:
Trivial : como su nombre 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 se inicia Obfuscapk, genera automáticamente una clave secreta aleatoria (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.
Consejo
No todos los ofuscadores a continuación corresponden a técnicas de ofuscación reales (por ejemplo, Rebuild
, NewAlignment
, NewSignature
y VirusTotal
), pero se implementan como ofuscadores para mantener la arquitectura modular y fácil de ampliar con nuevas funciones.
Utiliza la reflexión para invocar API peligrosas del marco de Android. Para saber si un método pertenece al Framework de Android, Obfuscapk se refiere al mapeo descubierto por Backes et al.
? Código fuente de AdvancedReflection
Insertar código basura. En este caso, el código basura está compuesto por 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 activos.
? Código fuente de AssetEncryption
Esta técnica modifica el gráfico de flujo de control sin afectar la semántica del código: agrega nuevos métodos que invocan los originales. Por ejemplo, una invocación al método m1 será sustituida por un nuevo método contenedor m2 que, cuando se invoca, llama al método original m1 .
? Código fuente de CallIndirection
Cambie el nombre del paquete y cambie el nombre de las clases (incluso en el archivo de manifiesto).
? Código fuente de ClassRename
Cifre cadenas constantes en el código.
? Código fuente de ConstStringEncryption
Eliminar información de depuración.
? Código fuente de eliminación de depuración
Cambiar el nombre de los campos.
? Código fuente de FieldRename
Dado un método, inserta una instrucción
goto
que apunta al final del método y otragoto
que apunta a la instrucción después del primergoto
; modifica el gráfico de flujo de control agregando dos nuevos nodos.
? Ir al código fuente
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 vacío con el mismo nombre y argumentos, pero también agrega nuevos argumentos aleatorios. Luego, el cuerpo del nuevo método se llena con instrucciones aritméticas aleatorias.
? Código fuente de MethodOverload
Cambiar el nombre de los métodos.
? MétodoCambiar el nombre del código fuente
Realinear la aplicación.
? Nuevo código fuente de alineación
Vuelva a firmar la solicitud con una nueva firma personalizada.
? Nuevo código fuente de firma
Insertar código basura. Nop, abreviatura de no-operation , es una instrucción dedicada que no hace nada. Esta técnica simplemente inserta instrucciones
nop
aleatorias dentro de cada implementación de método.
? No código fuente
Reordene aleatoriamente las entradas en el archivo de manifiesto.
? Código fuente de RandomManifest
Reconstruya la aplicación.
? Reconstruir el código fuente
Esta técnica analiza el código existente buscando invocaciones de métodos de la aplicación, ignorando las llamadas al marco de trabajo de Android (consulte
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 utilizando las API de Reflection.
? Código fuente de reflexión
Esta técnica consiste en cambiar el orden de bloques básicos en el código. Cuando se encuentra una instrucción de bifurcación, la condición se invierte (por ejemplo, bifurca si es menor que , se bifurca si es mayor o igual que ) y los bloques básicos de destino se reordenan en consecuencia. Además, también reorganiza aleatoriamente el código abusando de las instrucciones
goto
.
? Reordenar el código fuente
Cifre cadenas en recursos (solo aquellas llamadas dentro del código).
? Código fuente de ResStringEncryption
Envíe la solicitud original y la ofuscada a Virus Total. Debe proporcionar la clave API de VT (consulte la opción
-k
).
? Código fuente de VirusTotal
Eres libre de utilizar este código bajo la licencia MIT.
Este software fue desarrollado con fines de investigación en el Laboratorio de Seguridad Informática (CSecLab), alojado en DIBRIS, Universidad de Génova.