resq-bin
Version:v0.1.16· License:Apache-2.0· Crate: crates.io · API docs: docs.rs
Capabilities
- Multi-format binary parsing — ELF, Mach-O, PE, and WASM via the
objectcrate. - Dual disassembly backends — Capstone for high-quality instruction decoding (x86_64, AArch64), with automatic fallback to
llvm-objdump/objdumpfor missing functions. - Interactive TUI — Three-pane terminal interface (Targets, Functions, Disassembly) with regex search, function filtering, and keyboard navigation.
- CLI output modes — Human-readable plain text and structured JSON for CI pipelines and tooling integration.
- Smart caching — Persistent analysis cache keyed on file path, size, modification time, and analysis options. Falls back to CRC32 content hashing when mtime is unavailable.
- Batch analysis — Recursive directory scanning with extension filtering for analyzing entire build output trees.
- Read-only operation — Never mutates inspected binaries.
Architecture
Installation
System Requirements
- Rust: Latest stable toolchain.
- Capstone: The
capstonecrate bundles its own copy; no system library required. - objdump (optional):
llvm-objdumporobjdumponPATHenables the fallback disassembly backend. Analysis works without it, but some functions may lack disassembly when Capstone cannot decode them.
CLI Reference
Arguments
| Flag | Default | Description |
|---|---|---|
--file <path> | — | Analyze a single binary file. Mutually exclusive with --dir. |
--dir <path> | — | Analyze all object-like files under a directory. Mutually exclusive with --file. |
--recursive | false | Recurse into subdirectories when using --dir. |
--ext <suffix> | — | Filter files by suffix in --dir mode (e.g., .so, .o). |
--no-disasm | false | Skip disassembly; collect only metadata (sections, symbols, entry point). |
--max-functions <n> | 40 | Maximum number of functions to disassemble per binary. |
--config <path> | .resq-bin-explorer.toml | Path to a TOML configuration file. |
--no-cache | false | Disable the result cache entirely (no reads or writes). |
--rebuild-cache | false | Ignore existing cache entries and re-analyze all targets. New results are still cached. |
--tui | — | Force interactive TUI mode. Mutually exclusive with --json and --plain. |
--plain | false | Emit a human-readable non-interactive report. Mutually exclusive with --json and --tui. |
--json | false | Emit a structured JSON report. Mutually exclusive with --plain and --tui. |
--tui, --plain, or --json is specified, the output mode is determined automatically: TUI if stdout is a terminal, plain text otherwise.
Usage Examples
Single file — interactive TUI (default on a terminal)
Single file — plain text report
Single file — JSON output (for CI)
Directory scan — recursive with extension filter
Batch analysis — metadata only (fast)
Force TUI with a non-default config
Rebuild cache after recompilation
TUI Mode
The interactive TUI provides a three-pane layout for exploring binary analysis results.Layout
Keyboard Shortcuts
| Key | Action |
|---|---|
q / Esc | Quit the TUI |
Tab | Cycle focus forward: Targets -> Functions -> Disassembly |
Shift+Tab | Cycle focus backward |
Left / Right | Switch focus between panes |
Up / k | Navigate up in the focused pane |
Down / j | Navigate down in the focused pane |
Page Up | Scroll disassembly up by 12 lines |
Page Down | Scroll disassembly down by 12 lines |
Home | Scroll disassembly to top |
/ | Open function substring filter dialog |
? | Open disassembly regex search dialog (case-insensitive) |
c | Clear the active function filter |
n | Jump to next match (function filter or disassembly regex) |
N | Jump to previous match |
h | Toggle help overlay |
Cache System
resq-bin maintains a persistent cache of analysis results to avoid redundant heavy disassembly work on unchanged binaries.Cache Location
The default cache directory is.cache/resq/bin-explorer relative to the working directory. This can be overridden with the cache_dir key in the configuration file.
Cache Key Computation
Each cache entry is keyed by a CRC32 hash of a fingerprint string that includes:- Protocol version (
v5) — cache is automatically invalidated on schema changes. - Canonical file path — absolute path to the binary.
- File size — byte length from filesystem metadata.
- Analysis options — disassembly enabled/disabled, max functions, max symbols, max instructions per function.
- Modification time — nanosecond-precision mtime when available.
- Content CRC32 — full file content hash as a fallback when mtime is unavailable (e.g., some network filesystems).
Cache Behavior
| Scenario | Behavior |
|---|---|
| Default | Read from cache on hit; write new entries after analysis. |
--no-cache | Bypass cache entirely. No reads, no writes. |
--rebuild-cache | Ignore existing entries but write fresh results. |
| Binary recompiled | Cache miss (mtime or size changed); automatic re-analysis. |
| Options changed | Cache miss (different max_functions, disasm toggle, etc.). |
Cache Storage Format
Each entry is stored as a JSON file named{crc32_hex}.json containing the full BinaryReport structure.
Configuration File
resq-bin reads an optional TOML configuration file. By default it looks for.resq-bin-explorer.toml in the current directory, or you can specify a path with --config.
Format
JSON Output Format
The--json flag emits a single JSON object with three top-level fields:
Field Reference
| Field | Type | Description |
|---|---|---|
stats.total | integer | Number of files considered for analysis. |
stats.processed | integer | Number of files successfully analyzed. |
stats.failed | integer | Number of files that produced errors. |
stats.cache_hits | integer | Number of results served from cache. |
reports[].format | string | Object file format (Elf, Pe, MachO, Wasm). |
reports[].architecture | string | CPU architecture (X86_64, Aarch64, etc.). |
reports[].entry | integer | Entrypoint virtual address. |
reports[].disassembly_backend | string or null | Backend used: capstone, objdump, capstone+objdump, or null. |
reports[].disassembly_coverage | object or null | Counts of functions decoded by each backend. |
issues[].path | string | Path to the file that failed analysis. |
issues[].error | string | Error message describing the failure. |