So verwenden Sie den Strings-Befehl unter Linux

Möchten Sie den Inhalt einer binären oder Datendatei in Form von Text betrachten? Der Linux-Befehl strings extrahiert genau diese Textfragmente – sogenannte „Strings“ – für Sie.

Linux ist reich an Befehlen, die wie spezielle Lösungen für bestimmte Herausforderungen wirken. Der Befehl strings ist definitiv einer davon. Aber was ist eigentlich sein Zweck? Gibt es wirklich einen Nutzen für einen Befehl, der die druckbaren Zeichenketten aus Binärdateien auflistet?

Lassen Sie uns einen Schritt zurückgehen. Binärdateien, wie beispielsweise Programmdateien, können durchaus Textpassagen enthalten, die für Menschen lesbar sind. Aber wie können wir diese sichtbar machen? Wenn Sie cat oder less verwenden, wird Ihr Terminal vermutlich einfrieren. Diese Programme, die primär für Textdateien entwickelt wurden, haben Schwierigkeiten, wenn sie auf nicht druckbare Zeichen stoßen.

Der größte Teil der Bytes in einer Binärdatei ist nicht lesbar und ergibt im Terminalfenster keinen Sinn. Es existieren keine spezifischen Zeichen oder Standardsymbole, um Binärwerte darzustellen, die nicht alphanumerischen Zeichen, Satzzeichen oder Leerzeichen entsprechen. Diese werden als „druckbare“ Zeichen bezeichnet. Der Rest sind „nicht druckbare“ Zeichen.

Der Versuch, in einer Binär- oder Datendatei nach Textsequenzen zu suchen oder diese anzuzeigen, ist daher ein Problem. Hier kommt strings ins Spiel. Dieser Befehl extrahiert druckbare Zeichenketten aus Dateien, sodass andere Befehle diese verwenden können, ohne mit nicht druckbaren Zeichen konfrontiert zu werden.

Anwendung des Befehls ’strings‘

Der Befehl strings ist nicht kompliziert und seine grundlegende Verwendung ist sehr einfach. Sie müssen lediglich den Namen der Datei angeben, in der nach Strings gesucht werden soll.

Im Folgenden nutzen wir strings für eine Binärdatei – eine ausführbare Datei – namens „Jibber“. Wir geben strings, ein Leerzeichen und „Jibber“ ein und bestätigen mit der Eingabetaste.

strings jibber

Die gefundenen Strings werden aus der Datei extrahiert und im Terminalfenster angezeigt.

Festlegen der minimalen Stringlänge

Standardmäßig sucht strings nach Sequenzen, die mindestens vier Zeichen lang sind. Um eine längere oder kürzere Mindestlänge zu definieren, verwenden Sie die Option -n (Mindestlänge).

Beachten Sie, dass mit abnehmender Mindestlänge die Wahrscheinlichkeit zunimmt, dass mehr unerwünschte Daten angezeigt werden.

Manche Binärwerte können den gleichen numerischen Wert wie ein druckbares Zeichen haben. Wenn zwei solcher Werte in der Datei direkt nebeneinander liegen und Sie eine Mindestlänge von zwei angeben, werden diese Bytes als String interpretiert.

Um strings anzuweisen, eine Mindestlänge von zwei Zeichen zu verwenden, geben Sie folgenden Befehl ein:

strings -n 2 jibber

Die Ergebnisse enthalten nun auch Strings, die nur aus zwei Buchstaben bestehen. Beachten Sie, dass Leerzeichen als druckbare Zeichen gelten.

Ausgabe von ’strings‘ über ‚less‘

Aufgrund der potentiell großen Ausgabemengen von strings ist es oft sinnvoll, die Ergebnisse mit less anzuzeigen. So können Sie durch die Ausgabe scrollen und nach relevanten Texten suchen.

strings jibber | less

Die Ausgabe wird nun in less angezeigt, wobei der Anfang der Liste zuerst sichtbar ist.

Verwendung von ’strings‘ mit Objektdateien

Quellcodedateien von Programmen werden typischerweise in Objektdateien kompiliert. Diese werden anschließend mit Bibliotheksdateien zu einer ausführbaren Datei verknüpft. Wir haben die Objektdatei „Jibber“ zur Hand, daher werfen wir einen Blick hinein. Beachten Sie die Dateiendung „.o“.

strings jibber.o | less

Der erste Satz an Strings wird in der achten Spalte umgebrochen, falls er länger als acht Zeichen ist. Bei einem Umbruch erscheint ein „H“-Zeichen in der neunten Spalte. Diese Strings könnten Ihnen als SQL-Anweisungen bekannt vorkommen.

