我有一个像这样的二进制文件(打开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
。