【问题标题】:Find Byte sequence in a very large file using Python使用 Python 在一个非常大的文件中查找字节序列
【发布时间】:2018-12-07 20:11:57
【问题描述】:

我想在一个非常大的文件(文件大小大于 2 GB)中找到以下字节序列,并在这个字节序列之后打印 100 个字节。

0x77 0x??{6-8} 0x78 0x07 0x??{18} 0x87 0x0d 0x00{2}

更新:{6-8} 表示量词。

这类似于字节签名。通常,我会使用 Yara 在文件中搜索此类字节签名。显然,Yara 没有正确处理非常大的文件。

在这里,??表示通配符,所以可以匹配任意字节。

以下 grep 命令在这种情况下也无济于事,因为我的搜索模式包含通配符。

grep -obUaP "<\x-hex pattern>" <file>

也许我需要修改和使用某种类型的正则表达式?

谢谢。

【问题讨论】:

  • 上面的例子是字符串的样子吗(用十六进制值代替通配符)?
  • {6-8} 是否表示量词?
  • 您传递给grep 的模式到底是什么?它当然可以处理各种通配符表达式,但我们无法猜测您是如何尝试传递它们的(除了“显然不正确”)。
  • 我已经更新了这个问题。 {6-8} 表示量词。
  • 该量词是否应用于整个左字节? IE。 0x00{2} 是指0x00 0x00?这些空格是为了便于阅读还是作为文字字符存在?

标签: python regex linux grep


【解决方案1】:

如果您的 shell 是 Bash(或另一个支持 $'...'“C 样式”字符串的 shell)并且您的 grep 是 GNU grep(显然是这样),并且如果我能够正确猜出是什么您的搜索模式的临时表示应该表示,尝试

grep -obUaP $'\x77.{6,8}\x78\x07.{18}\x87\x0d\x00{2}\K.{100}' file

. 匹配任何字节,{m,n} 表示重复前面的模式至少m 和最多n 次,单个{n} 精确重复n 次,而@ 987654331@ 序列以十六进制表示法表示单个字节。 K 表示匹配整个表达式,但只打印 \K 之后的部分(如果你真的想打印签名部分,显然把它去掉)。

但是,因为您的模式中同时包含 \x00\x0d,我认为这不会起作用。如果您的模式只有一个,您可以使用-z(读取“行”直到下一个零字节)或使用默认的面向行的输入。如果你的“任何东西”序列永远不能包含零字节,你可以用(比如)\xfe 临时替换零字节,反之亦然:

tr `\376\000' '\000\376' <file | grep ...

显然,您应该将-z 添加到grep 选项中,并更改模式以查找原始模式为零的\xfe。 (我认为 GNU grep 仍然将\xff 用于其邪恶的内部目的,尽管我无法验证这一点。)

或者毕竟你可以分解并在 Python 中执行此操作。一次读取一个缓冲区(例如 8192 个字节),在该字节字符串中查找模式,然后保留前一次读取的最后 100 多个字节,并将下一个缓冲区附加到保留的序列中,然后循环直到 eof。

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2015-01-07
    相关资源
    最近更新 更多