
Herramienta de recuperación de volcados de Gallery Vault con descubrimiento automatizado, derivación de claves y restauración automática de medios.
Herramienta de recuperación para archivos cifrados por la aplicación Android Gallery Vault (ThinkYeah).
Instalar dependencias:
pip install pycryptodome prompt_toolkit
Simplemente proporcione un volcado del sistema de archivos de Android y recuperará todos los archivos cifrados de Gallery Vault.
TUI interactivo (recomendado):
python3 gv_tui.py
Controles: F5 para iniciar descubrimiento y recuperación, Tab para cambiar entre campos de configuración, F10 para salir.
CLI por lotes:
python3 gv_decryptor.py /path/to/dump --out /path/to/output
Añada --manual para omitir el descubrimiento del repositorio y escanear todos los archivos de forma recursiva.
.jpg, .png, .mp4, …)Gallery Vault V2 no cifra los archivos con su PIN. El PIN solo bloquea la interfaz de usuario. El cifrado real es un cifrado XOR por archivo cuya clave está protegida por una clave maestra DES hardcodeada incluida en el APK. Esto significa que la recuperación completa es posible en cualquier volcado de dispositivo, sin necesidad de PIN.
Cada archivo cifrado sigue una estructura binaria fija:
┌───────────────────────────────────────────────────────────────┐
│ ARCHIVO CIFRADO (.nomedia) │
├──────────────────┬────────────────────────────────────────────┤
│ Cabecera de │ Carga útil cifrada │
│ miniatura │ (bytes del activo cifrados con XOR) │
│ (variable) │ │
├──────────────────┴────────────────────────────────────────────┤
│ Marcador interno >>tyfs>> │
├───────────────────────────────────────────────────────────────┤
│ Metadatos Finales │
│ ├─ Longitud original del archivo (8 bytes) │
│ ├─ Tamaño de miniatura (8 bytes) │
│ ├─ Byte de verificación (1 byte) → selecciona modo de descifrado │
│ └─ Clave XOR cifrada (8 bytes) → cifrada con DES │
├───────────────────────────────────────────────────────────────┤
│ Marcador final <<tyfs<< │
└───────────────────────────────────────────────────────────────┘
La recuperación ocurre en dos etapas DES encadenadas, seguidas de un paso XOR con conciencia de posición.
╔══════════════════════════════════════════════════════════════════╗
║ ETAPA 1 — Derivación de Clave Maestra (igual para cada archivo) ║
╠══════════════════════════════════════════════════════════════════╣
║ ║
║ cadena hardcodeada "good_gv" ║
║ │ ║
║ ▼ rellenar/truncar a 8 bytes ║
║ ┌─────────────┐ ║
║ │ DES-ECB │ ◄── constante hex hardcodeada (128 bits) ║
║ │ descifrar │ ║
║ └──────┬──────┘ ║
║ ▼ ║
║ master_key_str (texto plano, incrustado en el APK) ║
║ ║
╠══════════════════════════════════════════════════════════════════╣
║ ETAPA 2 — Recuperación de Clave XOR por Archivo (una vez por archivo cifrado) ║
╠══════════════════════════════════════════════════════════════════╣
║ ║
║ master_key_str[:8] ║
║ │ ║
║ ▼ ║
║ ┌─────────────┐ ║
║ │ DES-ECB │ ◄── encrypted_xor_key (8 bytes, desde los metadatos finales) ║
║ │ descifrar │ ║
║ └──────┬──────┘ ║
║ ▼ tomar primeros 4 bytes ║
║ xor_key [k0, k1, k2, k3] ║
║ ║
╠══════════════════════════════════════════════════════════════════╣
║ ETAPA 3 — Ensamblaje de Carga Útil + Transformación XOR ║
╠══════════════════════════════════════════════════════════════════╣
║ ║
║ ┌───────────────────────────────────────┐ ║
║ │ byte de verificación (desde metadatos finales) │ ║
║ └─────────────┬────────────────┬────────┘ ║
║ 0x00 │ 0x01 │ ║
║ ▼ ▼ ║
║ ┌─────────────────┐ ┌─────────────────────┐ ║
║ │ datos[thumb_len │ │ bloque_intercambiado│ ║
║ │ : orig_len] │ │ (después de >>tyfs>>)│ ║
║ │ (contiguo) │ │ + bloque_principal │ ║
║ └────────┬────────┘ └────────────┬────────┘ ║
║ └────────────┬───────────┘ ║
║ ▼ ║
║ carga útil ensamblada ║
║ │ ║
║ ┌───────────────────┼───────────────────┐ ║
║ ▼ ▼ ▼ ║
║ byte[i] (i & 0xFF) xor_key[i % 4] ║
║ (texto cifrado) (sal de posición) (clave rotatoria ║
║ de 4 bytes ║
║ desde etapa 2) ║
║ │ │ │ ║
║ └─────────► XOR ◄───┘ │ ║
║ │ │ ║
║ └──────────► XOR ◄────────┘ ║
║ ▼ ║
║ out[i] → Activo Original ║
║ ║
╚══════════════════════════════════════════════════════════════════╝
Esta herramienta se proporciona únicamente con fines educativos y forenses. El autor no se hace responsable de su mal uso. Asegúrese siempre de tener la autorización adecuada antes de descifrar datos que no le pertenecen.