使用grep搜索文件中的十六进制字符串

use*_*649 27 bash awk grep dd xargs

我一直在努力让这个工作起来.有谁知道如何获取grep或类似的东西来检索文件中的十六进制字符串的偏移量?

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

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

有人必须遇到这个问题和解决方法.我能做什么?

为了澄清,我有一系列来自GDB的转储内存区域.

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

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

十六进制转储只是完整的二进制文件,paterns在浮动值范围内大到8个?字节?

模式并没有包裹我所知道的线条.我知道它改变了什么,我可以做同样的过程并比较列表以查看哪个匹配.十六进制转储通常最终(总共)100兆位.

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

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

我期待(并期待)一些事情:

<offset>:<searched value>
Run Code Online (Sandbox Code Playgroud)

这是我通常会得到的非常好的标准输出 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  ................
Run Code Online (Sandbox Code Playgroud)

不错的输出,就像我看到的那样,但在这种情况下它对我不起作用..

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

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.....
Run Code Online (Sandbox Code Playgroud)

Fr0*_*0sT 56

这似乎对我有用:

grep --only-matching --byte-offset --binary --text --perl-regexp "<\x-hex pattern>" <file>
Run Code Online (Sandbox Code Playgroud)

简写:

grep -obUaP "<\x-hex pattern>" <file>
Run Code Online (Sandbox Code Playgroud)

例:

grep -obUaP "\x01\x02" /bin/grep
Run Code Online (Sandbox Code Playgroud)

输出(cygwin二进制):

153: <\x01\x02>
33210: <\x01\x02>
53453: <\x01\x02>
Run Code Online (Sandbox Code Playgroud)

所以你可以再次grep这个来提取偏移量.但是别忘了再次使用二进制模式.

  • 得到它了; UTF8搞砸了这一点.这有效:`LANG = C grep -obUaP"\ x53\xEF"system.raw.img.tmp` (10认同)
  • 不幸的是,我无法使用它来搜索其中包含“\x0A”的十六进制字符串。我必须编写自己的十六进制搜索工具。 (5认同)
  • 警告:达尔文(OS X),因此大概也是BSD的grep没有--perl-regexp选项. (4认同)
  • 注意:这不能可靠地工作!我正在搜索 .o 文件以及生成的文件。仅显示一些 .o 文件,但显示结果文件。所以还存在一些问题。`\x04\xe7\x88\x2f\x00\x2f\x2a` 不起作用,但 `\xe7\x88\x2f\x00\x2f\x2a` 找到更多结果,尽管 `\x04` *存在*。 (2认同)

she*_*ter 12

在达成可接受的解决方案之前,我们尝试了几项:

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.....
Run Code Online (Sandbox Code Playgroud)

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

xxd -u /usr/bin/xxd > /tmp/xxd.hex ; grep -H 'DF' /tmp/xxd
Run Code Online (Sandbox Code Playgroud)

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

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

因此我们使用ORed正则表达式来搜索'DF'或'DF'(searchTarget前面或后面跟一个空格char).

最终的结果似乎是

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............
--------------------------------------------^^
Run Code Online (Sandbox Code Playgroud)

  • `xxd` 有 `-g` 选项,可以帮助你防止跨两个字节的匹配。即使用`xxd -g1`代替`xxd`。 (3认同)
  • 实际上我最终用于xxd的是:xxd -ps -u -c 100000000000000000000 input.file> output.file以便除去多余的信息并给我原始的十六进制.这给了我一种使用grep来搜索十六进制本身的方法,但是当它返回一个偏移量时,记得将偏移量除以2得到实际的偏移量.非常感谢你的帮助!哦,我还不能投票了.. (2认同)

Pie*_*erz 11

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

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.bin
DECIMAL     HEX         DESCRIPTION
--------------------------------------------------------------------------
377654      0x5C336     Raw string signature
Run Code Online (Sandbox Code Playgroud)


小智 9

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

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

但是外面的意义不大; 确实最好在hexdump输出上做一个正则表达式;

然而,grep -P可以用于查找匹配给定二进制模式的文件.或者对文本中实际发生的模式进行二进制查询(例如,参见如何regexp CJK表意文字(在utf-8中))


小智 7

我只是用这个:

grep -c $'\x0c' filename
Run Code Online (Sandbox Code Playgroud)

搜索并计算文件中的页面控制字符。

因此,要在输出中包含偏移量:

grep -b -o $'\x0c' filename | less
Run Code Online (Sandbox Code Playgroud)

我只是将结果传递给 less,因为我要搜索的字符打印得不好,并且 less 干净地显示了结果。输出示例:

21:^L
23:^L
2005:^L
Run Code Online (Sandbox Code Playgroud)


jm6*_*666 5

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

strings -ao filename | grep string
Run Code Online (Sandbox Code Playgroud)

字符串将输出具有偏移量的二进制文件中的所有可打印字符串,grep将在其中搜索.

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