Crates.io | backhand |
lib.rs | backhand |
version | |
source | src |
created_at | 2023-01-01 22:00:42.877334 |
updated_at | 2024-12-01 22:47:19.584929 |
description | Library for the reading, creating, and modification of SquashFS file systems |
homepage | |
repository | https://github.com/wcampbell0x2a/backhand |
max_upload_size | |
id | 749051 |
Cargo.toml error: | TOML parse error at line 19, column 1 | 19 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
Library and binaries for the reading, creating, and modification of SquashFS file systems.
Library — Backhand provides an easy way for programmatic analysis of Squashfs 4.0 images, including the extraction and modification of images.
Feature Flags — Supported compression and decompression are feature flagged, so your final binary (or unsquashfs
)
only needs to include code to extract one type of image.
Unconventional Support — As well as supporting normal linux kernel SquashFS 4.0, we also support
the "wonderful world of vendor formats" with a Kind
struct.
This allows changing the magic bytes, custom compression algorithms, and the Endian-ness of either the Data or Metadata fields.
Compiler support: requires rustc 1.72.1+
Add the following to your Cargo.toml
file:
[dependencies]
backhand = "0.19.0"
Although additional targets may be supported, only the following have been fully tested or confirmed to build successfully.
Target | build |
test |
---|---|---|
x86_64-unknown-linux-musl |
✓ | ✓ |
aarch64-unknown-linux-musl |
✓ | ✓ |
arm-unknown-linux-musleabi |
✓ | ✓ |
armv7-unknown-linux-musleabi |
✓ | ✓ |
aarch64-unknown-linux-musl |
✓ | ✓ |
x86_64-apple-darwin |
✓ | ✓ |
x86_64-pc-windows-gnu |
✓ |
use std::fs::File;
use std::io::{Cursor, BufReader};
use backhand::{FilesystemReader, FilesystemWriter, NodeHeader};
// read
let file = BufReader::new(File::open("file.squashfs").unwrap());
let read_filesystem = FilesystemReader::from_reader(file).unwrap();
// convert to writer
let mut write_filesystem = FilesystemWriter::from_fs_reader(&read_filesystem).unwrap();
// add file with data from slice
let d = NodeHeader::default();
let bytes = Cursor::new(b"Fear is the mind-killer.");
write_filesystem.push_file(bytes, "a/d/e/new_file", d);
// add file with data from file
let new_file = File::open("dune").unwrap();
write_filesystem.push_file(new_file, "/root/dune", d);
// modify file
let bytes = Cursor::new(b"The sleeper must awaken.\n");
write_filesystem.replace_file("/a/b/c/d/e/first_file", bytes).unwrap();
// write into a new file
let mut output = File::create("modified.squashfs").unwrap();
write_filesystem.write(&mut output).unwrap();
Compiler support: requires rustc 1.77+
These are currently under development and are missing features, MR's welcome!
To install, run cargo install backhand-cli --locked
, or download from the
latest github release.
See --help
for more information.
Although additional targets may be supported, only the following have been tested and included in our GitHub releases.
Target | test |
release |
---|---|---|
x86_64-unknown-linux-musl |
✓ | ✓ |
aarch64-unknown-linux-musl |
✓ | ✓ |
arm-unknown-linux-musleabi |
✓ | ✓ |
armv7-unknown-linux-musleabi |
✓ | ✓ |
aarch64-unknown-linux-musl |
✓ | ✓ |
x86_64-apple-darwin |
✓ | ✓ |
tool to uncompress, extract and list squashfs filesystems
Usage: unsquashfs-backhand [OPTIONS] [FILESYSTEM]
Arguments:
[FILESYSTEM] Squashfs file
Options:
-o, --offset <BYTES> Skip BYTES at the start of FILESYSTEM [default: 0]
-a, --auto-offset Find first instance of squashfs --kind magic
-l, --list List filesystem, do not write to DEST (ignores --quiet)
-d, --dest <PATHNAME> Extract to [PATHNAME] [default: squashfs-root]
-i, --info Print files as they are extracted
--path-filter <PATH_FILTER> Limit filesystem extraction [default: /]
-f, --force If file already exists then overwrite
-s, --stat Display filesystem superblock information (ignores --quiet)
-k, --kind <KIND> Kind(type of image) to parse [default: le_v4_0] [possible
values: be_v4_0, le_v4_0, avm_be_v4_0]
--completions <COMPLETIONS> Emit shell completion scripts [possible values: bash, elvish,
fish, powershell, zsh]
--quiet Silence all progress bar and RUST_LOG output
-h, --help Print help (see more with '--help')
-V, --version Print version
tool to add a file or directory to squashfs filesystems
Usage: add-backhand [OPTIONS] <INPUT_IMAGE> <FILE_PATH_IN_IMAGE> <OUTPUT_IMAGE>
Arguments:
<INPUT_IMAGE> Squashfs input image
<FILE_PATH_IN_IMAGE> Path of file once inserted into squashfs
<OUTPUT_IMAGE> Squashfs output image path
Options:
-d, --dir Create empty directory
-f, --file <FILE> Path of file to read, to write into squashfs
--mode <MODE> Override mode read from <FILE>
--uid <UID> Override uid read from <FILE>
--gid <GID> Override gid read from <FILE>
--mtime <MTIME> Override mtime read from <FILE>
--pad-len <PAD_LEN> Custom KiB padding length
--no-compression-options Don't emit compression options
-h, --help Print help
-V, --version Print version
tool to replace files in squashfs filesystems
Usage: replace-backhand [OPTIONS] <INPUT_IMAGE> <FILE> <FILE_PATH_IN_IMAGE> <OUTPUT_IMAGE>
Arguments:
<INPUT_IMAGE> Squashfs input image
<FILE> Path of file to read, to write into squashfs
<FILE_PATH_IN_IMAGE> Path of file replaced in image
<OUTPUT_IMAGE> Squashfs output image
Options:
--pad-len <PAD_LEN> Custom KiB padding length
--no-compression-options Don't emit compression options
-h, --help Print help
-V, --version Print version
See BENCHMARK.md.
See backhand-test.