From 04512877e94cac075acd53dfbcfc4a78347156c3 Mon Sep 17 00:00:00 2001 From: najeeb Date: Sat, 9 May 2026 01:38:26 +0500 Subject: [PATCH 1/4] feat: Add graphical user interface (GUI) edition with selective decryption --- .gitignore | 30 ++ CHANGELOG.md | 76 ++++ README.md | 354 ++++++++++++--- kobackupdec.py | 0 kobackupdec_gui.py | 954 +++++++++++++++++++++++++++++++++++++++ screenshots/gui_main.png | Bin 0 -> 85265 bytes 6 files changed, 1353 insertions(+), 61 deletions(-) create mode 100644 .gitignore create mode 100644 CHANGELOG.md mode change 100755 => 100644 kobackupdec.py create mode 100644 kobackupdec_gui.py create mode 100644 screenshots/gui_main.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f00c7b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +dist/ +build/ +*.egg-info/ +*.egg + +# Virtual environments +venv/ +env/ +.venv/ + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS files +.DS_Store +Thumbs.db +desktop.ini + +# Logs +*.log diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9f612c7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,76 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [GUI Edition] — 2026-05-08 + +### Added +- **Full GUI application** (`kobackupdec_gui.py`) with modern dark theme +- **Password verification** — validates password against backup before decryption starts +- **Selective folder decryption** — scan backup and choose specific folders (pictures, video, audios, etc.) +- **Pause / Resume** button to temporarily halt decryption +- **Stop** button to cancel decryption mid-process +- **Real-time log output** with color-coded levels (INFO=green, WARNING=yellow, ERROR=red, DEBUG=gray) +- **Responsive layout** — resizes from 600×500 to fullscreen with auto-reflowing folder checkboxes +- **Progress status** — shows current phase and folder being processed +- **Browse dialogs** for backup and destination folders +- **Show/hide password** toggle +- **Select All / Deselect All** for folder selection +- **Auto-scan** — folder list auto-populates when backup path is set + +### Unchanged +- Core decryption engine (`kobackupdec.py`) — no modifications to original code +- CLI interface — fully preserved and backward-compatible + +--- + +## [20200705] — 2020-07-05 + +### Fixed +- `decrypt_large_package` now correctly reads input in chunks + +## [20200611] — 2020-06-11 + +### Added +- `--expandtar` option to control automatic TAR expansion +- `--writable` option to skip setting read-only permissions on decrypted files +- Large TAR files are managed in chunks but not expanded + +## [20200607] — 2020-06-07 + +### Fixed +- Merged empty `CheckMsg` handling +- Updated `folder_to_media_type` mapping (by @realSnoopy) + +## [20200406] — 2020-04-06 + +### Fixed +- Merged file and folder permissions fix (by @lp4n6) + +## [20200405] — 2020-04-05 + +### Added +- Python minor version check with informative note (thanks @lp4n6) + +## [2020test] — 2020 + +### Changed +- Complete rewrite to handle v9 and v10 KoBackup structures + +## [20200107] — 2020-01-07 + +### Fixed +- Merged pull by @lp4n6, fixed current version handling + +## [20191113] — 2019-11-13 + +### Fixed +- Double folder creation error + +## [20190729] — 2019-07-29 + +### Added +- First public release +- Huawei KoBackup / HiSuite backup decryption +- Automatic output folder restructuring to mimic Android filesystem +- Support for APK, DB, TAR, and media file decryption diff --git a/README.md b/README.md index 2388cac..f7092d4 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,158 @@ -# kobackupdec -Huawei backup decryptor +

+

🔐 KoBackup Decryptor

+

+ Decrypt Huawei HiSuite & KoBackup encrypted backups
+ CLI + Modern GUI • Selective Folder Decryption • Password Verification +

+

+ Python 3.7+ + MIT License + Version +

+

-_This script is introduced by the blog post at https://blog.digital-forensics.it/2019/07/huawei-backup-decryptor.html._ +--- -The `kobackupdec` is a Python3 script aimed to decrypt Huawei *HiSuite* or *KoBackup* (the Android app) backups. When decrypting and uncompressing the archives, it will re-organize the output folders structure trying to _mimic_ the typical Android one. The script will work both on Windows and Linux hosts, provided the PyCryptoDome dependency. Starting from **20100107** the script was rewritten to handle v9 and v10 kobackup backups structures. +

+ KoBackup Decryptor GUI +
+ Modern dark-themed GUI with selective folder decryption, pause/stop controls, and real-time log output +

