Ingeniería Inversa de APKs de Titanium: Recuperando Código Fuente Perdido
Construí tres paquetes npm para extraer el código JavaScript de apps Android compiladas

El Problema
Un cliente potencial me contactó con un escenario de desastre bastante común: tenía una app Android en producción construida por un desarrollador freelance, pero sin código fuente. El desarrollador ya no estaba. La app necesitaba actualizaciones.
Su pregunta: ¿Puedes recuperar el código fuente desde el APK?
Mi respuesta: Déjame averiguarlo.
La app estaba construida con Appcelerator Titanium — un framework que conocía bien, ya que en ese momento estaba construyendo compiladores que generaban código para Titanium. Esto ya no era solo el problema de un cliente: era un desafío técnico que quería resolver.
Entendiendo la Estructura del APK
Los APKs son básicamente archivos ZIP con una estructura específica. Cualquier desarrollador Android sabe que se pueden desempaquetar con las herramientas adecuadas.
Contenido estándar de un APK:
resources.arsc- Recursos compiladosclasses.dex- Bytecode de Dalvik (clases Java)AndroidManifest.xml- Manifiesto binario- Carpeta de assets - Imágenes, sonidos, fuentes, layouts
Herramientas estándar de ingeniería inversa:
- apktool - Extrae assets y descifra manifiestos
- dex2jar - Convierte DEX a formato JAR
- JD/JADx - Decompila clases Java de vuelta a código fuente
Pero las apps de Titanium son distintas. Se promocionan como "JavaScript compilado a nativo" — lo que significa que el código JS no está en la carpeta de recursos como en las apps de Ionic.
La pregunta: ¿Dónde esconde Titanium el código fuente?
Construyendo la Cadena de Herramientas
Necesitaba herramientas propias. Ninguna solución existente hacía lo que yo necesitaba, así que construí tres paquetes npm.
APK_unpack - Extracción de Recursos
Las herramientas de APK existentes son de línea de comandos y poco prácticas para automatizar.
Construí un paquete Node.js que envuelve apktool con un puente a Java para extraer recursos en un solo paso.
Primera app Node.js consumiendo clases Java directamente. Un problema de integración interesante.

APK_unpack en acción - extrayendo recursos, manifiesto y assets de una app Android compilada
ti_unpack - Extracción de Código Titanium (El Gran Avance)
¿Dónde guarda Titanium el código fuente JavaScript en los APKs compilados?
Descubrí que Titanium codifica el código fuente en el archivo AssetCryptImpl usando ofuscación, no cifrado real.
Extraje con éxito todo el código fuente de la aplicación desde APKs de producción.
Titanium se promociona como "JavaScript compilado a nativo", así que no fue sorpresa que los archivos JS no estuvieran en la carpeta de recursos como en las apps de Ionic. En los APKs en modo desarrollador, el código está ahí — pero ¿en los builds de producción? Escondido.
Necesitaba encontrar dónde escondía Titanium el JavaScript. Empecé a buscar en Google variaciones de "titanium apk structure", "titanium source code location", "titanium encryption".
Encontré una presentación en SlideShare titulada "Help Doctor, My Application is an Onion" que explicaba la estructura de empaquetado de Titanium. El código fuente JavaScript vive en un archivo llamado AssetCryptImpl en el directorio principal del paquete.
La presentación describía el formato y cómo decodificarlo. Perfecto — ahora solo necesitaba implementarlo.
Creé una implementación en JavaScript/Node.js que:
- Localiza el archivo AssetCryptImpl en el APK
- Lee la estructura del bundle codificado
- Decodifica usando las claves embebidas
- Extrae todos los archivos JavaScript en memoria
El "cifrado" es en realidad ofuscación — la clave para decodificar tiene que estar en la propia app para que pueda ejecutarse. Esta es una limitación fundamental del cifrado del lado del cliente.
Ejecuté el desempaquetador sobre el APK del cliente. Funcionó. Todo el código fuente de la aplicación — controladores, vistas, modelos, utilidades — extraído, legible y recuperable.

