Skip to content

wcampbell0x2a/backhand

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,540 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

backhand

github crates.io docs.rs build status Codecov

Library and binaries for the reading, creating, and modification of SquashFS file systems.

  • Library — Backhand provides an easy way for programmatic analysis of Squashfs 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 and 3.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. This is controlled from unsquashfs-backhand through the use of the --kind option.

Squashfs Support

Kind read write Feature
be_v4_0 default
le_v4_0 default
avm_be_v4_0 default
be_v3_0 v3
le_v3_0 v3
be_v3_0_lzma v3_lzma
le_v3_0_lzma v3_lzma
netgear_be_v3_0_lzma v3_lzma
netgear_be_v3_0_lzma_standard v3_lzma
be_v3_0_lzma_swap v3_lzma
le_v3_0_lzma_swap v3_lzma

Library

Compiler support: requires rustc 1.86+

Add the following to your Cargo.toml file:

[dependencies] backhand = "0.25.0"

Target Support

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

Reading/Writing/Modifying Firmware

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();

Binaries

Compiler support: requires rustc 1.86+

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.

Target Support

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

unsquashfs-backhand

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. If not specified, will auto-detect by trying all kinds [possible values: le_v4_0, be_v4_0, le_v3_0, be_v3_0, le_v3_0_lzma, be_v3_0_lzma, netgear_be_v3_0_lzma_standard, netgear_be_v3_0_lzma, 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 

add-backhand

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 

replace-backhand

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 

Development

All patches/merge requests are welcome! See the development guide for more details. DEVELOPMENT.md.

Performance

See BENCHMARK.md.

Testing

See backhand-test.

About

Library and binaries for the reading, creating, and modification of SquashFS file systems

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Sponsor this project

 

Packages

 
 
 

Contributors

Languages