So verwenden Sie den Strings-Befehl unter Linux

Möchten Sie den Text in einer Binär- oder Datendatei sehen? Der Linux-Befehl strings ruft diese Textteile – sogenannte „Strings“ – für Sie heraus.

Linux ist voll von Befehlen, die wie Lösungen für die Suche nach Problemen aussehen können. Der Strings-Befehl fällt definitiv in dieses Lager. Nur was ist sein Zweck? Gibt es einen Sinn für einen Befehl, der die druckbaren Zeichenfolgen aus einer Binärdatei auflistet?

Gehen wir einen Schritt zurück. Binärdateien – wie Programmdateien – können Zeichenfolgen mit menschenlesbarem Text enthalten. Aber wie bekommt man sie zu sehen? Wenn Sie cat oder weniger verwenden, werden Sie wahrscheinlich ein hängendes Terminalfenster haben. Programme, die für die Arbeit mit Textdateien entwickelt wurden, kommen nicht gut zurecht, wenn sie nicht druckbare Zeichen durchlaufen.

Die meisten Bytes in einer Binärdatei sind nicht lesbar und können nicht sinnvoll im Terminalfenster ausgegeben werden. Es gibt keine Zeichen oder Standardsymbole zur Darstellung von Binärwerten, die nicht alphanumerischen Zeichen, Satzzeichen oder Leerzeichen entsprechen. Zusammen werden diese als „druckbare“ Zeichen bezeichnet. Der Rest sind „nicht druckbare“ Zeichen.

Der Versuch, eine Binär- oder Datendatei nach Textzeichenfolgen anzuzeigen oder zu durchsuchen, ist daher ein Problem. Und hier kommt Strings ins Spiel. Es extrahiert Zeichenfolgen von druckbaren Zeichen aus Dateien damit andere Befehle die Zeichenfolgen verwenden können, ohne sich mit nicht druckbaren Zeichen herumschlagen zu müssen.

Verwenden des Zeichenfolgenbefehls

Der Befehl strings ist nicht kompliziert und seine grundlegende Verwendung ist sehr einfach. Wir geben den Namen der Datei an, in der Strings durchsucht werden sollen, in der Befehlszeile.

Hier verwenden wir Strings für eine Binärdatei – eine ausführbare Datei – namens „Jibber“. Wir geben Zeichenfolgen, ein Leerzeichen, „Jibber“ ein und drücken dann die Eingabetaste.

strings jibber

Die Strings werden aus der Datei extrahiert und im Terminalfenster aufgelistet.

  So installieren Sie KDE Plasma 5 unter Linux

Einstellen der minimalen Stringlänge

Standardmäßig sucht Strings nach Strings, die vier oder mehr Zeichen lang sind. Um eine längere oder kürzere Mindestlänge festzulegen, verwenden Sie die Option -n (Mindestlänge).

Beachten Sie, dass die Wahrscheinlichkeit, dass Sie mehr Müll sehen, umso höher ist, je kürzer die Mindestlänge ist.

Einige Binärwerte haben denselben numerischen Wert wie der Wert, der ein druckbares Zeichen darstellt. Wenn zwei dieser numerischen Werte in der Datei nebeneinander liegen und Sie eine Mindestlänge von zwei angeben, werden diese Bytes wie ein String gemeldet.

Um Strings aufzufordern, zwei als Mindestlänge zu verwenden, verwenden Sie den folgenden Befehl.

strings -n 2 jibber

In den Ergebnissen sind jetzt Zeichenfolgen aus zwei Buchstaben enthalten. Beachten Sie, dass Leerzeichen als druckbare Zeichen gezählt werden.

Piping Saiten durch weniger

Aufgrund der Länge der Ausgabe von Strings werden wir sie durch weniger leiten. Wir können dann durch die Datei scrollen und nach interessantem Text suchen.

strings jibber | less

Die Auflistung wird uns jetzt in weniger angezeigt, wobei die Spitze der Auflistung zuerst angezeigt wird.

Verwenden von Strings mit Objektdateien

Typischerweise werden Programmquellcodedateien in Objektdateien kompiliert. Diese werden mit Bibliotheksdateien verknüpft, um eine binäre ausführbare Datei zu erstellen. Wir haben die Jibber-Objektdatei zur Hand, also lassen Sie uns einen Blick in diese Datei werfen. Beachten Sie die Dateierweiterung „.o“.

