我需要从hexdump输出中找到重复出现的模式。 输出文件中的每一行都是:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
其中00
是十六进制的字节。
图案不是固定长度,但它们总是在一行中。
我知道如何做到这一点,但我想知道你认为最有效的方法是什么,比如有一些我不知道的已知算法。
另外,我想用Python编写代码。
任何建议都表示赞赏:)
由于
修改 我需要在磁盘转储中找到分区引导扇区。问题是文件系统不常见所以我需要扫描hexdump以找到经常使用的模式,以限制研究领域。
例如,我正在寻找像:
这样的字节模式00 56 f0 43 d0
答案 0 :(得分:1)
您是否知道要搜索的子字符串,或者是否需要首先发现一组查询子字符串,这一点并不明显。我认为可以通过找到频繁发生的n-gram来实现这一发现。你有一组查询子串,你可以继续它们的位置,它们之间的距离(例如,如果某个子串每1024字节出现一次,可能是一个块大小)。
步骤1:读取你的hexdump文件并将其转换回单个字符串。我会把细节留给你。
步骤2:对于每个有趣的n值(比如3,4,5(如你的例子),6等)使用这个函数:
from collections import Counter # needs 2.7
from operator import itemgetter
def get_ngrams(strg, n, top=10, min_count=2):
counter = Counter()
for i in xrange(len(strg) - n + 1):
gram = strg[i:i+n]
counter[gram] += 1
sort_these = [(gram, count) for gram, count in counter.iteritems() if count >= min_count]
best = sorted(sort_these, key=itemgetter(1), reverse=True)[:top]
return best
这将为您提供最频繁发生的子串。
第3步:出现这些字符串的地方:
def multifind(strg, gram):
positions = []
end = len(strg)
pos = 0
while pos < end:
pos = strg.find(gram, pos)
if pos == -1:
break
positions.append(pos)
pos += 1
return positions
第4步:这些事件的距离是多远:
deltas = [b - a for a, b in zip(positions, positions[1:])]