web-dev-qa-db-ja.com

grepを使用してファイル内の16進文字列を検索する

私はこれを機能させるために一日中努力してきました。ファイル内の16進文字列のオフセットを取得するために、grepなどを取得する方法を知っている人はいますか?

文字列を確認してから再度実行し、値が変更されたかどうかを確認する必要がある16進ダンプがたくさんあります。

Hexdumpとddを試しましたが、問題はストリームであるため、ファイルのオフセットが失われます。

誰かにこの問題と回避策があったに違いありません。私に何ができる?

明確にするために、GDBからダンプされた一連のメモリ領域があります。

私は番号が格納されているすべての場所を検索して番号を絞り込もうとしています。その後、再度実行して、新しい値が同じメモリ位置に格納されているかどうかを確認します。

16進数の値を探しているので、grepに何もすることができません。

16進ダンプは完全なバイナリファイルであり、パターンはフロート値の範囲内にあるため、8ですか?バイト?

パターンは私が知っている行をラップしていません。変更点を認識しており、同じプロセスを実行してリストを比較し、一致するものを確認できます。通常、16進ダンプは(合計で)100メガバイトになります。

Perlはオプションである可能性がありますが、この時点では、bashとそのツールに関する知識が不足していることが主な原因です。

実際に出力が得られないので、出力を説明するのは少し難しいです。

私は次のような線に沿って何かを予想しています(そして期待しています):

<offset>:<searched value>

これは、私が通常grep -URbFo <searchterm> . > <output>で取得する標準出力です。

問題は、16進数の値を検索しようとすると、16進数の値を検索しない場合に問題が発生するため、00を検索すると、100万ヒットのようになるはずです。 00はテキストであるため、16進数では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.....
26
user650649

許容可能な解決策に到達する前に、いくつかのことを試しました。

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.....
--------------------^^

したがって、ORされた正規表現を使用して 'DF' OR '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............
--------------------------------------------^^
12
shellter

これは私のために働くようです:

grep --only-matching --byte-offset --binary --text --Perl-regexp "<\x-hex pattern>" <file>

ショートフォーム:

grep -obUaP "<\x-hex pattern>" <file>

例:

grep -obUaP "\x01\x02" /bin/grep

出力(cygwinバイナリ):

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

したがって、これを再度grepしてオフセットを抽出できます。ただし、バイナリモードを再度使用することを忘れないでください。

56
Fr0sT

Pythonで記述された binwalk と呼ばれる非常に便利なツールもあります。 10進数と16進数でオフセットを出力するバイナリ文字列を検索する方法は次のとおりです( docs から)。

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.bin
DECIMAL     HEX         DESCRIPTION
--------------------------------------------------------------------------
377654      0x5C336     Raw string signature
11
Pierz

grepには-Pスイッチがあり、Perl正規表現を使用して、\ x ..構文を使用してバイトを調べることができます。

そのため、ファイル内の特定の16進文字列を検索するには、grep -aP "\xdf"

しかし、アウトポイントはあまり役に立ちません。実際、hexdumpの出力に正規表現を使用する方が適切です。

ただし、grep -Pは、特定のバイナリパターンに一致するファイルを見つけるのに便利です。または、実際にテキストで発生するパターンのバイナリクエリを実行するには(たとえば、 CJK表意文字(utf-8)を正規表現する方法 を参照)

9
Pablo Saratxaga

印刷可能な文字列を検索する場合は、次を使用できます。

strings -ao filename | grep string

文字列はall printableオフセット付きのバイナリからの文字列を出力し、grepは内部を検索します。

バイナリ文字列を検索する場合は、次のようにします。

5
jm666

私はこれを使用しました:

grep -c $'\x0c' filename

ファイル内のページ制御文字を検索してカウントするには。

したがって、出力にオフセットを含めるには:

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

グレープの対象となる文字がうまく印刷されず、結果がきれいに表示されるため、結果をより少なくパイプします。出力例:

21:^L
23:^L
2005:^L
4
user3510073