
An updated Frida iOS dump tool supporting the latest Frida 17.5.2 APIs
A modern iOS application memory decryption tool built for Frida 17.5.2+ with full support for iOS 14-16 and multiple jailbreaks.
Status: ✅ Working and Tested - Successfully dumps and decrypts iOS apps using Frida 17.5.2 on:
/cores/binpack/ jailbreak pathsThe original frida-ios-dump (last updated 2020) uses deprecated Frida APIs that don't work with Frida 17.5.2. This tool is built from scratch using modern Frida APIs and is specifically tested with the Taurine-compatible Frida patches.
paramiko (Python SSH library - installed automatically)iproxy (for USB connection via libimobiledevice)will add my patch repo)cd /Users/username/git/frida-ios-dump-modern
# Create virtual environment with uv:
uv venv
source .venv/bin/activate
# Install dependencies
uv pip install -r requirements.txt
# Make script executable
chmod +x dump.py
# Install libimobiledevice if needed
brew install libimobiledevice
# Start USB tunnel (in a separate terminal)
iproxy 2222 22
python dump.py -l
Important: The app must be running before dumping due to Taurine jailbreak restrictions.
# 1. Launch the app on your device manually
# 2. Run the dumper:
python dump.py com.example.app
# With custom SSH password:
python dump.py com.example.app -P your_password
# With custom output directory:
python dump.py com.example.app -o /path/to/output
# 1. Open Ventusky on your iOS device
# 2. Run:
python dump.py com.in-meteo.ventusky -P mypassword
/tmp on deviceWhy this works on iOS 16:
The tool creates:
Example output structure:
/tmp/Ventusky_decrypted/
├── Payload/
│ └── Ventusky.app/
│ ├── Ventusky (decrypted main binary)
│ ├── Frameworks/
│ │ └── *.framework (decrypted frameworks)
│ └── ... (other app resources)
└── Ventusky_decrypted.ipa
This tool is designed to work with the Taurine-patched Frida server that includes:
# Check frida-server is running on device:
ssh -p 2222 root@localhost "ps aux | grep frida-server"
# Restart frida-server if needed:
ssh -p 2222 root@localhost "killall frida-server; frida-server &"
# List apps to find correct bundle ID:
python dump.py -l
# Launch the app manually on your device first
# This is required due to Taurine jailbreak restrictions
# Test SSH connection:
ssh -p 2222 root@localhost
# If password prompt works, use -P flag:
python dump.py com.example.app -P your_password
If you're getting metadata errors on iOS 16 after patching:
Diagnose the issue:
# Run diagnostic on dumped binary
./diagnose_ios16.sh /tmp/AppName_decrypted/Payload/AppName.app/AppName
# Compare with working iOS 14 binary
./diagnose_ios16.sh /path/to/working/ios14/binary
Key things to check:
The tool now reads original file size from disk to avoid dumping runtime-expanded memory regions.
Good news: The tool now automatically sets cryptid=0 during dumping, so manual patching is no longer required!
iOS 16 Compatibility: The tool uses a hybrid approach:
This prevents "Is this a file manually extracted from the DYLD shared cache?" and "Objective-C Metadata looks mangled" errors on iOS 16.
Verify the dump:
# Check that cryptid is 0 (should be automatic now)
otool -l Payload/App.app/App | grep cryptid
# Should show: cryptid 0
# Check file has all segments
otool -l Payload/App.app/App | grep "segname __"
# Should show: __TEXT, __DATA_CONST, __DATA, __LINKEDIT
# Open in Hopper - should work without warnings!
Manual patching (legacy - no longer needed):
If for some reason the automatic cryptid patching didn't work:
# Check if patching needed
otool -l Payload/App.app/App | grep cryptid
# If shows cryptid 1, run:
python patch_cryptid.py Payload/App.app/App
mv Payload/App.app/App.patched Payload/App.app/App
Expected result:
Technical Details - iOS 16 Chained Fixups:
This tool uses modern Frida 17.5.2 APIs:
If you find this tool useful or need further updates consider supporting the project Boba needs:
MIT License - Free for security research and educational purposes.
This tool is intended for:
| Old API (Deprecated) | New API (Modern) | Notes |
|---|
Module.ensureInitialized() | Not needed | ObjC auto-initialized |
Module.findExportByName(null, 'name') | Module.findGlobalExportByName('name') | Global exports |
Process.getModuleByName() | Process.findModuleByName() | Returns null if not found |
| Manual POSIX file I/O | new File(path, 'wb') | Built-in File API |
Memory.writeByteArray() | file.write(arrayBuffer) | Direct binary write |