
Ich suche nach bestimmten Zeichenfolgen in ausführbaren Dateien (Windows).
Zuerst begann ich mit
grep -a string file
da Binärdateien wie Textdateien behandelt werden. Das Problem dabei ist, dass es keine saubere Ausgabe gibt, Zeilenumbrüche zufällig erfolgen (wenn die richtigen Bytes in der richtigen Reihenfolge sind) usw.pp.
Also dachte ich, ich würde Zeichenfolgen verwenden:
strings file | grep -i string
Zu meinem Erstaunen findet „strings“ keine Strings, die ich mit „grep -a“ finden konnte. Allerdings ist „strings“ insofern nett, als dass es jedes gefundene Element in einer neuen Zeile ausgibt.
Wie bekomme ich das Beste aus beiden Welten? Das heißt, ich möchte wirklich alles finden und auch eine sinnvolle Ausgabe der gefundenen Daten erhalten.
Antwort1
Dass strings
nicht die gleichen Muster wie Ihre Zeichenfolge gefunden werden, liegt höchstwahrscheinlich daran, dass strings
Muster mit einer Länge von mindestens 4 Zeichen gefunden werdenUndgefolgt von einem nicht druckbaren Zeichen. Von man strings
für GNU 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.
Darüber hinaus strings
werden standardmäßig nur initialisierte und geladene Abschnitte von Objektdateien gescannt, was die Anzahl der ausgegebenen Zeilen weiter reduzieren kann.
Sie können die Optionen -a
und ausprobieren -n
, um dieses Verhalten zu ändern:
strings -n 1 -a file | grep -i string
Dadurch erhalten Sie mehr Zeichenfolgen und wahrscheinlich alles, was Sie erwarten.
Unterschied in der Ausgabe meiner python
ausführbaren Datei:
$ 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
Antwort2
Warum nicht:
grep -a string file | strings
strings
druckt die druckbaren Zeichenfolgen, die mindestens 4 Zeichen lang sind. Wenn Sie also grep
etwas kürzer als 4 Zeichen benötigen, strings
wird es bei der Verarbeitung über zuerst ausgelassen. Verwenden Sie , strings -n 1
um die Mindestlänge auf 1 festzulegen.