Заменить двоичный файл в файле (из java keytool csr), используя hexdump sed и xxd?

Я пытаюсь следовать этому ответу и изменить несколько шестнадцатеричных байтов в файле, используя hexdump, xxd и sed.

Согласно этому ответу, после преобразования CSR, сгенерированного с помощью keytool (который является форматом PEM base-64) в DER, я должен быть в состоянии сделать прямую замену байтов, заменяя 0x13 с 0x0c,

Вот что я пытался:

#convert csr pem to der
openssl req -in openfire.csr -outform der -out openfire_csr.der
cat openfire_csr.der | grep -aP '\x13' | md5sum
#e61387f5c1xxxxeb832df102524220d81  - #it has some length
#perform replacement of hex bytes:
sed 's/\x13/\x0c/g' openfire_csr.der
#convert csr der to csr pem:
openssl req -in openfire_csr.der -outform pem -out openfire_utf8.csr
#unable to load X509 request
#3078055660:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:698:Expecting: CERTIFICATE REQUEST

Я подозреваю, что мне не хватает какой-то конверсии, но я не знаю где.

Как выполнить замену байта с помощью доступных инструментов (например, sed, xxdи / или hexdump)?

1 ответ

С http://everydaywithlinux.blogspot.ca/2012/11/patch-strings-in-binary-files-with-sed.html:

Итак, у вас есть бинарный файл, который вам нужно исправить. Возможно, это предварительно скомпилированная проприетарная программа или динамическая библиотека, которая содержит жестко закодированные пути (текстовые строки), которые вам нужно изменить.

Если бы файл представлял собой текстовый файл, то, вероятно, sed бы вам помог. Для двоичных файлов доступны шестнадцатеричные редакторы, но они требуют ручной обработки и не могут быть записаны в сценарии. Существуют и другие бинарные патч-программы, но они не могут быть упакованы в ваш любимый дистрибутив, а компилирование из исходного кода скучно. Вам также может потребоваться выполнить исправление на этапе упаковки, например, при создании RPM.

Итак, как вы можете использовать Sed тогда?

Ну, это довольно просто. Просто преобразуйте двоичный файл в ASCII HEX с помощью hexdump, исправьте его с помощью sed и преобразуйте обратно в двоичный файл с помощью xxd:

hexdump -ve '1/1 "%.2X"' file.bin | \
sed "s/<pattern>/<replacement>/g" | \
xxd -r -p > file.bin.patched

Конечно, есть предостережения в отношении этого подхода. Наиболее важным является то, что вы не можете заменить строку строкой, которая длиннее оригинальной. Короче все в порядке. Другое - строки должны заканчиваться нулем, но это почти всегда так. Вы также должны создать и себя как ASCII HEX представления строк с нулевым символом в конце с их присутствием нулевого терминатора. Кроме того, должны быть дополнены до той же длины, что и <pattern>,

Обратитесь к этому примеру

Другие вопросы по тегам