Análisis Técnico

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

Pablo Schaffner
7 min readUpdated Nov 17, 2025
#Seguridad#Ingeniería Inversa#Node.js#Titanium#APK#npm#Open Source
Ingeniería Inversa de APKs de Titanium: Recuperando Código Fuente Perdido
Código Perdido

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.

Investigación

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 compilados
  • classes.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?

Desarrollo

Construyendo la Cadena de Herramientas

Necesitaba herramientas propias. Ninguna solución existente hacía lo que yo necesitaba, así que construí tres paquetes npm.

1

APK_unpack - Extracción de Recursos

Problem

Las herramientas de APK existentes son de línea de comandos y poco prácticas para automatizar.

Solution

Construí un paquete Node.js que envuelve apktool con un puente a Java para extraer recursos en un solo paso.

Result

Primera app Node.js consumiendo clases Java directamente. Un problema de integración interesante.

Proceso de desempaquetado de APK mostrando recursos y estructura extraídos

APK_unpack en acción - extrayendo recursos, manifiesto y assets de una app Android compilada

2

ti_unpack - Extracción de Código Titanium (El Gran Avance)

Problem

¿Dónde guarda Titanium el código fuente JavaScript en los APKs compilados?

Solution

Descubrí que Titanium codifica el código fuente en el archivo AssetCryptImpl usando ofuscación, no cifrado real.

Result

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.

La Búsqueda:

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".

El Descubrimiento:

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.

Construyendo el Desempaquetador:

Creé una implementación en JavaScript/Node.js que:

  1. Localiza el archivo AssetCryptImpl en el APK
  2. Lee la estructura del bundle codificado
  3. Decodifica usando las claves embebidas
  4. 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.

El Momento:

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.

Código fuente JavaScript extraído de un APK de Titanium mostrado en la terminal

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.

3

ti_recover - Restauración de la Estructura del Proyecto

Problem

Tener el código en memoria no basta — los desarrolladores necesitan la estructura original del proyecto.

Solution

Construí una herramienta de recuperación que reconstruye la estructura correcta de un proyecto Titanium a partir del código extraído.

Result

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.

Node.jsJavaAppcelerator TitaniumAPK ToolsReverse Engineeringnpm
Aprendizajes

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.

Open Source

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 APK
  • ti_unpack - Extracción de código Titanium
  • ti_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.

Lecciones

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.

Para Ingenieros

Detalles Técnicos

Cómo empaqueta Titanium el JavaScript:

  1. Fase de compilación: JS → bindings nativos
  2. Fase de codificación: JS agrupado en AssetCryptImpl
  3. Fase de empaquetado: Todo comprimido en el APK

El proceso de recuperación:

  1. Descomprimir el APK → Acceder a la estructura interna
  2. Extraer AssetCryptImpl → Obtener el bundle codificado
  3. Decodificar el bundle → Recuperar el código fuente JavaScript
  4. Parsear la estructura → Reconstruir los archivos del proyecto
  5. 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.

Ética

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.

Technologies Used

Node.jsJavaAppcelerator TitaniumReverse EngineeringAPK Tools

Share this article

TweetShare