Recuperado con éxito - todo el código fuente de la app Titanium extraído y visible en memoria
Esto fue emocionante y aterrador a la vez. Yo había publicado decenas de apps Titanium en las tiendas de aplicaciones. Ahora sabía exactamente qué tan recuperables eran.
ti_recover - Restauración de la Estructura del Proyecto
Tener el código en memoria no basta — los desarrolladores necesitan la estructura original del proyecto.
Construí una herramienta de recuperación que reconstruye la estructura correcta de un proyecto Titanium a partir del código extraído.
Un proyecto Titanium completo y funcional, listo para desarrollar. Distintas versiones de Titanium minifican el código de forma diferente, así que tuve que revertir eso.
Lo Que Aprendí
Sobre la seguridad del código: Esto me asustó. Yo había publicado decenas de apps Titanium en las tiendas. Ahora sabía exactamente qué tan recuperables eran.
Sobre ofuscación vs. cifrado: Los assets "cifrados" de Titanium en realidad solo están ofuscados. Con las herramientas correctas y entendiendo el formato, la recuperación es directa.
Sobre proteger la propiedad intelectual: Si la protección del código fuente es crítica, compilar a bytecode nativo no basta. Se necesita cifrado real o lógica del lado del servidor.
Sobre la transparencia de los frameworks: Titanium es un gran producto — esto no es una crítica. Pero los desarrolladores deberían entender cómo su framework realmente empaqueta y protege (o no protege) su código.
El lado positivo: A veces necesitas recuperar código fuente. Contratistas que se van, discos corruptos, backups faltantes — pasa. Ahora sé que la recuperación es posible.
Impacto
Quiénes se benefician:
- Desarrolladores que perdieron código fuente de Titanium
- Investigadores de seguridad que analizan apps Titanium
- Empresas con necesidades de recuperar código de contratistas
- Cualquiera con curiosidad por las entrañas de Titanium
Paquetes publicados:
apk_unpack- Extracción general de recursos de APKti_unpack- Extracción de código Titaniumti_recover- Restauración completa del proyecto
Uso en el mundo real: He visto este problema varias veces en Quora y Stack Overflow. Estas herramientas resuelven una necesidad real en la comunidad de Titanium.
La Conclusión
Sobre ingeniería inversa: La mayoría de los frameworks móviles se pueden revertir con suficiente comprensión de su arquitectura. "Compilado a nativo" muchas veces significa "compilado a algo que se puede decompilar".
Sobre construir herramientas: Cuando te topas con un problema que las herramientas existentes no resuelven, construye la herramienta. Necesitaba esto para un solo cliente — terminé creando valor para toda la comunidad de Titanium.
Sobre la propiedad del código: Siempre mantén control de versiones. Siempre ten backups. Siempre asegúrate de que los contratistas entreguen el código fuente. Pero si lo pierdes — la recuperación todavía podría ser posible.
Detalles Técnicos
Cómo empaqueta Titanium el JavaScript:
- Fase de compilación: JS → bindings nativos
- Fase de codificación: JS agrupado en
AssetCryptImpl - Fase de empaquetado: Todo comprimido en el APK
El proceso de recuperación:
- Descomprimir el APK → Acceder a la estructura interna
- Extraer AssetCryptImpl → Obtener el bundle codificado
- Decodificar el bundle → Recuperar el código fuente JavaScript
- Parsear la estructura → Reconstruir los archivos del proyecto
- Restaurar el proyecto → App Titanium funcional
Insight clave: La codificación es reversible porque la clave para decodificar tiene que estar embebida en la propia app (de lo contrario la app no podría ejecutarse). Esta es una limitación fundamental del "cifrado" del lado del cliente.
Usa Este Conocimiento con Responsabilidad
Estas herramientas existen para fines legítimos de recuperación:
- Recuperar tu propio código fuente perdido
- Investigación y auditoría de seguridad
- Comprensión educativa de las entrañas de un framework
No para:
- Robar la propiedad intelectual de otros
- Hacer ingeniería inversa para clonar apps
- Violar licencias de software
Un gran poder conlleva una gran responsabilidad. Construí estas herramientas para ayudar a desarrolladores con una necesidad genuina — no para habilitar el robo.
¿Construyendo sistemas similares o necesitas experiencia en recuperación de código? Hablemos.