
Front-end rápido de descompilador de APK de Android que consulta directamente artefactos DEX compilados, extrayendo clases y referencias cruzadas en milisegundos sin preprocesamiento.
Al descompilar APKs de Android masivos, el procedimiento estándar es esperar. Esperamos a que las herramientas consuman gigabytes de RAM, inflen por completo los artefactos y pasen decenas de minutos construyendo pesados índices globales y referencias cruzadas... Todo esto solo para garantizar búsquedas rápidas de código más adelante, pero aquí está la contradicción. Un artefacto compilado ya está altamente estructurado, los descompiladores modernos nunca aprovechan esto, desperdician enormes cantidades de tiempo y memoria reconstruyendo una base de datos inflada de relaciones de código sobre datos ya estructurados. Este enfoque de ingeniería desafía el sentido común. Cuando puedo extraer directamente cualquier relación de código del APK en milisegundos, ¿sigue teniendo algún valor este preprocesamiento?
En lugar de forzar a los descompiladores a un preprocesamiento pesado, elegimos consultar el artefacto compilado directamente como una base de datos. Construimos un motor sin estado y sin sobrecarga que extrae y busca código bajo demanda en milisegundos. En esta sesión, exploraremos la ingeniería subyacente necesaria para evitar los cuellos de botella tradicionales. Demostraremos cómo abandonar el inflado completo sondeando directamente dentro del flujo de bits Deflate, construyendo densas tablas de búsqueda Huffman para extraer metadatos esenciales sin tocar bloques de datos irrelevantes. Además, explicaremos detalles de optimización del compilador R8, especialmente cómo la reubicación determinista de constantes y la deduplicación de instrucciones dejan tras de sí diseños físicos altamente concentrados; aprovechamos este comportamiento del compilador para ejecutar búsquedas de código cruzadas entre DEX a velocidad relámpago. Para mapear estos desplazamientos de bytecode sin procesar de vuelta a métodos, diseñamos una primitiva de localización de instrucciones O(1), logrando resolución de métodos en tiempo constante sin construir tablas de mapeo pesadas. Finalmente, al alcanzar un objetivo, Droid ASC extrae solo los bytecodes específicos y sus dependencias, reconstruyendo dinámicamente un DEX mínimo y autoconsistente completamente en memoria para una descompilación instantánea.
Demostraremos esta arquitectura en vivo contra un APK comercial de 352MB. Droid ASC ejecuta búsquedas globales de referencias cruzadas en 1.79 segundos y descompila clases objetivo en 177 milisegundos usando solo 141MB de RAM. Al tratar el artefacto como una base de datos de solo lectura y operar con cero preprocesamiento, devolvemos el descompilador a su esencia fundamental. Ya no es una herramienta de indexación inflada, sino un motor de descompilación bajo demanda, ultrarrápido, que redefine fundamentalmente cómo analizamos código compilado.

https://github.com/user-attachments/assets/4c4a6813-8561-490c-a573-ef113da861b6
# from PyPI
pip install droidasc
# or from source
pip install .
Después de la instalación, el comando CLI droidasc está disponible globalmente:
usage: droidasc [-h] {getclass,listclass,getmanifest,findrefs} ...
ASC tooling entry.
positional arguments:
{getclass,listclass,getmanifest,findrefs}
getclass Locate the target class in APK, extract one DEX in memory, then decompile.
listclass List classes defined across all DEX entries in APK.
getmanifest Decode AndroidManifest.xml from APK and print it as XML.
findrefs Find code references for string/type/method/field across all DEX entries in APK.
options:
-h, --help show this help message and exit
examples:
droidasc app.apk --gui
droidasc getclass app.apk Lcom/poc/Main; -o Main.java
droidasc getclass app.apk com.poc.Main --threads 16
droidasc listclass app.apk -o classes.txt
droidasc listclass app.apk --prefix com.poc
droidasc getmanifest app.apk -o AndroidManifest.xml
droidasc findrefs app.apk string token -o string_refs.txt
droidasc findrefs app.apk type com.poc.Main
droidasc findrefs app.apk method onCreate --class com.poc.Main
droidasc findrefs app.apk method notify --class MainActivity --fuzzy-class -o method_refs.txt
droidasc findrefs app.apk field apiKey -o field_refs.txt
listclass imprime descriptores de clase Dalvik en el orden de definición del APK/DEX, uno por
línea. Con -o, la salida se escribe en el archivo seleccionado en lugar de stdout.
--prefix com.poc filtra por Lcom/poc; un prefijo ya normalizado como
Lcom/poc se mantiene sin cambios.
También puedes usar python main.py como antes — delega al mismo punto de entrada.
| Patrocinador | Cantidad |
|---|---|
| HTTChina | 5000¥ |
| c01ns | 11.9¥ |
| gguowang AND cococount | 2¥ |
| Ylarod | 50.11¥ |
¡Gracias a todos los patrocinadores por su apoyo!
ASC está construido con la esperanza de que pueda ayudar genuinamente a todos a mejorar su flujo de trabajo de ingeniería inversa — desde acelerar las partes tediosas hasta hacer que lo imposible parezca rutinario.
Gracias al proyecto Androguard por proporcionar la base de ingeniería inversa de Android y análisis DEX utilizada por Droid ASC.