36

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

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

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

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

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

数値が格納されているすべての場所を検索して数値を絞り込もうとしています。それからもう一度やり直して、新しい値が同じメモリ位置に格納されているかどうかを確認します。

私は16進値を探しているので、grepで何もすることができません。そのため、何度も試してみましたが(大まかに何十兆回も)、正しい出力が得られません。

16 進数のダンプは完全なバイナリ ファイルにすぎません。バイト?

パターンは、私が認識している行をラップしていません。私はそれが何に変わるかを認識しており、同じプロセスを実行してリストを比較して、どれが一致するかを確認できます。通常、16 進ダンプは (合計で) 100 メガ程度になります。

Perl も選択肢の 1 つかもしれませんが、現時点では、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.....
4

6 に答える 6

20

Python で書かれたbinwalkという非常に便利なツールもあります。これは、バイナリ パターン マッチング (およびそれ以外にも多数) を提供します。10 進数と 16 進数でオフセットを出力するバイナリ文字列を検索する方法は次のとおりです ( docsから)。

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

grepには-Pスイッチがあり、perl regexp構文を使用できます。perlregexでは、\x..構文を使用してバイトを確認できます。

したがって、次のファイルで特定の16進文字列を検索できます。grep -aP "\xdf"

しかし、outptはあまり役に立ちません。実際、hexdump出力で正規表現を実行する方が適切です。

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

于 2013-02-22T10:03:46.497 に答える
7

私はちょうどこれを使用しました:

grep -c $'\x0c' filename

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

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

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

私がgrepしている文字がうまく印刷されず、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 に答える