Ein Durchscrollen der Ausgabe zeigt, dass diese Formatierung nicht durchgehend in der Datei angewendet wird.

Es ist aufschlussreich, die Unterschiede in den Textstrings zwischen der Objektdatei und der finalen, ausführbaren Datei zu sehen.

Suche in bestimmten Dateiabschnitten

Kompilierte Programme enthalten verschiedene Bereiche, die zur Speicherung von Text genutzt werden. Standardmäßig durchsucht strings die gesamte Datei nach Text. Dies entspricht der Verwendung der Option -a (all). Um strings anzuweisen, nur in initialisierten Datenbereichen der Datei zu suchen, verwenden Sie die Option -d (data).

strings -d jibber | less

Sofern Sie keinen speziellen Grund haben, können Sie die Standardeinstellung beibehalten und die gesamte Datei durchsuchen.

Ausgeben des String-Offsets

Wir können strings veranlassen, den Offset vom Dateianfang auszugeben, an dem sich jeder String befindet. Dazu verwenden wir die Option -o (offset).

strings -o parse_phrases | less

Der Offset wird im Oktalsystem dargestellt.

Um den Offset in einer anderen numerischen Basis, wie z.B. dezimal oder hexadezimal anzuzeigen, verwenden Sie die Option -t (Radix). Der Option -t muss ein d (Dezimal), x (Hexadezimal) oder o (Oktal) folgen. Die Verwendung von -to ist gleichbedeutend mit der Verwendung von -o.

strings -t d parse_phrases | less

Die Offsets werden nun in dezimaler Form ausgegeben.

strings -t x parse_phrases | less

Die Offsets werden jetzt in hexadezimaler Form dargestellt.

Inkludieren von Whitespace

strings behandelt Tabulatoren und Leerzeichen als Teil der gefundenen Strings. Andere Whitespace-Zeichen, wie Zeilenumbrüche und Wagenrückläufe, werden normalerweise nicht als Teil der Strings betrachtet. Mit der Option -w (whitespace) werden alle Whitespace-Zeichen so behandelt, als seien sie Bestandteil der Strings.

strings -w add_data | less

In der Ausgabe sehen wir die Leerzeile, die durch die (unsichtbaren) Wagenrücklauf- und Zeilenumbruchzeichen am Ende der zweiten Zeile entsteht.

Nicht auf Dateien beschränkt

strings kann mit allem verwendet werden, was einen Bytestrom erzeugen oder sein kann.

Mit diesem Befehl können wir beispielsweise den Arbeitsspeicher (RAM) unseres Computers untersuchen.

Wir benötigen sudo, da wir auf /dev/mem zugreifen. Dies ist eine Gerätedatei, die ein Abbild des Hauptspeichers Ihres Computers darstellt.

sudo strings /dev/mem | less

Die Ausgabe ist nicht der gesamte Inhalt Ihres RAMs. Es sind lediglich die Strings, die daraus extrahiert werden konnten.

Mehrere Dateien gleichzeitig durchsuchen

Platzhalterzeichen können verwendet werden, um Gruppen von Dateien für die Durchsuchung auszuwählen. Das Zeichen * steht für mehrere Zeichen und das Zeichen ? steht für ein beliebiges einzelnes Zeichen. Sie können auch viele Dateinamen direkt in der Befehlszeile angeben.

Wir verwenden hier einen Platzhalter und durchsuchen alle ausführbaren Dateien im Verzeichnis /bin. Da die Ausgabe Ergebnisse aus vielen Dateien enthält, verwenden wir die Option -f (Dateiname). Diese Option gibt den Dateinamen am Anfang jeder Zeile aus. So können wir erkennen, in welcher Datei jeder String gefunden wurde.

Wir leiten die Ergebnisse durch grep und suchen nach Strings, die das Wort „Copyright“ enthalten.

strings -f /bin/* | grep Copyright

Wir erhalten eine klare Ausgabe der Copyright-Anweisungen für jede Datei im Verzeichnis /bin, mit dem Dateinamen am Anfang jeder Zeile.

Zusammenfassung zu ’strings‘

strings ist kein geheimer Befehl, sondern ein typischer Linux-Befehl, der eine sehr spezifische Aufgabe erfüllt – und das sehr gut.

Er ist ein weiteres Zahnrad im Linux-System und wird erst in Verbindung mit anderen Befehlen wirklich nützlich. Wenn Sie erkennen, wie er in der Kette zwischen Binärdateien und anderen Tools wie grep agiert, werden Sie die Funktionalität dieses etwas unscheinbaren Befehls zu schätzen lernen.