从一个非常大的二进制文件中搜索一个大的二进制值

5
正如标题所示,我想要在一个相当大的二进制文件(约100MB)中搜索一个二进制字符串 - 这个二进制字符串只有不到5K。
我尝试过使用grep命令,并加上-P选项,但是当模式超过大约100字节时,它似乎只返回了一些匹配项,而没有找到所有的匹配项。
我还尝试过bgrep。这最初效果很好,但是当我需要将模式扩展到现在的长度时,它只会出现“无效/空搜索字符串”错误。
具有讽刺意味的是,在Windows中,我可以使用HxD搜索文件并在实例中找到它。但我真正需要的是一个Linux命令行工具。
感谢您的帮助,
Simon

我们确实需要更多关于搜索模式的信息。请注意,perl -P 需要 perl 风格的正则表达式。那真的是你想要的吗?据我所知,HxD 根本不支持正则表达式... - sehe
不是很准确。-P只是我过去用来让grep为我查找二进制匹配项的东西。我并不真正关心正则表达式。我只需要在多个文件中查找一个大的、静态的二进制模式。 - Simon
4个回答

2

假设我们有几个大型二进制数据文件。对于一个不应该匹配的大文件,我们创建一个100MB的文件,其内容都是NUL字节。

dd ibs=1 count=100M if=/dev/zero of=allzero.dat

对于我们想要匹配的文件,创建一百个随机的兆字节。

#! /usr/bin/env perl

use warnings;

binmode STDOUT or die "$0: binmode: $!";

for (1 .. 100 * 1024 * 1024) {
  print chr rand 256;
}

将其作为./mkrand >myfile.dat执行。

最后,从中提取一个已知匹配项,并将其保存到名为pattern的文件中。

dd skip=42 count=10 if=myfile.dat of=pattern

我假设您只想要与之匹配的文件(-l),并且希望将您的模式视为字面值(-F--fixed-strings)。 我怀疑您可能会在使用-P时遇到长度限制问题。

您可能会尝试使用--file=PATTERN-FILE选项,但是grepPATTERN-FILE的内容解释为以换行符分隔的模式,因此在您的5KB模式包含换行符的情况下,您将遇到编码问题。

所以,希望您的系统的ARG_MAX足够大并开始操作。确保引用pattern的内容。例如:

$ grep -l --fixed-strings "$(cat pattern)" allzero.dat myfile.dat
myfile.dat

0

你可能想看一下一个简单的Python脚本。

match= (b"..." 
    b"...."
    b"..." ) # Some byte string literal of immense proportions
with open("some_big_file","rb") as source:
    block= read(len(match))
    while block != match:
        byte= read(1)
        if not byte: break
        block= block[1:]+read(1)

这可能在Linux和Windows下都能可靠地工作。


0

尝试使用grep -U,它将文件视为二进制文件。

另外,您如何指定搜索模式?它可能只需要转义以在shell参数扩展中生效。


目前我正在使用 grep -U -P "\xE1\x01\x08\x73\xE3\x03...." bigfile。我该如何进行转义?此外,有没有办法让 grep 从文件中读取模式?我尝试了 -f 但没有成功。谢谢。 - Simon

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接