News Ticker

Unix-Tools 7: strings

UNIX/Linux ist bei Hobbyadministratoren und Informatikstudenten sehr beliebt. Kein Wunder, stellt es doch eine komplette Server- und Entwicklungsumgebung zur Verfügung. Das heutige Tool strings richtet sich mehr an die Programmierer als an die Administrator. Wie der Name schon sagt, handelt es sich auch hierbei um ein String verarbeitendes Programm. Strings sind nicht mehr als zusammengesetzte Zeichen – also Zeichenketten (jeder Programmierer wird wissen wovon ich rede). Solche in “normalen” ASCII-Dateien zu finden, ist mit grep (Das Tool wurde noch nicht vorgestellt) kein Problem. Wenn es sich dabei aber um binäre Dateien handelt, z.B. Objektdateien vom Kompilierprozess, ist grep plötzlich nicht mehr so anwenderfreundlich. Aber nicht verzagen: es gibt ja strings.


Nun zum Programm selbst. Zu Demonstrationszwecken habe ich ein kleines C-Programm geschrieben:

1
2
3
4
5
6
#include <stdio.h>
int main(int ac, char **av)
{
printf("Hallo Welt!\n");
return 0;
}

Das Listing habe ich danach mit gcc test.c kompiliert. Danach ist eine neue Datei im Verzeichnis vorhanden: a.out – eine ausführbare Datei. Dies sei nur angemerkt für die Nicht-Programmierer unter euch, so dass jeder folgen kann.

Ein einfaches strings a.out durchsucht also die wichtigsten Sektionen der ausführbaren Datei nach Zeichenketten wie z.B. unser “Hallo Welt!” aber auch die vom Compiler eingebauten Versions- und Funktionsverzeichnisse. Wem das nicht genug ist, kann mit dem Schalten –a (all, dt. alle) die ganze Datei durchsuchen lassen (standardmäßig werden nur die initialisierten und geladenen Sektionen der Objektdatei gelesen). Wer sich die Ausgabe genauer anschaut, erkennt z.B., dass der Name des  Betriebssystems ausgegeben wird. In meinem Fall:

GCC: (GNU) 4.1.1 (Gentoo 4.1.1)

Wer mehrere Dateien durchsucht, kann sich mit –f (file names, dt.: Dateinamen) den aktuellen Dateinamen vor dem Fund anzeigen lassen. –n gibt die Mindestlänge an, die ein ein String haben muss, damit er ausgegeben wird. Um sich in einer Datei besser zu orientieren, kann man –t in Verbindung mit einem o (oktal, Basis 8), d (dezimal, Basis 10) oder x (hexadezimal, Basis 16) angeben. –e (encoding, Kodierung) spezifiziert den Zeichensatz in welchem die Ausgabe erfolgen soll. Neben weiteren Schaltern, wie –T für externe Objektcodeformate, finde ich @ noch wichtig, der die Parameterliste aus einer Datei liest was als abschließendes Beispiel gezeigt werden soll:

1
2
3
4
5
6
7
titan% cat coms
-a -t x a.out
titan% strings @coms a.out
    154 /lib/ld-linux.so.2
    221 __gmon_start__
    230 libc.so.6
    [...]