Вы можете использовать objdump, а затем извлечь часть кода операции.Это можно сделать следующим образом.
$ objdump -d add.o | grep add4 -A10 | cut -f 2 | grep -v ':'
Флаг -v для grep указывает на печать всех строк без двоеточия.
Вывод:
55
48 89 e5
48 89 7d f8
48 8b 45 f8
48 83 c0 04
5d
c3
-A10 предписывает grep печатать 10 строк после совпадения.
Теперь, чтобы вывести это в файл, мы сначала отформатируем коды операций в шестнадцатеричном виде, как '\ x45'.Приведенный выше вывод может иметь несколько пробелов и пробел в конце каждой строки, поэтому мы сначала удаляем их, так как они могут испортить наш sed.
$ objdump -d add.o | grep add4 -A10 | cut -f 2 | grep -v ':' | sed 's/ */ /g' | sed 's/ $//g'
Добавьте '\ x'часть, сначала для пробелов между ними, а затем для первого гекса в каждой строке.
$ objdump -d add.o | grep add4 -A10 | cut -f 2 | grep -v ':' | sed 's/ */ /g' | sed 's/ $//g' | sed 's/ /\\x/g' | sed 's/^/\\x/g'
\x55
\x48\x89\xe5
\x48\x89\x7d\xf8
\x48\x8b\x45\xf8
\x48\x83\xc0\x04
\x5d
\xc3
Сверните все это в одну строку и добавьте кавычки.
$ objdump -d add.o | grep add4 -A10 | cut -f 2 | grep -v ':' | sed 's/ */ /g' | sed 's/ $//g' | sed 's/ /\\x/g' | sed 's/^/\\x/g' | tr -d '\n' | sed 's/^/\"/g' | sed 's/$/\"/g'
"\x55\x48\x89\xe5\x48\x89\x7d\xf8\x48\x8b\x45\xf8\x48\x83\xc0\x04\x5d\xc3"
Теперь мы получили строку в стиле C и просто передаем ее в printf, а затем перенаправляем вывод в файл.
$ printf $(objdump -d add.o | grep add4 -A10 | cut -f 2 | grep -v ':' | sed 's/ */ /g' | sed 's/ $//g' | sed 's/ /\\x/g' | sed 's/^/\\x/g' | tr -d '\n' | sed 's/^/\"/g' | sed 's/$/\"/g') | sed 's/^\"//g' | sed 's/\"$//g' > add4.bin
Последние два seds после printf должны удалить кавычки, которые по какой-то причине остаются в выводе printf.
Зашифровывая файл, который мы получаем:
$ hexdump -C add4.bin
00000000 55 48 89 e5 48 89 7d f8 48 8b 45 f8 48 83 c0 04 |UH..H.}.H.E.H...|
00000010 5d c3 |].|
00000012