
Gallery Vault 덤프 복구 도구: 자동 탐색, 키 파생 및 자동 미디어 복원 기능 포함.
Gallery Vault (ThinkYeah) Android 애플리케이션으로 암호화된 자산을 복구하는 도구입니다.
의존성 설치:
pip install pycryptodome prompt_toolkit
Android 파일 시스템 덤프를 제공하기만 하면 Gallery Vault로 암호화된 모든 파일을 복구합니다.
대화형 TUI (권장):
python3 gv_tui.py
컨트롤: F5: 발견 및 복구 시작, Tab: 구성 필드 순환, F10: 종료.
배치 CLI:
python3 gv_decryptor.py /path/to/dump --out /path/to/output
--manual을 추가하면 저장소 발견을 건너뛰고 모든 파일을 재귀적으로 스캔합니다.
.jpg, .png, .mp4, …)Gallery Vault V2는 PIN으로 파일을 암호화하지 않습니다. PIN은 UI만 잠급니다. 실제 암호화는 파일별 XOR 암호이며, 그 키는 APK에 내장된 하드코딩된 DES 마스터 키로 보호됩니다. 즉, PIN 없이도 모든 기기 덤프에서 완전한 복구가 가능합니다.
각 암호화된 파일은 고정된 이진 구조를 따릅니다:
┌───────────────────────────────────────────────────────────────┐
│ ENCRYPTED FILE (.nomedia) │
├──────────────────┬────────────────────────────────────────────┤
│ Thumbnail │ Encrypted Payload │
│ Header │ (XOR-ciphered asset bytes) │
│ (variable) │ │
├──────────────────┴────────────────────────────────────────────┤
│ Inner Marker >>tyfs>> │
├───────────────────────────────────────────────────────────────┤
│ Tail Metadata │
│ ├─ Original file length (8 bytes) │
│ ├─ Thumbnail size (8 bytes) │
│ ├─ Check byte (1 byte) → selects decode mode │
│ └─ Encrypted XOR key (8 bytes) → DES-encrypted │
├───────────────────────────────────────────────────────────────┤
│ End Marker <<tyfs<< │
└───────────────────────────────────────────────────────────────┘
복구는 두 개의 연결된 DES 단계와 위치 인식 XOR 패스로 이루어집니다.
╔══════════════════════════════════════════════════════════════════╗
║ STAGE 1 — Master Key Derivation (same for every file) ║
╠══════════════════════════════════════════════════════════════════╣
║ ║
║ hardcoded string "good_gv" ║
║ │ ║
║ ▼ pad/truncate to 8 bytes ║
║ ┌─────────────┐ ║
║ │ DES-ECB │ ◄── hardcoded hex constant (128-bit) ║
║ │ decrypt │ ║
║ └──────┬──────┘ ║
║ ▼ ║
║ master_key_str (plaintext, embedded in APK) ║
║ ║
╠══════════════════════════════════════════════════════════════════╣
║ STAGE 2 — Per-file XOR Key Recovery (once per encrypted file) ║
╠══════════════════════════════════════════════════════════════════╣
║ ║
║ master_key_str[:8] ║
║ │ ║
║ ▼ ║
║ ┌─────────────┐ ║
║ │ DES-ECB │ ◄── encrypted_xor_key (8 bytes, from tail) ║
║ │ decrypt │ ║
║ └──────┬──────┘ ║
║ ▼ take first 4 bytes ║
║ xor_key [k0, k1, k2, k3] ║
║ ║
╠══════════════════════════════════════════════════════════════════╣
║ STAGE 3 — Payload Assembly + XOR Transform ║
╠══════════════════════════════════════════════════════════════════╣
║ ║
║ ┌───────────────────────────────────────┐ ║
║ │ check_byte (from tail) │ ║
║ └─────────────┬────────────────┬────────┘ ║
║ 0x00 │ 0x01 │ ║
║ ▼ ▼ ║
║ ┌─────────────────┐ ┌─────────────────────┐ ║
║ │ data[thumb_len │ │ swapped_block │ ║
║ │ : orig_len] │ │ (past >>tyfs>>) │ ║
║ │ (contiguous) │ │ + main_block │ ║
║ └────────┬────────┘ └────────────┬────────┘ ║
║ └────────────┬───────────┘ ║
║ ▼ ║
║ assembled payload ║
║ │ ║
║ ┌───────────────────┼───────────────────┐ ║
║ ▼ ▼ ▼ ║
║ byte[i] (i & 0xFF) xor_key[i % 4] ║
║ (ciphertext) (position salt) (rotating 4-byte ║
║ key from stage 2) ║
║ │ │ │ ║
║ └─────────► XOR ◄───┘ │ ║
║ │ │ ║
║ └──────────► XOR ◄────────┘ ║
║ ▼ ║
║ out[i] → Original Asset ║
║ ║
╚══════════════════════════════════════════════════════════════════╝
이 도구는 교육 및 법의학 목적으로만 제공됩니다. 작성자는 오용에 대한 책임을 지지 않습니다. 귀하의 소유가 아닌 데이터를 복호화하기 전에 항상 적절한 권한을 가지고 있는지 확인하십시오.