Wann kann ich Strings in einer ausführbaren Binärdatei bearbeiten?

12

Ich habe eine ausführbare Binärdatei. Nennen wir es a.out. Ich kann sehen, dass die Binärdatei Zeichenfolgen enthält

$ strings a.out
...
/usr/share/foo
....

Ich muss die Zeichenfolge /usr/share/fooin ändern /usr/share/bar. Kann ich den String einfach ersetzen durch sed:

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

Dies scheint eine sichere Sache zu sein. Funktioniert das auch, wenn die Saiten nicht gleich lang sind?

Martin Vegter
quelle

Antworten:

17

Ich weiß nicht, ob Ihre Version von sed"Binary-Clean" ist oder ob die Eingabe Ihrer Meinung nach lange Zeilen umfasst, aber abgesehen von diesen Problemen sollte das Bearbeiten der Zeichenfolge funktionieren. Vergleichen Sie die alte und die neue Version mit cmp -l. Es sollte Ihnen sagen, ob die einzigen drei Unterschiede zwischen den beiden Dateien diese 3 Bytes sind.

Das Bearbeiten von Zeichenfolgen in einer kompilierten ausführbaren Datei funktioniert zwar, wenn die Zeichenfolgen dieselbe Länge haben, aber es funktioniert fast immer auch, wenn Sie die Zeichenfolge verkürzen, da Zeichenfolgen in C funktionieren. In C-Zeichenfolgen alles nach dem NULAbschlusszeichen zählt nicht. Wenn Sie also einen neuen NULTerminator vor der Position des alten Terminators schreiben , wird der String effektiv gekürzt.

Im Allgemeinen gibt es keine Möglichkeit, eine Zeichenfolge mit diesem Hack zu verlängern.

Celada
quelle
Was ist mit dem Kürzen der Saite mit so etwas sed -i 's@longstring@foo@' a.out? Dadurch wird die gesamte Binärdatei um 7 Byte verkleinert. Wird die Binärdatei dadurch nicht beschädigt?
Martin Vegter
Ja, es wird die Binärdatei beschädigen. Aus diesem Grund müssen Sie die Zeichenfolge in genau dieselbe Länge übersetzen, aber ein NULAbschlusszeichen an einer früheren Position setzen, wie ich erklärt habe (obwohl dies möglicherweise zu kurz ist). Das Problem ist, dass Sie kein NULByte in der Befehlszeile haben können, also müssen Sie Ihr sedProgramm in eine Datei einfügen und mit darauf verweisen -f. Auf der anderen Seite wäre es sicherer, ein Tool zu verwenden, das für die Arbeit mit Binärdaten entwickelt wurde, anstatt für seddie Arbeit mit Textdaten.
Celada
2
Gute Antwort. sed kann viele Dinge, aber im Allgemeinen wurden dafür Binäreditoren erfunden. Sie können schwierig zu verwenden sein, wenn Sie in einer großen Binärdatei navigieren, aber Sie können die Dinge Byte für Byte ändern. Ich benutze, hexeditwenn ich eine Binärdatei untersuchen oder ändern muss. Mit können Sie strings -t x file | lessdie Offsets der (druckbaren) Zeichenfolgen suchen, die Sie ändern möchten, bevor Sie in den Editor springen.
Joe
Nehmen wir an, ich habe eine Zeichenfolge in meinem C-Programm: "Mein Name war Mr Robot" und ich möchte "was" durch "is" ersetzen. Dann muss das Auffüllen \0sorgfältig erfolgen, denn wenn das Ersetzen dies tut: "Mein Name ist "0 Mr Robot", dann erzeugt das Zeichen "0" beim Ausführen von Operationen mit der Zeichenfolge Probleme, da sich die Länge unbeabsichtigt verringert.
Nehal J Wani
@NehalJWani nein, in diesem Fall müssten Sie den gesamten Rest der Zeichenfolge um ein Byte nach vorne verschieben, damit Ihre neue, zusätzliche Beendigung NULam Ende neben der vorhandenen endet NUL.
Celada