-## _EOL_ +--- -On 1.1.2021 the script will get its _end of life_ status. It was needed two years ago to overcome issues for some Huawei devices' forensics acquisitions. Now commercial forensics solutions include the very same capabilities, and much more: there are no more reasons to maintain it. We've got messages from guys using this script to manage theirs backups: we do not recommend it, and we did not write it for this reason. Anyhow we're happy some of you did find it useful, and we thank you for the feedback. We shared it to the community, trying to give back something: if someone has any interest in maintaining it, please let us know so we can include a link to the project. +## 📖 Overview -## Usage +**KoBackup Decryptor** (`kobackupdec`) is a Python 3 tool for decrypting Huawei *HiSuite* and *KoBackup* (Android app) encrypted backups. It supports both **v9** and **v10** backup structures. -The script *assumes* that backups are encrypted with a user-provided password. Actually it does not support the HiSuite _self_ generated password, when the user does not provide its own. +When decrypting, it automatically: +- Reorganizes the output folder structure to mimic a typical Android filesystem +- Extracts and expands TAR archives (optional) +- Handles large files in chunks for memory efficiency + +### ✨ What's New — GUI Edition + +This fork adds a **full-featured graphical interface** built with tkinter, bringing the power of `kobackupdec` to users who prefer a visual workflow. + +| Feature | CLI | GUI | +|---|:---:|:---:| +| Decrypt full backups | ✅ | ✅ | +| Password verification before decrypt | — | ✅ | +| **Selective folder decryption** | — | ✅ | +| Pause / Resume / Stop controls | — | ✅ | +| Real-time color-coded log output | — | ✅ | +| Progress tracking with status updates | — | ✅ | +| Responsive dark-themed interface | — | ✅ | + +--- + +## 🚀 Installation + +### Prerequisites + +- **Python 3.7** or later +- **pip** (Python package manager) + +### Steps + +```bash +# 1. Clone the repository +git clone https://github.com/YOUR_USERNAME/kobackupdec.git +cd kobackupdec + +# 2. Install dependencies +pip install -r requirements.txt +``` + +### Dependencies + +| Package | Purpose | +|---|---| +| `pycryptodome` | AES / PBKDF2 / HMAC cryptographic operations | +| `tkinter` | GUI framework (bundled with Python on most platforms) | + +> **Note:** On some Linux distributions, tkinter may need to be installed separately: +> ```bash +> # Ubuntu / Debian +> sudo apt-get install python3-tk +> +> # Fedora +> sudo dnf install python3-tkinter +> ``` + +--- + +## 🖥️ Usage + +### GUI Mode (Recommended) + +Launch the graphical interface: + +```bash +python kobackupdec_gui.py +``` + +#### GUI Workflow + +1. **Enter Password** — Type your backup password (toggle visibility with 👁) +2. **Select Backup Folder** — Browse to the Huawei backup directory +3. **Select Destination** — Choose where to save decrypted files (pick a parent, name the output folder) +4. **Configure Options** — Toggle TAR expansion, writable permissions, and log verbosity +5. **Select Folders** — After setting the backup path, click **🔍 Scan** or it auto-scans to show available folders. Check/uncheck individual folders (pictures, video, audios, etc.) +6. **Start Decryption** — Click **🔓 Start Decryption** + +#### GUI Controls + +| Button | Function | +|---|---| +| 🔓 **Start Decryption** | Verifies password first, then begins decryption | +| ⏸ **Pause / ▶ Resume** | Temporarily halt and resume the process | +| ⏹ **Stop** | Cancel the decryption (partially decrypted files are kept) | +| **Select All / Deselect All** | Quickly toggle all folder checkboxes | +| **🔍 Scan** | Re-scan backup directory for available folders | +| **Clear Log** | Clear the log output panel | + +#### GUI Features + +- **🔑 Password Verification** — Validates the password against `info.xml` before starting decryption. Wrong passwords are caught instantly. +- **📂 Selective Folder Decryption** — Only decrypt what you need (e.g., just pictures and contacts, skip video and apps). +- **📊 Real-Time Progress** — Status bar shows current phase and folder being processed. +- **🎨 Dark Theme** — Modern, responsive dark interface with color-coded log levels (green=info, yellow=warning, red=error). +- **📐 Responsive Layout** — Resizes gracefully from 600×500 to fullscreen. Folder checkboxes reflow automatically. + +--- + +### CLI Mode + +For scripting and automation, the original command-line interface is fully preserved: ``` -usage: kobackupdec.py [-h] [-v] password backup_path dest_path +usage: kobackupdec.py [-h] [-e] [-w] [-v] password backup_path dest_path -Huawei KoBackup decryptor version 20200611 +Huawei KoBackup decryptor version 20200705 positional arguments: - password user password for the backup - backup_path backup folder - dest_path decrypted backup folder + password user password for the backup + backup_path backup folder + dest_path decrypted backup folder optional arguments: -h, --help show this help message and exit -e, --expandtar expand tar files - -w, --writable do not set RO pemission on decrypted data + -w, --writable do not set RO permission on decrypted data -v, --verbose verbose level, -v to -vvv ``` -- `password`, is the user provided password. -- `backup_path`, is the folder containing the Huawei backup, relative or absolute paths can be used. -- `dest_path`, is the folder to be created in the specified path, absolute or relative. It will complain if the provided folder already exists. -- `[-v]` (from `-v` to `-vvv`) verbosity level, written on *stderr*. It's suggested to use *-vvv* with a redirect to get a log of the process. +#### CLI Example -### Example +```bash +python kobackupdec.py -vvv 123456 "Z:\HUAWEI P30 Pro_2019-06-28 22.56.31" Z:\HiSuiteBackup +``` + +
+📋 Click to see example output ``` -Z:\> py -3 kobackupdec.py -vvv 123456 "Z:\HUAWEI P30 Pro_2019-06-28 22.56.31" Z:\HiSuiteBackup INFO:root:getting files and folder from Z:\HUAWEI P30 Pro_2019-06-28 22.56.31 INFO:root:parsing XML files... INFO:root:parsing xml audio.xml @@ -51,8 +165,6 @@ DEBUG:root:ignoring entry BackupFilePhoneInfo DEBUG:root:ignoring entry BackupFileVersionInfo INFO:root:parsing xml picture.xml DEBUG:root:parsing xml file picture.xml -INFO:root:parsing xml soundrecorder.xml -DEBUG:root:parsing xml file soundrecorder.xml INFO:root:parsing xml video.xml DEBUG:root:parsing xml file video.xml DEBUG:root:crypto_init: using version 3. @@ -60,45 +172,165 @@ DEBUG:root:SHA256(BKEY)[16] = b'8d969eef6ecad3c29a3a629280e686cf' ... ``` -The **output** folder structure will be similar to the following one: *data/data* applications will be exploded in their proper paths, and the APKs will be *restored* too (not icons, actually). Note that the **db** folder will contain the *special* databases as created by the Huawei backups. +
+ +--- + +## 📁 Output Structure + +The decrypted output folder mimics a standard Android filesystem: ``` -HiSuiteBackup -|-- data -| |-- app -| | |-- de.sec.mobile.apk-1 -| | | [...] -| | `-- org.telegram.messenger.apk-1 -| `-- data -| |-- de.sec.mobile -| | [...] -| `-- org.telegram.messenger -|-- db -| |-- HWlanucher.db -| |-- Memo.db -| |-- alarm.db -| |-- calendar.db -| |-- calllog.db -| |-- camera.db -| |-- clock.db -| |-- contact.db -| |-- harassment.db -| |-- phoneManager.db -| |-- setting.db -| |-- sms.db -| |-- soundrecorder.db -| |-- systemUI.db -| |-- weather.db -| `-- wifiConfig.db -`-- storage - |-- DCIM - |-- Download - |-- Huawei - |-- MagazineUnlock - |-- Notifications - |-- Pictures - |-- WhatsApp - |-- mp3 - |-- parallel_intl - `-- s8-wallpapers-9011.PNG +DecryptedBackup/ +├── data/ +│ ├── app/ # APK files +│ │ ├── com.example.app.apk-1/ +│ │ └── org.telegram.messenger.apk-1/ +│ └── data/ # App data (TAR contents) +│ ├── com.example.app/ +│ └── org.telegram.messenger/ +├── db/ # System databases +│ ├── calendar.db +│ ├── calllog.db +│ ├── contact.db +│ ├── sms.db +│ └── ... +├── storage/ # Media files +│ ├── DCIM/ +│ ├── Download/ +│ ├── Pictures/ +│ ├── WhatsApp/ +│ └── ... +└── unknown/ # Unrecognized files (copied as-is) ``` + +--- + +## 📋 Requirements + +| Requirement | Minimum Version | +|---|---| +| Python | 3.7 | +| pycryptodome | Any recent | +| Operating System | Windows, Linux, macOS | + +--- + +## ⚙️ Building Executables + +You can compile the scripts into standalone executables using **cx_Freeze**: + +```bash +# Build executable +python setup.py build + +# Build Windows MSI installer +python setup.py bdist_msi +``` + +--- + +## 🗂️ Project Structure + +``` +kobackupdec/ +├── kobackupdec.py # Core decryption engine (CLI) +├── kobackupdec_gui.py # GUI application (tkinter) +├── requirements.txt # Python dependencies +├── setup.py # cx_Freeze build config +├── LICENSE # MIT License +├── README.md # This file +├── CHANGELOG.md # Version history +└── .github/ + └── ISSUE_TEMPLATE/ # GitHub issue templates +``` + +--- + +## 📝 Changelog + +See [CHANGELOG.md](CHANGELOG.md) for the full version history. + +### Highlights + +- **GUI Edition** — Full graphical interface with selective decryption, pause/stop, and password verification +- **20200705** — Fixed `decrypt_large_package` to read input chunks +- **20200611** — Added `expandtar` and `writable` options +- **20200607** — Merged empty CheckMsg handling +- **2020test** — Rewritten for v9 and v10 backups +- **20190729** — First public release + +--- + +## ❓ FAQ + +
+What backup formats are supported? + +Both **v9** and **v10** Huawei KoBackup / HiSuite backup structures. The tool looks for `info.xml` either at the root or inside `backupFiles1/`. +
+ +
+Does it support HiSuite auto-generated passwords? + +No. The tool only supports backups encrypted with a **user-provided password**. HiSuite's self-generated password is not supported. +
+ +
+I get "No module named 'Crypto'" error + +Install `pycryptodome`: +```bash +pip install pycryptodome +``` +If you have both `pycrypto` and `pycryptodome`, uninstall the old one first: +```bash +pip uninstall pycrypto +pip install pycryptodome +``` +
+ +
+I get "Wrong password" — is my password incorrect? + +The tool validates your password against the backup's `checkMsg` field. If the password is wrong, decryption will not proceed. Double-check the password you used when creating the backup in HiSuite/KoBackup. +
+ +
+Can I decrypt only specific folders (e.g., just photos)? + +**Yes!** In GUI mode, after selecting the backup folder, click **🔍 Scan** to list all available folders. Then uncheck everything you don't need and only the selected folders will be decrypted. +
+ +
+Does the GUI modify the original backup files? + +No. The original backup is only read, never modified. Decrypted files are written to the destination folder you specify. +
+ +--- + +## 🤝 Contributing + +Contributions are welcome! Please: + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/my-feature`) +3. Commit your changes (`git commit -m "Add my feature"`) +4. Push to the branch (`git push origin feature/my-feature`) +5. Open a Pull Request + +--- + +## 📄 License + +This project is licensed under the **MIT License** — see the [LICENSE](LICENSE) file for details. + +**Original Author:** Francesco "dfirfpi" Picasso, Reality Net System Solutions +**GUI Extension:** Community contribution + +--- + +## ⚠️ Disclaimer + +This tool is intended for **legitimate use only** — decrypting your own backups or backups you are authorized to access. The authors are not responsible for any misuse. diff --git a/kobackupdec.py b/kobackupdec.py old mode 100755 new mode 100644 diff --git a/kobackupdec_gui.py b/kobackupdec_gui.py new file mode 100644 index 0000000..3be4cd6 --- /dev/null +++ b/kobackupdec_gui.py @@ -0,0 +1,954 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +""" +Huawei KoBackup Decryptor — GUI Application +A modern, dark-themed graphical interface for kobackupdec.py + +Requires: tkinter (bundled with Python), pycryptodome +""" + +import logging +import os +import pathlib +import sys +import threading +import tkinter as tk +from tkinter import filedialog, messagebox, simpledialog, ttk +import queue +import time + +# --------------------------------------------------------------------------- +# Logging handler that forwards records into a thread-safe queue +# --------------------------------------------------------------------------- + +class QueueHandler(logging.Handler): + """Sends log records to a queue for consumption by the GUI thread.""" + + def __init__(self, log_queue: queue.Queue): + super().__init__() + self.log_queue = log_queue + + def emit(self, record): + self.log_queue.put(self.format(record)) + + +# --------------------------------------------------------------------------- +# Main GUI Application +# --------------------------------------------------------------------------- + +class KoBackupDecGUI(tk.Tk): + """Tkinter-based GUI for the Huawei KoBackup decryptor.""" + + # -- Colour palette (dark mode) ---------------------------------------- + BG = "#0f1117" + BG_CARD = "#181b24" + BG_INPUT = "#1e2230" + BG_HOVER = "#252a3a" + FG = "#e4e6ed" + FG_DIM = "#8b8fa3" + ACCENT = "#6c63ff" + ACCENT_HOVER = "#8a82ff" + ACCENT_DARK = "#4e47b8" + SUCCESS = "#34d399" + WARNING = "#fbbf24" + ERROR = "#f87171" + BORDER = "#2a2e3d" + LOG_BG = "#12141c" + + FONT_FAMILY = "Segoe UI" + FONT_TITLE = ("Segoe UI", 22, "bold") + FONT_SUB = ("Segoe UI", 11) + FONT_LABEL = ("Segoe UI", 10, "bold") + FONT_INPUT = ("Segoe UI", 10) + FONT_BTN = ("Segoe UI", 11, "bold") + FONT_LOG = ("Consolas", 9) + FONT_STATUS = ("Segoe UI", 10) + + def __init__(self): + super().__init__() + + self.title("KoBackup Decryptor") + self.configure(bg=self.BG) + self.minsize(600, 500) + self.geometry("900x820") + + # Center on screen + self.update_idletasks() + w, h = 900, 820 + x = (self.winfo_screenwidth() - w) // 2 + y = (self.winfo_screenheight() - h) // 2 + self.geometry(f"{w}x{h}+{x}+{y}") + + # Application icon — set title-bar colour on Windows + try: + self.iconbitmap(default="") + except Exception: + pass + + # State + self._running = False + self._log_queue: queue.Queue = queue.Queue() + self._stop_event = threading.Event() + self._pause_event = threading.Event() + self._pause_event.set() # not paused initially + self._worker_thread = None + self._folder_vars = {} # {name: BooleanVar} for folder selection + + # ---------- configure ttk styles ----------- + self._setup_styles() + + # ---------- build widgets ------------------ + # Scrollable main container so content never gets clipped + self._build_main_container() + + self._build_header() + self._build_form() + self._build_options() + self._build_folder_selector() + self._build_action() + self._build_log() + self._build_status_bar() + + # Bind resize to reflow folder checkboxes + self.bind("", self._on_resize) + + # Start polling the log queue + self._poll_log_queue() + + # ----------------------------------------------------------------- + # Style helpers + # ----------------------------------------------------------------- + + def _setup_styles(self): + style = ttk.Style(self) + style.theme_use("clam") + + style.configure("Card.TFrame", background=self.BG_CARD) + style.configure("Dark.TFrame", background=self.BG) + + style.configure("TCheckbutton", + background=self.BG_CARD, + foreground=self.FG, + font=self.FONT_INPUT, + focuscolor=self.BG_CARD) + style.map("TCheckbutton", + background=[("active", self.BG_CARD)], + foreground=[("active", self.ACCENT)]) + + style.configure("Horizontal.TProgressbar", + troughcolor=self.BG_INPUT, + background=self.ACCENT, + thickness=6, + borderwidth=0) + + def _make_rounded_frame(self, parent, expandable=False, **kw): + """Simulated rounded card using a Frame + padding. + Set expandable=True for sections that should grow (like the log). + """ + outer = tk.Frame(parent, bg=self.BG, padx=0, pady=6) + inner = tk.Frame(outer, bg=self.BG_CARD, highlightbackground=self.BORDER, + highlightthickness=1, padx=20, pady=16, **kw) + if expandable: + inner.pack(fill="both", expand=True) + else: + inner.pack(fill="x") + return outer, inner + + def _build_main_container(self): + """Create a vertically-scrollable container for all widgets.""" + # Status bar is packed at bottom of self, everything else in _main + self._main = tk.Frame(self, bg=self.BG) + self._main.pack(fill="both", expand=True) + + # ----------------------------------------------------------------- + # Build UI sections + # ----------------------------------------------------------------- + + def _build_header(self): + hdr = tk.Frame(self._main, bg=self.BG, pady=10) + hdr.pack(fill="x", padx=30) + + # Gradient-like effect: coloured accent bar + accent_bar = tk.Frame(hdr, bg=self.ACCENT, height=4) + accent_bar.pack(fill="x", pady=(0, 14)) + + title = tk.Label(hdr, text="🔐 KoBackup Decryptor", + font=self.FONT_TITLE, bg=self.BG, fg=self.FG) + title.pack(anchor="w") + + sub = tk.Label(hdr, text="Huawei HiSuite / KoBackup encrypted backup decryption tool • v20200705", + font=self.FONT_SUB, bg=self.BG, fg=self.FG_DIM) + sub.pack(anchor="w", pady=(2, 0)) + + # -- Form fields --------------------------------------------------- + + def _build_form(self): + outer, card = self._make_rounded_frame(self._main) + outer.pack(fill="x", padx=30) + + # Section title + sec = tk.Label(card, text="CONFIGURATION", font=("Segoe UI", 9, "bold"), + bg=self.BG_CARD, fg=self.ACCENT) + sec.pack(anchor="w", pady=(0, 10)) + + # Password + self._add_field_label(card, "Backup Password") + pw_frame = tk.Frame(card, bg=self.BG_CARD) + pw_frame.pack(fill="x", pady=(0, 12)) + + self.password_var = tk.StringVar() + self.show_pw = False + self.pw_entry = tk.Entry(pw_frame, textvariable=self.password_var, + show="•", font=self.FONT_INPUT, + bg=self.BG_INPUT, fg=self.FG, + insertbackground=self.ACCENT, + relief="flat", bd=0, + highlightbackground=self.BORDER, + highlightthickness=1, + highlightcolor=self.ACCENT) + self.pw_entry.pack(side="left", fill="x", expand=True, ipady=7, padx=(0, 8)) + + self.toggle_pw_btn = tk.Button(pw_frame, text="👁", font=("Segoe UI", 11), + bg=self.BG_INPUT, fg=self.FG_DIM, + activebackground=self.BG_HOVER, + activeforeground=self.FG, + relief="flat", bd=0, cursor="hand2", + command=self._toggle_password) + self.toggle_pw_btn.pack(side="right", ipadx=6, ipady=4) + + # Backup path + self._add_field_label(card, "Backup Folder") + self._build_path_row(card, "backup") + + # Destination path + self._add_field_label(card, "Destination Folder") + self._build_path_row(card, "dest") + + def _add_field_label(self, parent, text): + lbl = tk.Label(parent, text=text, font=self.FONT_LABEL, + bg=self.BG_CARD, fg=self.FG_DIM) + lbl.pack(anchor="w", pady=(0, 3)) + + def _build_path_row(self, parent, tag): + row = tk.Frame(parent, bg=self.BG_CARD) + row.pack(fill="x", pady=(0, 12)) + + var = tk.StringVar() + setattr(self, f"{tag}_var", var) + + entry = tk.Entry(row, textvariable=var, font=self.FONT_INPUT, + bg=self.BG_INPUT, fg=self.FG, + insertbackground=self.ACCENT, + relief="flat", bd=0, + highlightbackground=self.BORDER, + highlightthickness=1, + highlightcolor=self.ACCENT) + entry.pack(side="left", fill="x", expand=True, ipady=7, padx=(0, 8)) + + btn = tk.Button(row, text="Browse", font=("Segoe UI", 9, "bold"), + bg=self.ACCENT, fg="#ffffff", + activebackground=self.ACCENT_HOVER, + activeforeground="#ffffff", + relief="flat", bd=0, cursor="hand2", + padx=14, pady=4, + command=lambda t=tag: self._browse(t)) + btn.pack(side="right", ipady=2) + + # Hover effects + btn.bind("", lambda e, b=btn: b.configure(bg=self.ACCENT_HOVER)) + btn.bind("", lambda e, b=btn: b.configure(bg=self.ACCENT)) + + # -- Options section ----------------------------------------------- + + def _build_options(self): + outer, card = self._make_rounded_frame(self._main) + outer.pack(fill="x", padx=30) + + sec = tk.Label(card, text="OPTIONS", font=("Segoe UI", 9, "bold"), + bg=self.BG_CARD, fg=self.ACCENT) + sec.pack(anchor="w", pady=(0, 10)) + + opts_row = tk.Frame(card, bg=self.BG_CARD) + opts_row.pack(fill="x") + + self.expandtar_var = tk.BooleanVar(value=False) + self.writable_var = tk.BooleanVar(value=False) + + cb1 = ttk.Checkbutton(opts_row, text=" Expand TAR archives", + variable=self.expandtar_var) + cb1.pack(side="left", padx=(0, 30)) + + cb2 = ttk.Checkbutton(opts_row, text=" Keep files writable (skip read-only)", + variable=self.writable_var) + cb2.pack(side="left") + + # Verbose level + verb_row = tk.Frame(card, bg=self.BG_CARD) + verb_row.pack(fill="x", pady=(12, 0)) + + vlbl = tk.Label(verb_row, text="Log Verbosity", font=self.FONT_LABEL, + bg=self.BG_CARD, fg=self.FG_DIM) + vlbl.pack(side="left", padx=(0, 12)) + + self.verbose_var = tk.StringVar(value="INFO") + for level in ("ERROR", "WARNING", "INFO", "DEBUG"): + rb = tk.Radiobutton(verb_row, text=level, variable=self.verbose_var, + value=level, + font=("Segoe UI", 9), + bg=self.BG_CARD, fg=self.FG, + selectcolor=self.BG_INPUT, + activebackground=self.BG_CARD, + activeforeground=self.ACCENT, + highlightthickness=0, + cursor="hand2") + rb.pack(side="left", padx=(0, 10)) + + # -- Folder selection panel ---------------------------------------- + + def _build_folder_selector(self): + outer, card = self._make_rounded_frame(self._main) + outer.pack(fill="x", padx=30) + self._folder_card = card + self._folder_outer = outer + + # Header row with title + buttons + hdr = tk.Frame(card, bg=self.BG_CARD) + hdr.pack(fill="x", pady=(0, 8)) + + sec = tk.Label(hdr, text="FOLDER SELECTION", + font=("Segoe UI", 9, "bold"), + bg=self.BG_CARD, fg=self.ACCENT) + sec.pack(side="left") + + desel_btn = tk.Button(hdr, text="Deselect All", + font=("Segoe UI", 8), + bg=self.BG_INPUT, fg=self.FG_DIM, + activebackground=self.BG_HOVER, + activeforeground=self.FG, + relief="flat", bd=0, cursor="hand2", + padx=8, pady=2, + command=lambda: self._set_all_folders(False)) + desel_btn.pack(side="right", padx=(4, 0)) + + sel_btn = tk.Button(hdr, text="Select All", + font=("Segoe UI", 8), + bg=self.BG_INPUT, fg=self.FG_DIM, + activebackground=self.BG_HOVER, + activeforeground=self.FG, + relief="flat", bd=0, cursor="hand2", + padx=8, pady=2, + command=lambda: self._set_all_folders(True)) + sel_btn.pack(side="right", padx=(4, 0)) + + scan_btn = tk.Button(hdr, text="🔍 Scan", + font=("Segoe UI", 8, "bold"), + bg=self.ACCENT, fg="#ffffff", + activebackground=self.ACCENT_HOVER, + activeforeground="#ffffff", + relief="flat", bd=0, cursor="hand2", + padx=8, pady=2, + command=self._scan_backup_folders) + scan_btn.pack(side="right", padx=(4, 0)) + + # Hint label + self._folder_hint = tk.Label( + card, + text="Set a backup folder above, then click Scan to detect available folders.", + font=("Segoe UI", 9), + bg=self.BG_CARD, fg=self.FG_DIM, anchor="w") + self._folder_hint.pack(fill="x") + + # Scrollable checkbox area + self._folder_canvas = tk.Canvas(card, bg=self.BG_CARD, + highlightthickness=0, height=0) + self._folder_inner = tk.Frame(self._folder_canvas, bg=self.BG_CARD) + self._folder_canvas.create_window((0, 0), window=self._folder_inner, + anchor="nw") + # Don't pack canvas yet — shown after scan + + def _scan_backup_folders(self): + """Scan the backup path and populate folder checkboxes.""" + bkp = self.backup_var.get().strip() + if not bkp or not pathlib.Path(bkp).is_dir(): + messagebox.showwarning("No Backup Folder", + "Please select a valid backup folder first.") + return + + bkp_path = pathlib.Path(bkp) + + # Find the files_folder + files_folder = None + if bkp_path.joinpath('info.xml').exists(): + files_folder = bkp_path + else: + bf1 = bkp_path.joinpath('backupFiles1') + if bf1.is_dir(): + info_xml = next(bf1.glob('**/info.xml'), None) + if info_xml: + files_folder = info_xml.parent + + # Collect folder names + folder_names = [] + + # Root files (apk, db, tar in the files_folder) + if files_folder: + has_root = any( + f.is_file() and f.suffix.lower() != '.xml' + for f in files_folder.glob('*')) + if has_root: + folder_names.append(('__root__', '📄 Root files (APK, DB, TAR)')) + + for entry in sorted(files_folder.glob('*')): + if entry.is_dir(): + folder_names.append( + (entry.name, f'📁 {entry.name}')) + + # Media folder + if bkp_path.joinpath('media').is_dir(): + folder_names.append(('__media__', '🎬 Media')) + + # Clear old checkboxes + for w in self._folder_inner.winfo_children(): + w.destroy() + self._folder_vars.clear() + + if not folder_names: + self._folder_hint.configure( + text="No decryptable folders found in this backup.") + self._folder_canvas.pack_forget() + return + + self._folder_hint.pack_forget() + + # Build checkbox grid (3 columns) + cols = 3 + for i, (key, label) in enumerate(folder_names): + var = tk.BooleanVar(value=True) + self._folder_vars[key] = var + cb = tk.Checkbutton( + self._folder_inner, text=label, variable=var, + font=("Segoe UI", 9), + bg=self.BG_CARD, fg=self.FG, + selectcolor=self.BG_INPUT, + activebackground=self.BG_CARD, + activeforeground=self.ACCENT, + highlightthickness=0, cursor="hand2", + anchor="w") + cb.grid(row=i // cols, column=i % cols, + sticky="w", padx=(0, 18), pady=2) + + self._folder_canvas.pack(fill="x", pady=(4, 0)) + self._folder_inner.update_idletasks() + self._folder_canvas.configure( + height=self._folder_inner.winfo_reqheight()) + + def _set_all_folders(self, state: bool): + for var in self._folder_vars.values(): + var.set(state) + + def _get_selected_folders(self): + """Return set of selected folder keys.""" + return {k for k, v in self._folder_vars.items() if v.get()} + + # -- Action button & progress bar ----------------------------------- + + def _build_action(self): + action_frame = tk.Frame(self._main, bg=self.BG, pady=6) + action_frame.pack(fill="x", padx=30) + + # Progress bar + self.progress = ttk.Progressbar(action_frame, mode="indeterminate", + style="Horizontal.TProgressbar") + self.progress.pack(fill="x", pady=(0, 10)) + + btn_row = tk.Frame(action_frame, bg=self.BG) + btn_row.pack(fill="x") + + self.decrypt_btn = tk.Button( + btn_row, + text="🔓 Start Decryption", + font=self.FONT_BTN, + bg=self.ACCENT, + fg="#ffffff", + activebackground=self.ACCENT_HOVER, + activeforeground="#ffffff", + relief="flat", bd=0, + cursor="hand2", + padx=28, pady=10, + command=self._start_decrypt + ) + self.decrypt_btn.pack(side="left") + self.decrypt_btn.bind("", + lambda e: self.decrypt_btn.configure(bg=self.ACCENT_HOVER)) + self.decrypt_btn.bind("", + lambda e: self.decrypt_btn.configure(bg=self.ACCENT)) + + # Pause button + self.pause_btn = tk.Button( + btn_row, + text="⏸ Pause", + font=("Segoe UI", 10, "bold"), + bg=self.WARNING, + fg="#1a1a2e", + activebackground="#f59e0b", + activeforeground="#1a1a2e", + relief="flat", bd=0, + cursor="hand2", + padx=18, pady=10, + state="disabled", + command=self._toggle_pause + ) + self.pause_btn.pack(side="left", padx=(10, 0)) + + # Stop button + self.stop_btn = tk.Button( + btn_row, + text="⏹ Stop", + font=("Segoe UI", 10, "bold"), + bg=self.ERROR, + fg="#ffffff", + activebackground="#ef4444", + activeforeground="#ffffff", + relief="flat", bd=0, + cursor="hand2", + padx=18, pady=10, + state="disabled", + command=self._stop_decrypt + ) + self.stop_btn.pack(side="left", padx=(10, 0)) + + self.clear_log_btn = tk.Button( + btn_row, + text="Clear Log", + font=("Segoe UI", 9), + bg=self.BG_INPUT, + fg=self.FG_DIM, + activebackground=self.BG_HOVER, + activeforeground=self.FG, + relief="flat", bd=0, + cursor="hand2", + padx=14, pady=8, + command=self._clear_log + ) + self.clear_log_btn.pack(side="right") + + # -- Log output area ----------------------------------------------- + + def _build_log(self): + outer, card = self._make_rounded_frame(self._main, expandable=True) + outer.pack(fill="both", expand=True, padx=30) + + sec = tk.Label(card, text="LOG OUTPUT", font=("Segoe UI", 9, "bold"), + bg=self.BG_CARD, fg=self.ACCENT) + sec.pack(anchor="w", pady=(0, 6)) + + log_frame = tk.Frame(card, bg=self.LOG_BG, highlightbackground=self.BORDER, + highlightthickness=1) + log_frame.pack(fill="both", expand=True) + + self.log_text = tk.Text(log_frame, font=self.FONT_LOG, + bg=self.LOG_BG, fg="#a0aec0", + insertbackground=self.ACCENT, + relief="flat", bd=8, + wrap="word", + state="disabled", + highlightthickness=0) + scroll = tk.Scrollbar(log_frame, command=self.log_text.yview, + bg=self.BG_CARD, troughcolor=self.LOG_BG, + activebackground=self.ACCENT, + highlightthickness=0, bd=0) + self.log_text.configure(yscrollcommand=scroll.set) + scroll.pack(side="right", fill="y") + self.log_text.pack(fill="both", expand=True) + + # Tag colours for log levels + self.log_text.tag_configure("ERROR", foreground=self.ERROR) + self.log_text.tag_configure("WARNING", foreground=self.WARNING) + self.log_text.tag_configure("INFO", foreground=self.SUCCESS) + self.log_text.tag_configure("DEBUG", foreground=self.FG_DIM) + self.log_text.tag_configure("CRITICAL", foreground=self.ERROR, + font=("Consolas", 9, "bold")) + + # -- Status bar ---------------------------------------------------- + + def _build_status_bar(self): + bar = tk.Frame(self, bg=self.BORDER, height=30) + bar.pack(fill="x", side="bottom") + + self.status_var = tk.StringVar(value="Ready") + self.status_lbl = tk.Label(bar, textvariable=self.status_var, + font=self.FONT_STATUS, + bg=self.BORDER, fg=self.FG_DIM, + padx=14, pady=4) + self.status_lbl.pack(side="left") + + ver = tk.Label(bar, text="kobackupdec v20200705", + font=("Segoe UI", 8), bg=self.BORDER, fg=self.FG_DIM, + padx=14) + ver.pack(side="right") + + # ----------------------------------------------------------------- + # Responsive helpers + # ----------------------------------------------------------------- + + _last_resize_width = 0 + + def _on_resize(self, event): + """Reflow folder checkboxes when the window width changes.""" + if event.widget is not self: + return + # Only reflow when width changes meaningfully (>30px) + if abs(event.width - self._last_resize_width) > 30: + self._last_resize_width = event.width + self._reflow_folder_checkboxes() + + def _reflow_folder_checkboxes(self): + """Re-grid folder checkboxes to fit the current width.""" + children = self._folder_inner.winfo_children() + if not children: + return + # Estimate available width (window - padding) + avail = self.winfo_width() - 120 + # Measure widest checkbox + max_cb_w = max(c.winfo_reqwidth() for c in children) or 200 + cols = max(1, avail // (max_cb_w + 18)) + for i, cb in enumerate(children): + cb.grid_configure(row=i // cols, column=i % cols) + self._folder_inner.update_idletasks() + self._folder_canvas.configure( + height=self._folder_inner.winfo_reqheight()) + + # ----------------------------------------------------------------- + # Actions & helpers + # ----------------------------------------------------------------- + + def _toggle_password(self): + self.show_pw = not self.show_pw + self.pw_entry.configure(show="" if self.show_pw else "•") + self.toggle_pw_btn.configure(text="🔒" if self.show_pw else "👁") + + def _browse(self, tag): + if tag == "dest": + # For destination: pick a parent dir, then ask for a new subfolder name + parent = filedialog.askdirectory(title="Select parent folder for output") + if parent: + subfolder = simpledialog.askstring( + "Destination Folder Name", + "Enter a name for the new output folder:", + parent=self + ) + if subfolder and subfolder.strip(): + full = os.path.join(parent, subfolder.strip()) + self.dest_var.set(full) + else: + path = filedialog.askdirectory(title="Select folder") + if path: + getattr(self, f"{tag}_var").set(path) + if tag == "backup": + self._scan_backup_folders() + + def _clear_log(self): + self.log_text.configure(state="normal") + self.log_text.delete("1.0", "end") + self.log_text.configure(state="disabled") + + def _append_log(self, msg: str): + self.log_text.configure(state="normal") + tag = None + for lvl in ("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"): + if msg.startswith(lvl): + tag = lvl + break + if tag: + self.log_text.insert("end", msg + "\n", tag) + else: + self.log_text.insert("end", msg + "\n") + self.log_text.see("end") + self.log_text.configure(state="disabled") + + def _poll_log_queue(self): + """Drain queued log messages into the text widget.""" + while True: + try: + msg = self._log_queue.get_nowait() + self._append_log(msg) + except queue.Empty: + break + self.after(100, self._poll_log_queue) + + # -- Validation --- + + def _validate(self) -> bool: + pw = self.password_var.get().strip() + bkp = self.backup_var.get().strip() + dest = self.dest_var.get().strip() + + if not pw: + messagebox.showwarning("Missing Password", + "Please enter the backup password.") + return False + if not bkp or not pathlib.Path(bkp).is_dir(): + messagebox.showwarning("Invalid Backup Folder", + "The backup folder does not exist.\n" + "Please select a valid directory.") + return False + if not dest: + messagebox.showwarning("Missing Destination", + "Please specify a destination folder.") + return False + if pathlib.Path(dest).is_dir(): + proceed = messagebox.askyesno( + "Destination Exists", + "The destination folder already exists.\n" + "Decrypted files will be written into it and may overwrite " + "existing content.\n\nContinue anyway?" + ) + if not proceed: + return False + return True + + # -- Stop / Pause controls --- + + def _toggle_pause(self): + if self._pause_event.is_set(): + self._pause_event.clear() + self.pause_btn.configure(text="▶ Resume", bg=self.SUCCESS) + self.status_var.set("⏸ Paused") + self.progress.stop() + else: + self._pause_event.set() + self.pause_btn.configure(text="⏸ Pause", bg=self.WARNING) + self.status_var.set("▶ Resumed — decrypting…") + self.progress.start(12) + + def _stop_decrypt(self): + if self._running: + self._stop_event.set() + self._pause_event.set() # unblock if paused + self.status_var.set("⏹ Stopping…") + + def _check_stop_pause(self): + """Returns True if thread should abort. Blocks while paused.""" + if self._stop_event.is_set(): + return True + while not self._pause_event.is_set(): + if self._stop_event.is_set(): + return True + time.sleep(0.1) + return False + + def _set_controls_running(self, running): + """Toggle button states for running / idle.""" + if running: + self.decrypt_btn.configure(state="disabled", bg=self.ACCENT_DARK, + text="⏳ Decrypting…") + self.pause_btn.configure(state="normal") + self.stop_btn.configure(state="normal") + else: + self.decrypt_btn.configure(state="normal", bg=self.ACCENT, + text="🔓 Start Decryption") + self.pause_btn.configure(state="disabled", + text="⏸ Pause", bg=self.WARNING) + self.stop_btn.configure(state="disabled") + + # -- Decryption thread --- + + def _start_decrypt(self): + if self._running: + return + if not self._validate(): + return + + self._running = True + self._stop_event.clear() + self._pause_event.set() + self._set_controls_running(True) + self.progress.start(12) + self.status_var.set("🔑 Verifying password…") + + self._worker_thread = threading.Thread( + target=self._run_decrypt, daemon=True) + self._worker_thread.start() + + def _setup_logging(self): + root_logger = logging.getLogger() + root_logger.handlers.clear() + level_map = { + "ERROR": logging.ERROR, + "WARNING": logging.WARNING, + "INFO": logging.INFO, + "DEBUG": logging.DEBUG, + } + root_logger.setLevel( + level_map.get(self.verbose_var.get(), logging.INFO)) + qh = QueueHandler(self._log_queue) + qh.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) + root_logger.addHandler(qh) + + def _find_files_folder(self, bkp_path): + """Locate the folder containing info.xml.""" + if bkp_path.joinpath('info.xml').exists(): + return bkp_path + bf1 = bkp_path.joinpath('backupFiles1') + if bf1.is_dir(): + info_xml = next(bf1.glob('**/info.xml'), None) + if info_xml: + return info_xml.parent + raise FileNotFoundError('Unable to find info.xml in backupFiles1!') + raise FileNotFoundError( + 'No backupFiles1 folder nor info.xml file found!') + + def _run_decrypt(self): + """Background thread: verify password then decrypt with stop/pause.""" + import kobackupdec + self._setup_logging() + + password = self.password_var.get().strip().encode('utf-8') + bkp_path = pathlib.Path(self.backup_var.get().strip()) + dest_path = pathlib.Path(self.dest_var.get().strip()) + expand = self.expandtar_var.get() + writable = self.writable_var.get() + + success = False + stopped = False + try: + # ── Phase 1: locate backup & verify password ────────── + files_folder = self._find_files_folder(bkp_path) + + decrypt_info = kobackupdec.parse_info_xml( + files_folder.joinpath('info.xml'), password) + if not decrypt_info: + raise ValueError('Failed to parse info.xml') + if not decrypt_info.decryptor.good: + raise ValueError( + 'Wrong password! Decryptor verification failed.') + + logging.info('Password verified successfully!') + self.after(0, lambda: self.status_var.set( + '✅ Password OK — decrypting…')) + + if self._check_stop_pause(): + raise InterruptedError('Stopped') + + # ── Phase 2: parse XML keys ─────────────────────────── + dest_path.mkdir(0o755, parents=True, exist_ok=True) + + for entry in files_folder.glob('*.xml'): + if self._check_stop_pause(): + raise InterruptedError('Stopped') + if entry.name != 'info.xml' \ + and not entry.name.startswith('._'): + kobackupdec.parse_generic_xml(entry, decrypt_info) + + logging.debug(decrypt_info.dump()) + + # Determine which folders the user selected + selected = self._get_selected_folders() + # If no scan was done (no checkboxes), decrypt everything + decrypt_all = len(self._folder_vars) == 0 + + # ── Phase 3: decrypt root files ─────────────────────── + if decrypt_all or '__root__' in selected: + if self._check_stop_pause(): + raise InterruptedError('Stopped') + self.after(0, lambda: self.status_var.set( + '📂 Decrypting root files…')) + kobackupdec.decrypt_files_in_root( + decrypt_info, files_folder, dest_path, expand) + else: + logging.info('Skipping root files (not selected)') + + # ── Phase 4: decrypt sub-folders one by one ─────────── + all_folders = [e for e in files_folder.glob('*') if e.is_dir()] + folders = [e for e in all_folders + if decrypt_all or e.name in selected] + skipped = len(all_folders) - len(folders) + if skipped: + logging.info('Skipping %d unselected folder(s)', skipped) + + for idx, entry in enumerate(folders, 1): + if self._check_stop_pause(): + raise InterruptedError('Stopped') + self.after(0, lambda n=entry.name, i=idx, t=len(folders): + self.status_var.set( + f'📂 Folder {i}/{t}: {n}')) + kobackupdec.decrypt_files_in_folder( + decrypt_info, entry, dest_path, expand) + + # ── Phase 5: media ──────────────────────────────────── + if bkp_path.joinpath('media').is_dir() and \ + (decrypt_all or '__media__' in selected): + if self._check_stop_pause(): + raise InterruptedError('Stopped') + self.after(0, lambda: self.status_var.set( + '🎬 Decrypting media…')) + kobackupdec.decrypt_media( + password, bkp_path.joinpath('media'), + dest_path, expand) + elif bkp_path.joinpath('media').is_dir(): + logging.info('Skipping media folder (not selected)') + + # ── Phase 6: permissions ────────────────────────────── + if self._check_stop_pause(): + raise InterruptedError('Stopped') + if writable: + logging.info('Not setting read-only on decrypted files') + else: + self.after(0, lambda: self.status_var.set( + '🔒 Setting permissions…')) + for fentry in dest_path.glob('**/*'): + if self._stop_event.is_set(): + raise InterruptedError('Stopped') + if os.path.isfile(fentry): + os.chmod(fentry, 0o444) + elif os.path.isdir(fentry): + os.chmod(fentry, 0o555) + + success = True + + except InterruptedError: + stopped = True + logging.warning('Decryption stopped by user.') + except Exception as exc: + logging.critical('Decryption failed: %s', exc) + self._log_queue.put(f'CRITICAL: {exc}') + + self.after(0, lambda: self._decrypt_done(success, stopped)) + + def _decrypt_done(self, success: bool, stopped: bool = False): + self._running = False + self.progress.stop() + self._set_controls_running(False) + + if stopped: + self.status_var.set('⏹ Decryption stopped by user') + self._append_log('') + self._append_log('WARNING: ⏹ Decryption was stopped by the user.') + elif success: + self.status_var.set('✅ Decryption completed successfully!') + self._append_log('') + self._append_log('=' * 50) + self._append_log('INFO: ✅ Decryption completed successfully!') + self._append_log('=' * 50) + messagebox.showinfo('Success', + 'Backup has been decrypted successfully!\n\n' + f'Output: {self.dest_var.get()}') + else: + self.status_var.set('❌ Decryption failed — see log for details') + messagebox.showerror('Error', + 'Decryption failed.\n' + 'Check the log output for details.') + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- + +if __name__ == "__main__": + # Ensure the script's own directory is on the path so we can import kobackupdec + script_dir = os.path.dirname(os.path.abspath(__file__)) + if script_dir not in sys.path: + sys.path.insert(0, script_dir) + + app = KoBackupDecGUI() + app.mainloop() diff --git a/screenshots/gui_main.png b/screenshots/gui_main.png new file mode 100644 index 0000000000000000000000000000000000000000..68cc4341dcbe8ca4b7403bd6ee43200dd58a4ffa GIT binary patch literal 85265 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 jJc2x=79O4N;9CaBHi#8Df_Nl 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 Date: Sat, 9 May 2026 01:51:13 +0500 Subject: [PATCH 2/4] feat: Add GUI v1.1 features (drag-and-drop, persistence, export logs, open output) --- CHANGELOG.md | 12 ++++- README.md | 20 +++++-- kobackupdec_gui.py | 129 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 154 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f612c7..74afe1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,17 @@ All notable changes to this project will be documented in this file. -## [GUI Edition] — 2026-05-08 +## [GUI_v1.1] — 2026-05-08 + +### Added +- **Drag-and-Drop:** Added `tkinterdnd2` support allowing users to drag backup folders directly into the application. +- **Settings Persistence:** Created `config.json` integration to save and automatically load user preferences and selected directories across sessions. +- **Log Exporting:** Added an "Export Log" button to save the current terminal output to a text file for auditing. +- **Output Folder Quick Access:** Added an "Open Output" button that becomes clickable after a successful decryption to instantly view the extracted files. + +--- + +## [GUI_v1.0] — 2026-05-08 ### Added - **Full GUI application** (`kobackupdec_gui.py`) with modern dark theme diff --git a/README.md b/README.md index f7092d4..3fdec46 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@

