\r\n\r\n
バイナリファイルやデータファイルの中のテキストを見るには、Linuxのstringsコマンドで「strings」というテキストを抽出してくれます。
Linuxには、問題解決のように見える注文がたくさんあります。ストリング・コマンドは、確かにその範疇に入りますね。その目的は何でしょうか?バイナリファイルの印字可能な文字列をリストアップするコマンドを指す点はありますか?
一歩踏み出そう。プログラムファイルなどのバイナリファイルには、人間が読める文字列が含まれていることがあります。でも、どうやって見るんですか?cat以下を使用すると、ターミナルウィンドウがぶら下がった状態になる可能性が高いです。テキストファイルを扱うために設計されたプログラムでは、印刷不可能な文字が入力されるとうまく扱えません。
バイナリファイル内のほとんどのバイトは人間が読むことができず、意味のある方法でターミナルウィンドウに印刷することはできません。英数字、句読点、スペースに対応しない2値値を表す文字や標準記号はない。これらの文字を総称して「印刷用」文字と呼ぶ。残りは「印刷不可能な文字」です。
そのため、バイナリファイルやデータファイル内の文字列を表示したり検索しようとすると、問題が発生します。そこで登場するのが文字列です。ファイルから印刷可能な文字列を抽出し、他のコマンドが印刷不可能な文字と競合することなく使用できるようにするものです。
文字列コマンドは複雑なものではなく、基本的な使い方は非常にシンプルだ。コマンドラインで文字列を検索させたいファイル名を指定する。
ここでは、バイナリファイルである「jibber」という実行ファイルに対して文字列を使用することにします。
strings jibberファイルから文字列が抽出され、ターミナルウィンドウに一覧表示されます。
デフォルトでは、4文字以上の文字列を検索します。最小長を長くしたり短くしたりするには、-n (最小長) オプションを使用します。
なお、最短の長さが短いほど、より多くのゴミを見ることができる可能性が高くなります。
2値には、印刷可能な文字を表す値と同じ値を持つものがあります。これらの値のうち2つがたまたまファイル内で隣り合って現れ、最小長を2として指定した場合、これらのバイトは文字列として報告される。
文字列の最小長として2を使用することを要求するには、次のコマンドを使用します。
strings -n 2 jibberこれで、2つの文字列が結果に含まれるようになりました。なお、スペースは印刷可能な文字としてカウントされます。
文字列の出力が長いため、通過するパイプの数は少なくなります。その後、ファイルをスクロールして目的のテキストを見つけることができます。
strings jibber | lessリストが縮小されて表示され、リストの先頭が最初に表示されるようになりました。
通常、プログラムのソースファイルは、ターゲットファイルにコンパイルされます。これらのファイルは、ライブラリファイルとリンクして、バイナリ実行ファイルを作成します。手元にjibberのオブジェクトファイルがあるので、このファイルを見てみましょう。拡張子".o "に注意してください。
jibber.o | less最初の文字列のセットが8文字より長い場合、それらはすべて8列目にラップされる。すでにラッピングされている場合は、9段目に "H "の文字が表示されます。これらの文字列は、SQLステートメントとして認識することができます。
出力をスクロールすると、このフォーマットがファイル内で使用されていないことがわかります。
ターゲットファイルと完成した実行ファイルとの文字列の違いを見てみると面白い。
コンパイラ内には、テキストを格納するためのさまざまな領域があります。デフォルトでは、文字列はファイル全体を検索してテキストを探します。これは、あたかも-a(all)オプションを使用したかのようです。ファイル中のデータのうち、初期化されて読み込まれた部分のみを文字列検索する場合は、-d (data) オプションを使用します。
strings -d jibber | lessよほどのことがない限り、デフォルトの設定で、ファイル全体を検索するのがベストです。
各文字列が配置されているファイルの先頭からのオフセットを表示させることができます。これを行うには、-o (offset) オプションを使用します。
strings -o parse_phrases | lessオフセットは8進数で表現する。
異なる数値ベース(10進数や16進数など)でオフセットを表示するには、-t(ベース)オプションを使用します。baseオプションの後にd(10進数)、x(16進数)、o(8進数)のいずれかを付ける必要があります。toの使用は-oの使用と同じです。
strings -t d parse_phrases | lessオフセットが10進数で表示されるようになりました。
strings -t x parse_phrases | lessオフセットが16進数で表示されるようになりました。
文字列は、タブとスペース文字を検出した文字列の一部として扱います。その他の空白文字(改行やキャリッジリターンなど)は、文字列の一部として扱われません。w (ホワイトスペース) オプションを指定すると、すべてのホワイトスペース文字を文字列の一部として扱います。
strings -w add_data | less出力に空白行が見えますが、これは2行目の最後に(見えない)キャリッジリターンとラインブレークを行った結果です。
バイトのストリームを生成できるものであれば、何でも文字列にすることができるのです。
このコマンドは、コンピューターのランダムアクセスメモリー(RAM)を表示することができます。
sudoを使うのは、/dev/memにアクセスするためです。 これは、コンピュータのメインメモリのイメージを格納したキャラクタデバイス・ファイルです。
sudo strings /dev/mem | lessリストはRAMの全内容ではなく、そこから抽出可能な文字列のみです。
関連:Linuxにおける「everything is a file」の意味とは?
ワイルドカードを使用して、検索するファイルのグループを選択することができます。は複数文字を表し、?文字は任意の一文字を示す。また、コマンドラインで多くのファイル名を指定することも可能です。
ここでは、/binディレクトリにあるすべての実行ファイルをワイルドカードで検索します。リストには多くのファイルの結果が含まれるので、-f (ファイル名) オプションを使用します。これにより、各行の先頭にファイル名が表示されます。そして、それぞれの文字列がどのファイルで見つかったかを確認することができます。
結果をgrepでパイプし、"Copyright "という単語を含む文字列を検索しています。
strings -f /bin/* | grep Copyrightbinディレクトリにある各ファイルの著作権表示を、各行の先頭にファイル名を付けて、きちんとリストアップしています。
この文字列は不思議なものではなく、典型的なLinuxのコマンドである。
他のコマンドと組み合わせて使うことで真価を発揮する、Linuxのもう一つの中核です。バイナリファイルとgrepなどのツールの間に位置するこのコマンドを見れば、この少し無名なコマンドの能力が理解できるだろう。