bitgrep
It's grep for data types. Ever found yourself looking for a specific numerical value/range in a heap of binary files?
Now you can!
Useful for DFIR, security research and general debugging work, especially when you know what you're looking for but don't know where.
Install
Use cargo install
to install the binary from crates.io:
Alternatively you can build a binary using the code from github:
Usage
To find all all the doubles (f64
) with values 29.15 <= x <= 36.0
:
The above command finds all the doubles (f64
) with values 29.15 <= x <= 36.0
.
In order to find a single literal value you can use the --literal
or -l
flag.
Float comparison is approximate with a ULPS of 4 (will be configurable in the future):
You can also filter by entropy to remove values that have a high chance of being noise. Entropy ranges between 0 and 8 where 8 is absolute random data. Entropy greater than 7.5 is usually encrypted or compressed, while between 3.5 and 5 is usually English text.
You can use a pipe with the special -
file path:
|
Currently there is no native support for directory globbing or recursion, if you need to search multiple files you can use the find
command:
Supported Types
Currently bitgrep supports all rust numeric data types (use with --data-type
):
Rust | C |
---|---|
i16 | short |
i32 | int |
i64 | long long |
i128 | __int128 (GCC) |
u16 | unsigned short |
u32 | unsigned int |
u64 | unsigned long long |
u128 | unsigned __int128 |
f32 | float |
f64 | double |
TODO
[!WARNING]
Everything below this point does not exist yet!
Feel free to send pull requests, hopefully I'll get to these before 2026
- Filter files by entropy
- Add pipe support and other unix semantics
- Use stderr
- Color output
- Hex dump output
- Literals search
- Hex search (e.g.
0AAD[33-4A]DF
) - Exclude zeros and special valus (
NaN
, Infinty) - Sane error messages
- Binary releases
- Recursive file search / glob
- Date types
- 32-bit/64-bit Unix epoch (milliseconds, microseconds, seconds)
- Windows
- FILETIME
- SYSTEMTIME
- OLE automation
- CLR Time
- Apple timestamps
- String Search
- UTF-8
- UTF-16
- ASCII code pages
- Search string representations of number range: e.g. "10.2" .. "10.722"
- Regex
- Performance improvements
- Convert to static dispatch
- Rule engine, see below
- Misc
- GUIDs
- IP addresses
- Custom structs
- Refactor printing to different object/trait
Rule engine
TODO: An imagined JSON of a rules file that can be used as a search configuration.
The idea is to have predefined rules for specific scenarios and some level of boolean operators for better filtering.
For example, get me all IPs in binary or string form in the ranges 192.168.1.0 - 192.168.3.255
or 10.0.0.1 - 10.0.30.255