#binary-data #binary #cybersecurity #grep #forensics #security #dfir

bin+lib bitgrep

二进制 grep 用于数值数据类型

1 个不稳定版本

0.1.5 2023年12月20日
0.1.4 2023年12月12日

187调试

Download history

每月60次下载

Apache-2.0

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 年之前处理这些

  1. 通过 过滤文件
  2. 添加管道支持和其他 Unix 语义
  3. 使用 stderr
  4. 彩色输出
  5. 十六进制转储输出
  6. 字面量搜索
  7. 十六进制搜索(例如 0AAD[33-4A]DF
  8. 排除零
  9. 排除近似字面量值
  10. 合理的错误消息
  11. 排除极端指数值
  12. 二进制发布
  13. 递归文件搜索 / 通配符
  14. 日期类型
    1. 32 位/64 位 Unix 纪元(毫秒、微秒、秒)
    2. Windows
      1. FILETIME
      2. SYSTEMTIME
      3. OLE 自动化
      4. CLR 时间
    3. Apple 时间戳
  15. 字符串搜索
    1. UTF-8
    2. UTF-16
    3. ASCII 编码页
    4. 搜索数字范围的字符串表示:例如 "10.2" .. "10.722"
    5. 正则表达式
  16. 性能改进
    1. 转换为静态分派
    2. 搜索时无需将字节转换为数字
    3. 锁定和缓冲 stdout
  17. 规则引擎,见下文
  18. 杂项
    1. GUIDs
    2. IP 地址
    3. 自定义结构
  19. 债务
    1. 重构打印到不同的对象/特质
    2. 添加集成测试
    3. 创建配置 => 扫描器构建器
    4. 过滤器到枚举
    5. 添加金测试

规则引擎

待办事项:一个假想的规则文件 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.25510.0.0.1 - 10.0.30.255

依赖关系

~1.6–2.3MB
~44K SLoC