我试图获取 LUKS 标头的位置:
grep -a -b -P --only-matching 'LUKS\xba\xbe' /dev/sdb
它已经内存不足了。
有些人建议我使用“bgrep”来代替,但我不知道如何让它工作。
bgrep -A 20 'LUKS\xba\xbe' /dev/sda
./bgrep: invalid 2-hex-digit byte value: 'LU'
那么如何使这项工作有效呢?
答案1
grep
由于它读取到行尾,因此往往会耗尽内存,但在二进制数据中,可能很长时间都不会出现行尾。您仍然可以通过 grep 小于内存大小的块来使用 grep,大致如下:
# dd bs=1M iflag=fullblock if=/dev/sdb skip=X count=Y | grep ...
冲洗并重复所有块。如果您不确定数据是否正确对齐,请使块重叠一些(接下来的 X=X+Y-1)。
或者,strings
会大概避免内存耗尽部分(不太可能出现很长的可打印 ASCII 行)。然后你有一个要检查的偏移量列表。这些可能是错误匹配,因为strings
排除了该\xba\xbe
部分。
# strings -t d -n 4 /dev/sdb | grep 'LUKS$'
11534336 LUKS
23068672 LUKS
34603008 LUKS
# losetup --find --show --offset=23068672 /dev/sdb
/dev/loop9
# cryptsetup luksDump /dev/loop9
testdisk
类似or 的工具binwalk
(带有自定义魔术签名)也许能够更有效地定位 LUKS 标头。但对于快速破解来说,strings
通常效果很好。