On Windows, recover the Adobe ADEPT user key from an installed/activated Adobe Digital Editions and use it automatically, so ADEPT EPUBs decrypt with no --key argument. Ported from adobekey.py: * Build the DPAPI entropy byte-for-byte: system-volume serial number, CPUID leaf-0 vendor (EBX|EDX|ECX) and leaf-1 signature, and the ADE username, packed as ">I12s3s13s". * CryptUnprotectData (DPAPI) recovers the key-encryption-key from the HKCU\Software\Adobe\Adept\Device "key" value, then each per-credential privateLicenseKey under ...\Activation is AES-128-CBC decrypted and the DER RSA key taken from byte 26 onward. Decryption now lazily auto-extracts and retries when no supplied key fits, and newly found keys are written back to the TOML config so later runs are offline. Uses the `windows` (DPAPI/volume info) and `winreg` crates behind cfg(windows); pure-Rust crypto unchanged. Verified end-to-end on a real ADEPT EPUB: the key was extracted from the local ADE and the book decrypted to a valid, DRM-free EPUB (rights.xml and encryption.xml removed, content readable). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
67 lines
2.3 KiB
Markdown
67 lines
2.3 KiB
Markdown
# DRMLibre
|
|
|
|
A standalone, single-binary command-line tool (written in Rust, no runtime
|
|
dependencies) for removing DRM from **Amazon Kindle** and **Adobe Digital
|
|
Editions** ebooks. The decryption logic is ported from
|
|
[DeDRM_tools](https://github.com/noDRM/DeDRM_tools); DRMLibre is therefore
|
|
licensed **GPL-3.0-or-later**. See [CREDITS.md](CREDITS.md).
|
|
|
|
> Use DRMLibre only on books you own, to exercise your own rights (format
|
|
> shifting, backup, accessibility). Respect the law in your jurisdiction.
|
|
|
|
## Status
|
|
|
|
Under active development. Supported / planned formats:
|
|
|
|
| Capability | Status |
|
|
|---|---|
|
|
| Adobe ADEPT EPUB (+ hardening, B&N PassHash, font de-obfuscation) | ✅ done |
|
|
| Kindle MOBI / AZW / AZW3 | ✅ done |
|
|
| Adobe key auto-extraction from installed ADE (Windows, DPAPI) | ✅ done |
|
|
| Kindle-for-PC key (`.kinf`) / Android / macOS auto-extraction | planned |
|
|
| Kindle KFX-ZIP | planned |
|
|
| Adobe PDF, Kindle Topaz, eReader, Kobo, LCP | out of scope |
|
|
|
|
On Windows with Adobe Digital Editions activated, ADEPT EPUBs decrypt with no
|
|
extra arguments — the key is extracted from the local install and cached in the
|
|
config for later offline use.
|
|
|
|
## Usage
|
|
|
|
```
|
|
drmlibre remove <files...> [options] # remove DRM
|
|
drmlibre passhash ... # generate/extract Adobe/B&N PassHashes
|
|
drmlibre config # summarize keys in the config file
|
|
```
|
|
|
|
Common `remove` options: `-o/--output`, `--outputdir`, `-f/--force`,
|
|
`--overwrite`, `--serial`, `--pid`, `--key`, `--passphrase`, `--android-backup`,
|
|
`--config` (default `./drmlibre.toml`).
|
|
|
|
Examples:
|
|
|
|
```
|
|
# Adobe EPUB, using an exported Adobe key:
|
|
drmlibre remove "My Book.epub" --key adobe.der -o "My Book (no DRM).epub"
|
|
|
|
# Kindle eInk book, using the device serial:
|
|
drmlibre remove "My Book.azw" --serial 0123456789ABCDEF
|
|
```
|
|
|
|
## Architecture
|
|
|
|
A Cargo workspace:
|
|
|
|
- `crates/drmlibre-core` — the UI-agnostic engine (format detection, key
|
|
management, decryptors). No printing or process exits; everything is a
|
|
`Result` and progress goes through `tracing`. This is what a future GUI links.
|
|
- `crates/drmlibre-cli` — the `drmlibre` binary (argument parsing, file I/O
|
|
policy, exit codes).
|
|
|
|
## Building
|
|
|
|
```
|
|
cargo build --release # binary at target/release/drmlibre
|
|
cargo test # run the test suite
|
|
```
|