mirror of
https://gitea.tendokyu.moe/beerpsi/fsdecrypt.git
synced 2026-09-22 22:17:55 +03:00
install-context-menu.bat / uninstall-context-menu.bat add a per-user (HKCU) Explorer entry for .app and .opt files, with an embedded unpack icon (assets/fsdecrypt.ico). No admin needed; the normal double-click association is untouched. The registered command keeps the console open after extraction. Documented in the README. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
108 lines
3.5 KiB
Markdown
108 lines
3.5 KiB
Markdown
# fsdecrypt
|
|
|
|
Decryptor and extractor for SEGA arcade filesystem containers (fscrypt format). Works on Windows and Linux, no admin privileges required.
|
|
|
|
## Installation
|
|
|
|
Requires [Rust](https://www.rust-lang.org/tools/install).
|
|
|
|
```bash
|
|
cargo build --release
|
|
```
|
|
|
|
The binary will be at `target/release/fsdecrypt` (or `fsdecrypt.exe` on Windows).
|
|
|
|
## Usage
|
|
|
|
```bash
|
|
fsdecrypt <FILES>...
|
|
```
|
|
|
|
### Examples
|
|
|
|
```bash
|
|
# Extract a game APP container
|
|
fsdecrypt ABCD_1.00.00_20240101120000_0.app
|
|
|
|
# Extract an OPTION/DLC container
|
|
fsdecrypt ABCD_A001_20240101120000_0.opt
|
|
|
|
# Extract multiple files at once
|
|
fsdecrypt game_v1.app game_v2.app extras.opt
|
|
|
|
# Decrypt only (outputs raw .ntfs/.exfat image, no extraction)
|
|
fsdecrypt --no-extract ABCD_1.00.00_20240101120000_0.app
|
|
```
|
|
|
|
### Delta Updates
|
|
|
|
Games often ship incremental updates as a separate `.app` file. Just pass the update file — fsdecrypt will automatically find the base in the same folder and merge them:
|
|
|
|
```bash
|
|
fsdecrypt ABCD_1.01.00_20240215143000_1_1.00.00.app
|
|
```
|
|
|
|
You can also pass both explicitly:
|
|
|
|
```bash
|
|
fsdecrypt ABCD_1.00.00_20240101120000_0.app ABCD_1.01.00_20240215143000_1_1.00.00.app
|
|
```
|
|
|
|
The output folder is named after the input file (e.g. `ABCD_1.01.00_20240215143000_1_1.00.00/`).
|
|
|
|
## Windows Right-Click Menu
|
|
|
|
Two batch files add an **"Unpack with fsdecrypt"** entry (with an unpack icon)
|
|
to the right-click menu of `.app` and `.opt` files:
|
|
|
|
- **`install-context-menu.bat`** — install the menu entry
|
|
- **`uninstall-context-menu.bat`** — remove it
|
|
|
|
Just double-click `install-context-menu.bat`. No administrator rights are
|
|
needed — it installs under the current user only (`HKCU`) and leaves the normal
|
|
double-click association untouched. Right-clicking a file then runs the full
|
|
extraction and keeps the console window open until you press a key.
|
|
|
|
`install-context-menu.bat` finds `fsdecrypt.exe` automatically when run from the
|
|
repo root (it looks in `target\release` then `target\debug`) or when placed next
|
|
to the binary. The icon is taken from `assets\fsdecrypt.ico` (or `fsdecrypt.ico`
|
|
beside the script). The menu stores the absolute path it found, so re-run it if
|
|
you move the exe.
|
|
|
|
> On Windows 11 the entry appears under **Show more options** (the classic menu).
|
|
|
|
## External Key Files
|
|
|
|
For games not in the built-in key database, place a file named `{GAME_ID}.bin` in the working directory:
|
|
|
|
- **16 bytes** for key only (IV derived automatically)
|
|
- **32 bytes** for key + IV
|
|
|
|
## Testing
|
|
|
|
Tests run locally (there is no hosted CI). The unit tests are plain `cargo test`;
|
|
the Linux `x86_64-musl` release target is exercised via Docker when you need it.
|
|
|
|
```bash
|
|
cargo test # unit tests (IV derivation, timestamp decoding, key lookup)
|
|
scripts/test.sh # native tests + smoke test, then the same in a musl container
|
|
scripts/test.sh --no-docker # skip the Docker/Linux step
|
|
```
|
|
|
|
`scripts/test.sh` uses the [`clux/muslrust`](https://hub.docker.com/r/clux/muslrust)
|
|
image to build and test the static Linux binary — the same way release artifacts
|
|
are produced — so both targets can be validated from any host.
|
|
|
|
### End-to-end fixtures
|
|
|
|
The `tests/e2e.rs` test decrypts real containers placed in a `fixtures/`
|
|
directory at the repo root and checks that each extracts successfully. That
|
|
folder is git-ignored — the proprietary sample containers are never committed —
|
|
and the test is a no-op when it is empty, so just drop a few `.app`/`.opt` files
|
|
in `fixtures/` and run `cargo test` (or `scripts/test.sh`) to exercise the full
|
|
decrypt-and-extract path.
|
|
|
|
## License
|
|
|
|
[BSD Zero Clause License](LICENSE) (0BSD)
|