Mam wykonywalny plik binarny; nazwijmy to a.out
. Widzę, że plik binarny zawiera ciągi
$ strings a.out
...
/usr/share/foo
....
Muszę zmienić ciąg /usr/share/foo
na /usr/share/bar
. Czy mogę po prostu zastąpić ciąg sed
?
sed -i 's@/usr/share/foo@/usr/share/bar@' a.out
To wygląda na bezpieczne. Czy to zadziała również, gdy struny nie będą tej samej długości?
źródło
sed -i 's@longstring@foo@' a.out
? Spowoduje to zmniejszenie całego pliku binarnego o 7 bajtów. Czy nie spowoduje to uszkodzenia pliku binarnego?NUL
terminator na wcześniejszej pozycji, jak wyjaśniłem (choć może zbyt krótko). Problem polega na tym, że nie możesz miećNUL
bajtu w wierszu poleceń, więc musisz umieścić swójsed
program w pliku i odwołać się do niego-f
. Z drugiej strony bezpieczniejszym rozwiązaniem byłoby użycie narzędzia zaprojektowanego do pracy z danymi binarnymi, zamiast takiego,sed
które jest przeznaczone do pracy z danymi tekstowymi.hexedit
gdy muszę sprawdzić lub zmienić plik binarny. Możesz użyćstrings -t x file | less
do zlokalizowania przesunięć (drukowalnych) ciągów, które chcesz zmienić przed skokiem do edytora.\0
będzie musiało zostać wykonane ostrożnie, ponieważ jeśli zamiana zrobi to: „Nazywam się to \ 0 Mr Robot ”, a następnie podczas wykonywania operacji na łańcuchu znak„ \ 0 ”spowoduje problemy, ponieważ długość zostanie przypadkowo zmniejszona.NUL
kończyło się na końcu, przylegając do istniejącegoNUL
.