如何在二进制文件中的字符串中 grep 十六进制值?

如何在二进制文件中的字符串中 grep 十六进制值?

我有一个像这样的二进制文件(打开Emacs十六进制模式):如何查找文件中是否存在十六进制值“22081b00081f091d2733170d123f3114”?

00000000: 2b08 1b00 1418 0825 0407 3830 271d 170d  +......%..80'...
00000010: 2208 1b00 081f 091d 2733 170d 123f 3114  ".......'3...?1.
00000020: 1909 1b00 0934 1f10 2503 3803 111c 3821  .....4..%.8...8!

在我的示例中,它应该返回一个命中,因为我正在寻找的十六进制值位于地址 0x10。

答案1

您可以使用:

xxd -p /your/file | tr -d '\n' | grep -c '22081b00081f091d2733170d123f3114'

如果内容匹配则返回 1,否则返回 0。

xxd -p将文件转换为纯十六进制转储,tr -d '\n'删除添加的换行符xxd,并grep -c计算匹配的行数。

这样,无论输入在文件中的位置如何,它都会被匹配(如果在您的示例中它位于位置 0x18,它将被一分为二,如果不使用 ,grep 将无法匹配它tr)。但是,您不知道它在文件中的位置。

答案2

使用更高版本的 grep,您绝对可以进行十六进制字符串搜索等。您可以使用 full 来执行此操作正则表达式(正则表达式)能力,例如“找到这个十六进制序列,后面跟着1一个或多个0,然后跟着与这个和这个正则表达式匹配的文本”

grep -aPo '\x01\x00\x00\x00[0-z]+\x00\x00\x00[0-z]+' <file>

确实将文件中的登录名/密码对与用于控制和检索某些 IP-DVR 系统中的 DHAV 格式视频的协议流的二进制转储相匹配。也就是说,匹配的部分必须包含十六进制代码的字节,0x01 0x00 0x00 0x00后跟 ASCII 登录名0x00,然后是另外两个0字节,然后是密码。

答案3

grep无法单独执行此操作 - 它在更高级别运行并搜索编码文本。

一种解决方案是od将二进制文件转换为十六进制,然后以 ASCII 格式输出,然后将其输入到 grep 中搜索十六进制字符串:

od -t x -A n <input_file> | grep <hex string>

但是,这会导致进一步的问题,因为它会插入换行符和空格来格式化十六进制。要解决这个问题,您可以尝试使用sed

相关内容