Unicorn — это изящный легкий мультиплатформенный мультиархитектурный эмулятор процессора. Как только вы предоставите ему информацию о процессоре, который хотите эмулировать, вы можете передать ему необработанный двоичный файл, и он будет эмулировать процессор, корректируя значения регистров и памяти в соответствии с инструкциями, закодированными в двоичном файле. Это фантастический инструмент — проверьте, если вы еще этого не сделали.
Играя с Unicorn, я хотел разработать простой способ перейти от идентификации функции в двоичном файле, которую я хотел бы эмулировать, к сохранению всех байтов функции в формате Python bytes
, который могла бы использовать библиотека Python unicorn. Пока это был самый простой способ, который я нашел — дайте мне знать, если есть что-то проще.
Используйте xxd и функцию bytes.fromhex()
в Python. Допустим, вы хотите извлечь 0x17 байт из двоичного файла с именем a.out
по смещению 0x1129. Вы можете сделать это следующим образом:
$ xxd -s 0x1129 -l 0x17 -p a.out
Если вы не знаете, сколько байт вы хотите извлечь, но знаете начальное и конечное смещение, используйте эту команду:
$ xxd -s 0x1129 -l $((0x1140-0x1129)) -p a.out
Примечание: удалите префикс «0x», чтобы использовать десятичные числа вместо шестнадцатеричных.
Это выведет поток байтов в форме «0123456789abcdef». Чтобы преобразовать эту строку в байтовую строку в Python, выполните следующие действия:
bytes.fromhex("0123456789abcdef") # returns b'\x01#Eg\x89\xab\xcd\xef'
Оригинально опубликовано на https://tristanwhite.net.