Python CLI utility for decrypting encrypted iTunes / Finder local iOS backups, extracting files, modifying backup contents, and writing encrypted data back into the original backup structure.
- Unlock encrypted iOS backups using the backup password
- Decrypt
Manifest.db - Enumerate backup entries
- Extract individual files
- Decrypt the entire backup into a workspace directory
- Modify extracted files and write them back encrypted
- Re-encrypt and commit
Manifest.db - Works directly with native iTunes / Finder backup format
Clone the repo, then run either launcher script for your platform. Each one creates a local .venv,
installs requirements.txt into it, and starts the app -- no manual setup needed:
./run_gui.sh # macOS / Linux, windowed interface
./run_cli.sh # macOS / Linux, CLIrun_gui.bat :: Windows, windowed interface
run_cli.bat :: Windows, CLIRe-running a launcher reuses the existing .venv; pip skips reinstalling anything already satisfied, so
subsequent runs start quickly.
To set up manually instead:
python -m venv .venv
.venv/bin/pip install -r requirements.txt # Windows: .venv\Scripts\pipA Qt-based windowed interface, styled after the classic iTunes/Finder library view, is available as an alternative to the CLI.
python ./src/gui.pyIt gives you:
- An iTunes-style backup picker showing detected backups with password entry
- A sidebar grouping files into Photos & Media, Messages, Contacts, App Domain/Plugins/Groups, and more, plus a per-domain list sorted so each app's domain, plugin, and group entries stay together
- A sortable, searchable file table with live filtering (List view)
- A Grid view with lazily-loaded photo/video thumbnails, decrypted on demand as you scroll -- handy for browsing Photos & Media without leaving the raw file table behind
- One-click "Decrypt All", "Extract Selected", and "Reveal in Explorer"
- An Advanced menu for write-back and Manifest.db commit
General syntax:
python ./src/main.py --backup <BACKUP_PATH> --password <PASSWORD> COMMANDrun_cli.sh / run_cli.bat forward all arguments to main.py, so the same call becomes:
./run_cli.sh --backup <BACKUP_PATH> --password <PASSWORD> COMMANDExample:
python ./src/main.py \
--backup ~/Library/Application\ Support/MobileSync/Backup/<DEVICE_ID> \
--password mypassword \
unlockVerify the password and decrypt Manifest.db.
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
unlockDecrypt all files from the backup into the workspace directory.
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
decryptDefault workspace:
~/ios_backup_working_directory
Custom workspace:
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
--workspace ./workspace \
decryptList entries stored in the backup.
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
listFilter by domain:
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
list --domain HomeDomainFilter by relative path:
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
list --filter smsExtract a single file using a fileID prefix or exact relative path.
By fileID:
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
extract 3d0d7e5fBy relative path:
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
extract Library/SMS/sms.dbExtract all files from one specidfied domain only:
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
extract-domain CameraRollDomainRe-encrypt a modified workspace file and write it back into the original backup.
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
write-back Library/SMS/sms.dbHow to edit a file algorythm:
- Extract file
- Modify/replace file inside workspace
- Run
write-back - Run
commit
Re-encrypt and replace Manifest.db inside the backup.
python ./src/main.py \
--backup <BACKUP_PATH> \
--password <PASSWORD> \
commit- The tool operates directly on backup files
- Always keep a separate untouched copy of the original backup.
- Some entries may not be regular files (
flags != 1) - Certain protected or unsupported entries may fail to decrypt
- Use rewriting ability of this project with caution
This project is provided for educational, research, interoperability, forensic, and personal backup analysis purposes only.
You are solely responsible for complying with all applicable laws and regulations in your jurisdiction.
Do not use this software on devices or backups that you do not own or have explicit authorization to analyze.