1 个不稳定版本
0.1.5 | 2023年12月20日 |
---|---|
0.1.4 |
|
187 在 调试 中
每月60次下载
86KB
2K SLoC
bitgrep
它是数据类型的 grep。您是否曾经发现自己在一堆二进制文件中寻找特定的数值值/范围?
现在您可以这样做了!
适用于 DFIR、安全研究和通用调试工作,尤其是当您知道您要寻找什么,但不知道在哪里时。
安装
使用 cargo install
从 crates.io 安装二进制文件
$ cargo install bitgrep
$ bitgrep --data-type u32 --file data.raw -m 55 -M 144
或者您也可以使用 GitHub 中的代码构建二进制文件
$ git clone https://github.com/jmpfar/bitgrep.git
$ cd bitgrep
$ cargo build --release
$ target/release/bitgrep --data-type f64 --file data.raw -m 29.15 -M 36.0
使用方法
要找到所有值在 f64
的 doubles 中小于等于 29.15 <= x <= 36.0
$ bitgrep --data-type f64 --file data.raw -m 29.15 -M 36.0
./data.raw: [0x16B6] f64: 34.415624980210914 [9b483333354140]
./data.raw: [0xFDBB] f64: 30.215716721498428 [3d983639373e40]
输出格式是
file_path: [offset] data_type: value [value_in_hex]
选项
为了找到单个字面值,您可以使用 --literal
或 -
标志。浮点比较是近似的,具有 4 个 ULPS(将来将是可配置的)
$ bitgrep --data-type f64 --file data4.raw --literal 29.15385732 \
--endian big
您还可以通过 熵 过滤来去除有高噪声可能性的值。
熵介于 0 和 8 之间,其中 8 代表随机数据。熵大于 7.5 通常表示加密、压缩或随机。英文文本的值在 3.5 和 5 之间。
$ bitgrep --data-type i128 --file data.raw --literal 123 \
--max-entropy 7.5
您可以使用管道与特殊的 -
文件路径一起使用
$ cat data.raw | bitgrep --data-type u8 --file - --literal 3
为了减少包含零字节的二进制文件中的噪声,您可以使用 --exclude-zero
。这排除了所有绝对零值 (0x0
)
$ bitgrep --data-type i32 --file data.raw --min -30 --max 30 \
--exclude-zero
上述命令不会过滤接近零的值(例如 0.00000000000000001
)。这在减少浮点数搜索中的噪声时可能很有用。或者,可以使用
$ bitgrep --data-type f64 --file data.raw --min -30.0 --max 30.0 \
--exclude-literal 0.0
目前没有对目录通配符或递归的原生支持,如果您需要搜索多个文件,可以使用 find
命令
$ find . -type f -exec bitgrep \
--data-type i32 --file {} --max -78 --min -83 \
--endian little \;
支持的数据类型
目前 bitgrep 支持所有 Rust 数值数据类型(使用 --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 |
待办事项
[!警告]
以下所有内容尚未存在!
欢迎发送 pull request,希望我能在 2026 年之前处理这些
- 通过 熵 过滤文件
- 添加管道支持和其他 Unix 语义
- 使用 stderr
- 彩色输出
- 十六进制转储输出
- 字面量搜索
- 十六进制搜索(例如
0AAD[33-4A]DF
) - 排除零
- 排除近似字面量值
- 合理的错误消息
- 排除极端指数值
- 二进制发布
- 递归文件搜索 / 通配符
- 日期类型
- 32 位/64 位 Unix 纪元(毫秒、微秒、秒)
- Windows
- FILETIME
- SYSTEMTIME
- OLE 自动化
- CLR 时间
- Apple 时间戳
- 字符串搜索
- UTF-8
- UTF-16
- ASCII 编码页
- 搜索数字范围的字符串表示:例如 "10.2" .. "10.722"
- 正则表达式
- 性能改进
- 转换为静态分派
- 搜索时无需将字节转换为数字
- 锁定和缓冲 stdout
- 规则引擎,见下文
- 杂项
- GUIDs
- IP 地址
- 自定义结构
- 债务
- 重构打印到不同的对象/特质
- 添加集成测试
- 创建配置 => 扫描器构建器
- 过滤器到枚举
- 添加金测试
规则引擎
待办事项:一个假想的规则文件 JSON,可以用作搜索配置。
{
"filters": {
"file": {
"magic": "0xABDEF",
"types": [
{
"double": { "min": 80.3432, "max": 82.221112, "exclude-zero": true }
},
{ "double": { "min": -32.865, "max": 31.53221, "exclude-zero": true } },
{ "string": { "literal": "AMAzING" } },
{ "string": { "regex": "12334+" } },
{ "bytes": { "literal": "0xDEADBEEF" } },
{ "integer": { "min": -10, "max": 12, "as_string": true } }
],
"entropy": {
"max": 6
}
}
}
}
的想法是,对于特定场景有预定义的规则,以及一定程度的布尔运算符以更好地过滤。
例如,获取所有在以下范围内的二进制或字符串形式的 IP:192.168.1.0 - 192.168.3.255
或 10.0.0.1 - 10.0.30.255
依赖关系
~1.6–2.3MB
~44K SLoC