web-dev-qa-db-ja.com

画像ファイルまたはディスクをスキャンしてパターンを探し、その場所を返します

ブロックデバイスまたは画像ファイルがあるとします。また、バイトのシーケンス、文字列、または検索パターンもあるとします。このようなパターンや文字列の出現位置を取得するにはどうすればよいですか?そのためのツールはありますか?

5
Melab

簡単な解決策は、

grep -aob "string to find" /dev/blockdev
  • 「a」スイッチはファイルをテキストとして扱うため、出力を表示します。「o」スイッチは、出力を検索対象のオフセットと文字列に制限して、バイナリガベージを取得しないようにし、「b」スイッチはそれを通知します。バイトオフセットも出力します。
3
davidgo

この質問には、正確に何を検索したいかに応じて、複数の回答があります。

バイナリファイル内のすべての文字列を検索する場合、コマンドはstrings:from マニュアル

strings(1)

名前

strings-印刷可能な文字の文字列をファイルに出力します。

....指定されたファイルごとに、GNUstringsは、少なくとも4文字の長さの印刷可能な文字シーケンスを出力します(または以下のオプションで指定された番号)そしてその後に印刷不可能な文字が続きますデフォルトでは、オブジェクトファイルの初期化およびロードされたセクションからの文字列のみを印刷します;他のタイプのファイルの場合、ファイル全体から文字列を印刷します。

代わりに、バイナリファイルでバイナリ文字列を検索する場合は、 bgrep を使用できます(リポジトリにはありません。私の知る限り):

bgrepは、バイナリファイル内のバイナリ文字列の出現を検索するためのユーティリティです。その名前が示すように、そのインターフェイスとデザインは、テキストファイル内のテキストパターンの出現を検索するために使用されるユビキタスな「grep」コマンドをモデルにしています。

または、次の方法を使用することもできます。

cat YourFile | hexdump -C | grep YourPattern

これはhexdumpを使用します:再び マニュアルから

hexdump(1)

名前

hexdump-ASCII、10進数、16進数、8進数のダンプ

便利な-C形式を使用します。

-C正規の16進数+ ASCII表示。入力オフセットを16進数で表示し、その後に16個のスペース区切りの2列の16進数バイトを表示し、その後に '' | ''文字で囲まれた%_p形式の同じ16バイトを表示します。

-c形式を好む人もいますが、

-c1バイトの文字表示。入力オフセットを16進数で表示し、その後に1行あたり16文字のスペースで区切られた、3列の、スペースで埋められた入力データの文字を表示します。

0
MariusMatutiae