🔐 KoBackup Decryptor

Decrypt Huawei HiSuite & KoBackup encrypted backups
- CLI + Modern GUI • Selective Folder Decryption • Password Verification + CLI + Modern GUI • Selective Folder Decryption • Drag & Drop • Password Verification

Python 3.7+ MIT License - Version + Version

@@ -39,7 +39,11 @@ This fork adds a **full-featured graphical interface** built with tkinter, bring | Decrypt full backups | ✅ | ✅ | | Password verification before decrypt | — | ✅ | | **Selective folder decryption** | — | ✅ | +| **Drag and Drop support** | — | ✅ | +| **Settings persistence** | — | ✅ | | Pause / Resume / Stop controls | — | ✅ | +| Export decryption logs | — | ✅ | +| Open Output folder button | — | ✅ | | Real-time color-coded log output | — | ✅ | | Progress tracking with status updates | — | ✅ | | Responsive dark-themed interface | — | ✅ | @@ -69,6 +73,7 @@ pip install -r requirements.txt | Package | Purpose | |---|---| | `pycryptodome` | AES / PBKDF2 / HMAC cryptographic operations | +| `tkinterdnd2` | Drag and drop functionality for the GUI | | `tkinter` | GUI framework (bundled with Python on most platforms) | > **Note:** On some Linux distributions, tkinter may need to be installed separately: @@ -95,11 +100,12 @@ python kobackupdec_gui.py #### GUI Workflow 1. **Enter Password** — Type your backup password (toggle visibility with 👁) -2. **Select Backup Folder** — Browse to the Huawei backup directory +2. **Select Backup Folder** — Drag and drop your Huawei backup directory right into the application, or click **Browse** 3. **Select Destination** — Choose where to save decrypted files (pick a parent, name the output folder) 4. **Configure Options** — Toggle TAR expansion, writable permissions, and log verbosity -5. **Select Folders** — After setting the backup path, click **🔍 Scan** or it auto-scans to show available folders. Check/uncheck individual folders (pictures, video, audios, etc.) +5. **Select Folders** — After setting the backup path, check/uncheck individual folders (pictures, video, audios, etc.) to decrypt only what you need 6. **Start Decryption** — Click **🔓 Start Decryption** +7. **Open Output** — When finished, click **📂 Open Output** to view your files immediately #### GUI Controls @@ -108,6 +114,8 @@ python kobackupdec_gui.py | 🔓 **Start Decryption** | Verifies password first, then begins decryption | | ⏸ **Pause / ▶ Resume** | Temporarily halt and resume the process | | ⏹ **Stop** | Cancel the decryption (partially decrypted files are kept) | +| 📂 **Open Output** | Opens destination folder in Windows Explorer (enabled after success) | +| **Export Log** | Save decryption logs to a text file for auditing | | **Select All / Deselect All** | Quickly toggle all folder checkboxes | | **🔍 Scan** | Re-scan backup directory for available folders | | **Clear Log** | Clear the log output panel | @@ -116,7 +124,9 @@ python kobackupdec_gui.py - **🔑 Password Verification** — Validates the password against `info.xml` before starting decryption. Wrong passwords are caught instantly. - **📂 Selective Folder Decryption** — Only decrypt what you need (e.g., just pictures and contacts, skip video and apps). -- **📊 Real-Time Progress** — Status bar shows current phase and folder being processed. +- **💾 Settings Persistence** — The app remembers your selected folders and checkboxes across launches via `config.json`. +- **🖱️ Drag and Drop** — Seamlessly drop backup folders into the app instead of browsing manually. +- **📊 Real-Time Progress & Logs** — Status bar shows current phase. Export logs anytime. - **🎨 Dark Theme** — Modern, responsive dark interface with color-coded log levels (green=info, yellow=warning, red=error). - **📐 Responsive Layout** — Resizes gracefully from 600×500 to fullscreen. Folder checkboxes reflow automatically. diff --git a/kobackupdec_gui.py b/kobackupdec_gui.py index 3be4cd6..a26df63 100644 --- a/kobackupdec_gui.py +++ b/kobackupdec_gui.py @@ -16,6 +16,9 @@ import tkinter as tk from tkinter import filedialog, messagebox, simpledialog, ttk import queue import time +import json +import subprocess +from tkinterdnd2 import TkinterDnD, DND_FILES # --------------------------------------------------------------------------- # Logging handler that forwards records into a thread-safe queue @@ -36,7 +39,7 @@ class QueueHandler(logging.Handler): # Main GUI Application # --------------------------------------------------------------------------- -class KoBackupDecGUI(tk.Tk): +class KoBackupDecGUI(TkinterDnD.Tk): """Tkinter-based GUI for the Huawei KoBackup decryptor.""" # -- Colour palette (dark mode) ---------------------------------------- @@ -112,6 +115,12 @@ class KoBackupDecGUI(tk.Tk): # Bind resize to reflow folder checkboxes self.bind("", self._on_resize) + # Load saved settings + self._load_config() + + # Save config on exit + self.protocol("WM_DELETE_WINDOW", self._on_closing) + # Start polling the log queue self._poll_log_queue() @@ -245,6 +254,10 @@ class KoBackupDecGUI(tk.Tk): highlightcolor=self.ACCENT) entry.pack(side="left", fill="x", expand=True, ipady=7, padx=(0, 8)) + # Enable Drag and Drop + entry.drop_target_register(DND_FILES) + entry.dnd_bind('<>', lambda e, v=var, t=tag: self._on_drop(e, v, t)) + btn = tk.Button(row, text="Browse", font=("Segoe UI", 9, "bold"), bg=self.ACCENT, fg="#ffffff", activebackground=self.ACCENT_HOVER, @@ -517,6 +530,37 @@ class KoBackupDecGUI(tk.Tk): ) self.stop_btn.pack(side="left", padx=(10, 0)) + self.open_output_btn = tk.Button( + btn_row, + text="📂 Open Output", + font=("Segoe UI", 9), + bg=self.SUCCESS, + fg="#1a1a2e", + activebackground="#10b981", + activeforeground="#1a1a2e", + relief="flat", bd=0, + cursor="hand2", + padx=14, pady=8, + state="disabled", + command=self._open_output_folder + ) + self.open_output_btn.pack(side="right", padx=(10, 0)) + + self.export_log_btn = tk.Button( + btn_row, + text="Export Log", + font=("Segoe UI", 9), + bg=self.BG_INPUT, + fg=self.FG_DIM, + activebackground=self.BG_HOVER, + activeforeground=self.FG, + relief="flat", bd=0, + cursor="hand2", + padx=14, pady=8, + command=self._export_log + ) + self.export_log_btn.pack(side="right", padx=(10, 0)) + self.clear_log_btn = tk.Button( btn_row, text="Clear Log", @@ -919,12 +963,14 @@ class KoBackupDecGUI(tk.Tk): self._running = False self.progress.stop() self._set_controls_running(False) + self.open_output_btn.configure(state="disabled") if stopped: self.status_var.set('⏹ Decryption stopped by user') self._append_log('') self._append_log('WARNING: ⏹ Decryption was stopped by the user.') elif success: + self.open_output_btn.configure(state="normal") self.status_var.set('✅ Decryption completed successfully!') self._append_log('') self._append_log('=' * 50) @@ -939,6 +985,87 @@ class KoBackupDecGUI(tk.Tk): 'Decryption failed.\n' 'Check the log output for details.') + # ----------------------------------------------------------------- + # New Utilities + # ----------------------------------------------------------------- + + def _on_drop(self, event, var, tag): + path = event.data + if path.startswith('{') and path.endswith('}'): + path = path[1:-1] + var.set(path) + if tag == "backup": + self._scan_backup_folders() + + def _export_log(self): + log_content = self.log_text.get("1.0", "end-1c") + if not log_content.strip(): + messagebox.showinfo("Export Log", "The log is empty.") + return + filepath = filedialog.asksaveasfilename( + defaultextension=".txt", + filetypes=[("Text files", "*.txt"), ("All files", "*.*")], + title="Save Log Output" + ) + if filepath: + try: + with open(filepath, "w", encoding="utf-8") as f: + f.write(log_content) + messagebox.showinfo("Success", "Log exported successfully.") + except Exception as e: + messagebox.showerror("Error", f"Failed to save log:\n{e}") + + def _open_output_folder(self): + path = self.dest_var.get().strip() + if os.path.isdir(path): + if sys.platform == "win32": + os.startfile(path) + elif sys.platform == "darwin": + subprocess.Popen(["open", path]) + else: + subprocess.Popen(["xdg-open", path]) + + def _get_config_path(self): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.json") + + def _load_config(self): + config_path = self._get_config_path() + if os.path.exists(config_path): + try: + with open(config_path, "r", encoding="utf-8") as f: + data = json.load(f) + if "backup_path" in data: + self.backup_var.set(data["backup_path"]) + self._scan_backup_folders() + if "dest_path" in data: + self.dest_var.set(data["dest_path"]) + if "expandtar" in data: + self.expandtar_var.set(data["expandtar"]) + if "writable" in data: + self.writable_var.set(data["writable"]) + if "verbose" in data: + self.verbose_var.set(data["verbose"]) + except Exception as e: + logging.error(f"Failed to load config: {e}") + + def _save_config(self): + config_path = self._get_config_path() + data = { + "backup_path": self.backup_var.get(), + "dest_path": self.dest_var.get(), + "expandtar": self.expandtar_var.get(), + "writable": self.writable_var.get(), + "verbose": self.verbose_var.get() + } + try: + with open(config_path, "w", encoding="utf-8") as f: + json.dump(data, f, indent=4) + except Exception as e: + logging.error(f"Failed to save config: {e}") + + def _on_closing(self): + self._save_config() + self.destroy() # --------------------------------------------------------------------------- # Entry point From 564886bf90f5db3174bfb47d5f0acb2e4fb30671 Mon Sep 17 00:00:00 2001 From: najeeb Date: Sat, 9 May 2026 02:12:04 +0500 Subject: [PATCH 3/4] build: Add PyInstaller standalone build scripts and app icon --- .gitignore | 6 ++++++ app.ico | Bin 0 -> 57353 bytes build.py | 23 +++++++++++++++++++++++ create_icon.py | 19 +++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 app.ico create mode 100644 build.py create mode 100644 create_icon.py diff --git a/.gitignore b/.gitignore index f00c7b4..667e5e0 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,9 @@ desktop.ini # Logs *.log + +# App Config +config.json + +# PyInstaller +*.spec diff --git a/app.ico b/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..47f41334009b51ffad7027f4eb9277f0be465af9 GIT binary patch literal 57353 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

