gpt4 book ai didi

python - 使用 Python 在非常大的文件中查找字节序列

转载 作者:太空狗 更新时间:2023-10-29 12:39:22 25 4
gpt4 key购买 nike

我想在一个非常大的文件(文件大小大于 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>

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

谢谢。

最佳答案

如果您的 shell 是 Bash(或另一个支持 $'...' "C-style"字符串的 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 次,\xab 序列表示十六进制符号。 K 表示匹配整个表达式,但只打印 \K 之后的部分(如果你真的想打印签名部分,显然把它去掉)。

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

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

很明显,您会将 -z 添加到 grep 选项,并更改模式以查找原始模式所在的 \xfe有零。 (我认为 GNU grep 仍然将 \xff 用于它自己邪恶的内部目的,尽管我不在可以验证这一点的地方.)

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

关于python - 使用 Python 在非常大的文件中查找字节序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53676244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com