jibber.o | less

Der erste Satz von Zeichenfolgen wird alle in Spalte acht umgebrochen, wenn sie länger als acht Zeichen sind. Wenn sie umbrochen wurden, befindet sich ein „H“-Zeichen in Spalte neun. Sie erkennen diese Zeichenfolgen möglicherweise als SQL-Anweisungen.

Ein Scrollen durch die Ausgabe zeigt, dass diese Formatierung nicht in der gesamten Datei verwendet wird.

  So verwenden Sie den Wall-Befehl unter Linux

Es ist interessant, die Unterschiede in den Textzeichenfolgen zwischen der Objektdatei und der fertigen ausführbaren Datei zu sehen.

Suchen in bestimmten Bereichen der Datei

Kompilierte Programme haben verschiedene Bereiche in sich, die zum Speichern von Text verwendet werden. Standardmäßig durchsucht strings die gesamte Datei nach Text. Dies ist so, als ob Sie die Option -a (all) verwendet hätten. Damit Zeichenfolgen nur in initialisierten, geladenen Datenabschnitten in der Datei suchen, verwenden Sie die Option -d (Daten).

strings -d jibber | less

Sofern Sie keinen triftigen Grund haben, können Sie auch die Standardeinstellung verwenden und die gesamte Datei durchsuchen.

Drucken des String-Offsets

Wir können Strings den Offset vom Anfang der Datei drucken lassen, an dem sich jeder String befindet. Verwenden Sie dazu die Option -o (Offset).

strings -o parse_phrases | less

Der Offset wird in . angegeben Oktal.

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

strings -t d parse_phrases | less

Die Offsets werden jetzt dezimal gedruckt.

strings -t x parse_phrases | less

Die Offsets werden jetzt hexadezimal gedruckt.

Einschließlich Leerzeichen

strings betrachtet Tabulator- und Leerzeichen als Teil der gefundenen Strings. Andere Leerzeichen, wie Zeilenumbrüche und Zeilenumbrüche, werden nicht so behandelt, als ob sie Teil der Zeichenfolgen wären. Die Option -w (Whitespace) bewirkt, dass Strings alle Whitespace-Zeichen so behandeln, als ob sie Teile des Strings wären.

strings -w add_data | less

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

  So installieren Sie ZFS unter Linux

Wir sind nicht auf Dateien beschränkt

Wir können Strings mit allem verwenden, was ein Bytestrom ist oder produzieren kann.

Mit diesem Befehl können wir durch die Arbeitsspeicher (RAM) unseres Computers.

Wir müssen sudo verwenden, weil wir auf /dev/mem zugreifen. Dies ist eine Zeichengerätedatei, die ein Abbild des Hauptspeichers Ihres Computers enthält.

sudo strings /dev/mem | less

Die Auflistung ist nicht der gesamte Inhalt Ihres RAM. Es sind nur die Strings, die daraus extrahiert werden können.

Durchsuchen vieler Dateien gleichzeitig

Platzhalter können verwendet werden, um Gruppen von zu durchsuchenden Dateien 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 in der Befehlszeile angeben.

Wir werden einen Platzhalter verwenden und alle ausführbaren Dateien im Verzeichnis /bin durchsuchen. Da die Auflistung Ergebnisse aus vielen Dateien enthält, verwenden wir die Option -f (Dateiname). Dadurch wird der Dateiname am Anfang jeder Zeile gedruckt. Wir können dann sehen, in welcher Datei jeder String gefunden wurde.

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

strings -f /bin/* | grep Copyright

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

Saiten entwirrt

Saiten sind kein Geheimnis; es ist ein typischer Linux-Befehl. Es macht etwas sehr Spezifisches und das sehr gut.

Es ist ein weiteres Zahnrad von Linux und wird erst richtig lebendig, wenn es mit anderen Befehlen arbeitet. Wenn Sie sehen, wie es zwischen Binärdateien und anderen Tools wie grep sitzen kann, werden Sie die Funktionalität dieses etwas obskuren Befehls zu schätzen wissen.