Ich habe dieses Zitat (unten) einige Male gelesen, zuletzt hier , und bin ständig verwirrt darüber, wie dd
man etwas patchen kann, geschweige denn einen Compiler:
Das Unix-System, das ich vor 30 Jahren in der Schule verwendet habe, war in Bezug auf RAM und Festplattenspeicher sehr begrenzt. Insbesondere das
/usr/tmp
Dateisystem war sehr klein, was zu Problemen führte, wenn jemand versuchte, ein großes Programm zu kompilieren. Natürlich sollten die Schüler sowieso keine "großen Programme" schreiben; Bei großen Programmen handelte es sich normalerweise um Quellcodes, die von "irgendwo" kopiert wurden. Viele von uns kopiert/usr/bin/cc
zu/home/<myname>/cc
, und verwendetdd
die binäre Patch zu verwenden ,/tmp
statt/usr/tmp
, die größer war. Dies machte das Problem natürlich nur noch schlimmer - der von diesen Kopien belegte Speicherplatz spielte damals eine Rolle und wurde jetzt/tmp
regelmäßig gefüllt, sodass andere Benutzer ihre Dateien nicht einmal bearbeiten konnten. Nachdem sie herausgefunden hatten, was passiert war, taten die Sysadmins achmod go-r /bin/* /usr/bin/*
was das Problem "behoben" und alle unsere Kopien des C-Compilers gelöscht.
(Betonung meiner)
Die dd
Man-Page sagt nichts über das Patchen aus und ich glaube nicht, dass es trotzdem sinnvoll sein könnte, dies zu tun.
Könnten Binaries wirklich gepatcht werden dd
? Hat dies eine historische Bedeutung?
od
eine Datei für die Byte-Hex-Codes, den benötigten Offset finden, über die Bearbeitung undbs=$patchsize count=1 seek=$((offset/bs)) conv=notrunc
den Patch direkt in entscheiden.Antworten:
Lass es uns versuchen. Hier ist ein triviales C-Programm:
Das bauen wir ein in
test
:Wenn wir es ausführen, gibt es "/ usr / tmp" aus.
Lassen Sie uns herausfinden, wo sich "
/usr/tmp
" in der Binärdatei befindet:-t d
druckt den Offset in Dezimalzahl in die Datei jeder gefundenen Zeichenfolge.Jetzt erstellen wir eine temporäre Datei mit nur "
/tmp\0
" darin:Jetzt haben wir also die Binärdatei, wissen, wo sich die Zeichenfolge befindet, die geändert werden soll, und haben eine Datei mit der Ersatzzeichenfolge.
Jetzt können wir verwenden
dd
:Dies liest Daten aus
tmp
(unserer "/tmp\0
" Datei), schreibt sie in unsere Binärdatei, verwendet eine Ausgabeblockgröße von 1 Byte, überspringt den zuvor gefundenen Versatz, bevor etwas geschrieben wird, und schneidet die Datei nicht explizit ab, wenn dies erledigt ist.Wir können die gepatchte ausführbare Datei ausführen:
Das vom Programm ausgedruckte Zeichenfolgenliteral wurde geändert und enthält nun "
/tmp\0tmp\0
". Die Zeichenfolgenfunktionen werden jedoch beendet, sobald das erste Nullbyte angezeigt wird. Dieses Patchen erlaubt nur, die Saite kürzer oder gleich lang und nicht länger zu machen, aber es ist für diese Zwecke ausreichend.Wir können also nicht nur Dinge patchen
dd
, wir haben es auch getan.quelle
/usr/tmp
Zeichenfolge suchen und durch "/tmp
don" ersetzen soll Vergiss das letzte\0
Byte nicht, speichere die Datei und drücke die Daumen ". Oder, noch besser, ein Shell-Skript, das zuerst die Richtigkeit überprüft und dann aufruftdd
. Leider ergibt sich die Notwendigkeit für Sachen wie diese häufig auf, wenn ein altes Stück Software , die von einem heute nicht mehr existierenden Anbietern nur hat zu einem neuen System migriert werden.sed
‚s nicht besser für diese Art der Sache - man kann nicht so expliciltly und genau Limitsed
‘ s Schreib- / Lesepuffer in der Art und Weise Sie könnte mitdd
- was der ganze Grund ist es immer dafür in erster Linie verwendet wurde. Mit könnendd
Sie eine beliebige Anzahl beliebiger Bytes beliebig platzieren. Dies kann auch nicht gesagt werdensed
. Wenndd
hier wie ein Skalpell verwendet wird, würden Siesed
wie eine Abrissbirne anwenden .Es kommt darauf an, was Sie unter "Patchen der Binärdatei" verstehen.
Ich ändere
dd
manchmal die Binärdateien mit . Natürlich gibt es keine solche Funktiondd
, aber sie kann Dateien öffnen und Dinge an bestimmten Offsets lesen und schreiben. Wenn Sie also wissen, was Sie wo schreiben sollen, gibt es Ihren Patch.Zum Beispiel hatte ich diese Binärdatei, die einige PNG-Daten enthielt. Verwenden Sie
binwalk
, um den Versatz zu finden,dd
um ihn zu extrahieren (normalerweise extrahiert binwalk auch Dinge, aber meine Kopie war fehlerhaft), bearbeiten Sie ihn mitgimp
, und stellen Sie sicher, dass die bearbeitete Datei dieselbe Größe oder kleiner als die ursprüngliche ist (das Ändern von Versätzen ist nicht einfach möglich) ), und verwenden Sie danndd
, um das geänderte Bild wieder in Position zu bringen.Manchmal möchte ich auch Zeichenfolgen in Binärdateien ersetzen (z. B. Pfad- oder Variablennamen). Dies könnte auch mit erfolgen
dd
, es ist jedoch einfacher, dies zu tunsed
. Sie müssen nur sicherstellen, dass die Zeichenfolge, durch die Sie ersetzen, dieselbe Länge wie die ursprüngliche Zeichenfolge hat, damit Sie nicht die Offsets ändern.oder um das Beispiel von @ MichaelHomer mit einem 0-Byte aufzuheben, das hinzugefügt wurde in:
Natürlich muss man danach nachprüfen, ob es tatsächlich funktioniert.
quelle
sed
, die mit Binärdateien gut umgehen kannsed
, was bei gnu der Fall zu sein scheint , aber nicht bei vielen älterensed
s, die nur mit ASCII-Dateien gearbeitet\0
haben. und hatte Einschränkungen für die maximale Leitungslänge.sed
scheint in der Lage zu sein, Binärdateien zu ändern, versteht aber\x00
in der Ersetzungszeichenfolge nicht, wie es GNUsed
tut. Es muss getestet werden, aber ich denke, es ist erwähnenswert, da es so viel einfacher ist alsdd
- für einige Fälle. Das Patchen von Binärdateien ist in beiden Fällen ein Problem.