L?BbnHWOG0uHq}5){6f=!VR7$Yy!q(*{ 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

or(lvpBT_))qWvL2^cIR87QO%9biiG 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 T>F;Xs00000NkvXXu0mjf_!&-f literal 0 HcmV?d00001 diff --git a/build.py b/build.py new file mode 100644 index 0000000..29865c9 --- /dev/null +++ b/build.py @@ -0,0 +1,23 @@ +import PyInstaller.__main__ +import tkinterdnd2 +import os +import shutil + +def build(): + tkdnd_path = os.path.join(os.path.dirname(tkinterdnd2.__file__), 'tkdnd') + + # Ensure dist and build dirs are clean + if os.path.exists('dist'): shutil.rmtree('dist') + if os.path.exists('build'): shutil.rmtree('build') + + PyInstaller.__main__.run([ + 'kobackupdec_gui.py', + '--name=KoBackupDecryptor', + '--onefile', + '--windowed', + '--icon=app.ico', + f'--add-data={tkdnd_path};tkinterdnd2/tkdnd' + ]) + +if __name__ == '__main__': + build() diff --git a/create_icon.py b/create_icon.py new file mode 100644 index 0000000..42d387f --- /dev/null +++ b/create_icon.py @@ -0,0 +1,19 @@ +import sys +from PIL import Image + +def create_ico(input_path, output_path): + img = Image.open(input_path) + # Crop to square if necessary + width, height = img.size + if width != height: + min_dim = min(width, height) + left = (width - min_dim) / 2 + top = (height - min_dim) / 2 + right = (width + min_dim) / 2 + bottom = (height + min_dim) / 2 + img = img.crop((left, top, right, bottom)) + + img.save(output_path, format="ICO", sizes=[(256, 256), (128, 128), (64, 64), (32, 32), (16, 16)]) + +if __name__ == "__main__": + create_ico(sys.argv[1], sys.argv[2]) From d4defd86ecd8dba997167f18910fa1437dfb95c0 Mon Sep 17 00:00:00 2001 From: najeeb Date: Sat, 9 May 2026 02:18:43 +0500 Subject: [PATCH 4/4] docs: Add direct download link for standalone executable --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3fdec46..884c794 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,10 @@

Python 3.7+ MIT License - Version + Version +

+

+

⬇️ Download the Standalone Windows Executable (.exe) ⬇️

@@ -68,6 +71,14 @@ cd kobackupdec pip install -r requirements.txt ``` +### 📦 Building a Standalone Executable (.exe) + +You can compile the GUI into a portable `.exe` file that requires zero setup (no Python installation needed): + +1. Install PyInstaller: `pip install pyinstaller Pillow` +2. Run the build script: `python build.py` +3. The standalone application will be generated at `dist/KoBackupDecryptor.exe`. + ### Dependencies | Package | Purpose |