
(Windows) 実行可能ファイル内の特定の文字列を探しています。
まず最初に
grep -a string file
これはバイナリ ファイルをテキスト ファイルのように扱うためです。問題は、出力がきちんと行われず、改行が偶然に発生する (正しいバイトが順番に来るとき) などです。
そこで、文字列を使用することにしました:
strings file | grep -i string
驚いたことに、「strings」では、「grep -a」を使用して検索できた文字列が見つかりません。ただし、「strings」は、見つかった各項目を新しい行に出力する点で優れています。
どうすれば両方の長所を活かせるでしょうか? つまり、本当にすべてを見つけたいし、見つかったものの合理的な出力も得たいのです。
答え1
strings
文字列と同じパターンが見つからないのはstrings
、少なくとも4文字の長さのパターンが見つかったことが原因である可能性が高いです。そして印刷できない文字が続きます。GNUman strings
の場合strings
:
For each file given, GNU strings prints the printable character
sequences that are at least 4 characters long (or the number given
with the options below) and are followed by an unprintable character.
さらに、strings
デフォルトではオブジェクト ファイルの初期化およびロードされたセクションのみをスキャンするため、出力される行数がさらに削減される可能性があります。
この動作を変更するには、-a
およびオプションを試すことができます。-n
strings -n 1 -a file | grep -i string
そうすれば、より多くの文字列が得られ、おそらく期待どおりの結果が得られるはずです。
実行可能ファイルの出力の違いpython
:
$ strings $(which python) | wc
31923 68075 474068
$ strings -n 1 $(which python) | wc
501231 531837 1541204
$ strings -n 1 -a $(which python) | wc
501398 531995 1541762
答え2
なぜだめですか:
grep -a string file | strings
strings
少なくとも 4 文字の長さの印刷可能な文字シーケンスを印刷します。したがって、grep
4 文字より短い文字を検索すると、strings
最初に で処理すると、その文字が省略されます。strings -n 1
最小長を 1 に設定するには、 を使用します。