36

我整天都在努力让它发挥作用。有谁知道如何获取 grep 或类似的东西来检索文件中十六进制字符串的偏移量?

我有一堆 hexdump 需要检查字符串,然后再次运行并检查值是否已更改。

我试过 hexdump 和 dd,但问题是因为它是一个流,我丢失了文件的偏移量。

一定有人遇到过这个问题和解决方法。我能做些什么?

澄清一下,我有一系列来自 GDB 的转储内存区域。

我试图通过搜索存储数字的所有位置来缩小数字范围,然后再次执行并检查新值是否存储在同一内存位置。

我无法让 grep 做任何事情,因为我正在寻找十六进制值,所以我尝试过的所有时间(大致就像一个 bazillion)它不会给我正确的输出。

十六进制转储只是完整的二进制文件,模式在浮点值范围内,所以 8?字节?

这些模式没有包裹我所知道的线条。我知道它会发生什么变化,我可以执行相同的过程并比较列表以查看哪个匹配项。十六进制转储通常最终(总共)100 megs-ish。

Perl 可能是一种选择,但在这一点上,我认为我缺乏对 bash 及其工具的了解是罪魁祸首。

解释我得到的输出有点困难,因为我真的没有得到任何输出..

我期待(并期待)以下内容:

<offset>:<searched value>

这是我通常会得到的非常好的标准输出grep -URbFo <searchterm> . > <output>

问题是,当我尝试搜索十六进制值时,如果不搜索十六进制值,我会遇到问题,所以如果我搜索 00 我应该得到一百万次点击,因为那总是空格,而是搜索00 作为文本,所以在十六进制,3030。有什么想法吗?

我可以通过 hexdump 或其他链接强制它,但因为它是一个流,它不会给我它找到匹配项的偏移量和文件名。

使用grep -b选项似乎也不起作用,我确实尝试了所有对我的情况有用的标志,但没有任何效果。

xxd -u /usr/bin/xxd举个例子,我得到一个有用的输出,但我不能用它来搜索..

0004760: 73CC 6446 161E 266A 3140 5E79 4D37 FDC6  s.dF..&j1@^yM7..
0004770: BF04 0E34 A44E 5BE7 229F 9EEF 5F4F DFFA  ...4.N[."..._O..
0004780: FADE 0C01 0000 000C 0000 0000 0000 0000  ................

不错的输出,正是我想看到的,但在这种情况下它对我不起作用..

这是我发布后尝试过的一些事情:

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....

root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H 'DF'
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....
4

6 回答 6

74

这似乎对我有用:

LANG=C grep --only-matching --byte-offset --binary --text --perl-regexp "<\x-hex pattern>" <file>

简写:

LANG=C grep -obUaP "<\x-hex pattern>" <file>

例子:

LANG=C grep -obUaP "\x01\x02" /bin/grep

输出(cygwin 二进制):

153: <\x01\x02>
33210: <\x01\x02>
53453: <\x01\x02>

因此,您可以再次 grep 以提取偏移量。但不要忘记再次使用二进制模式。

注意:LANG=C需要避免 utf8 编码问题。

于 2013-06-18T12:27:00.137 回答
20

还有一个非常方便的工具叫做binwalk,用 python 编写,它提供二进制模式匹配(除此之外还有很多)。以下是搜索二进制字符串的方法,该字符串以十进制和十六进制输出偏移量(来自文档):

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.bin
DECIMAL     HEX         DESCRIPTION
--------------------------------------------------------------------------
377654      0x5C336     Raw string signature
于 2013-12-10T13:07:54.910 回答
14

在得出可接受的解决方案之前,我们尝试了几件事:

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....


root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H 'DF'
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....

然后发现我们可以得到可用的结果

xxd -u /usr/bin/xxd > /tmp/xxd.hex ; grep -H 'DF' /tmp/xxd

请注意,使用像“DF”这样的简单搜索目标将错误地匹配跨越字节边界的字符,即

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....
--------------------^^

因此,我们使用 ORed 正则表达式来搜索“DF”或“DF”(searchTarget 前面或后面跟一个空格字符)。

最后的结果好像

xxd -u -ps -c 10000000000 DumpFile > DumpFile.hex
egrep ' DF|DF ' Dumpfile.hex

0001020: 0089 0424 8D95 D8F5 FFFF 89F0 E8DF F6FF  ...$............
-----------------------------------------^^
0001220: 0C24 E871 0B00 0083 F8FF 89C3 0F84 DF03  .$.q............
--------------------------------------------^^
于 2011-06-13T00:23:31.110 回答
11

grep 有一个 -P 开关,允许使用 perl regexp 语法 perl regex 允许使用 \x.. 语法查看字节。

因此您可以在文件中查找给定的十六进制字符串:grep -aP "\xdf"

但是输出不会很有用;确实更好地对 hexdump 输出进行正则表达式;

grep -P 可以用于查找匹配给定二进制模式的文件。或者对文本中实际发生的模式进行二进制查询(参见例如How to regexp CJK ideographs (in utf-8)

于 2013-02-22T10:03:46.497 回答
7

我刚用这个:

grep -c $'\x0c' filename

在文件中搜索和计算页面控制字符..

所以要在输出中包含一个偏移量:

grep -b -o $'\x0c' filename | less

我只是将结果传递给 less 因为我正在寻找的字符打印效果不好,而 less 可以干净地显示结果。输出示例:

21:^L
23:^L
2005:^L
于 2014-05-20T11:00:12.473 回答
6

如果要搜索可打印字符串,可以使用:

strings -ao filename | grep string

strings 将从带有偏移量的二进制文件中输出所有可打印的字符串,并且 grep 将在其中进行搜索。

如果您想搜索任何二进制字符串,这是您的朋友:

于 2011-06-12T07:42:18.520 回答