Как я могу добавить разделы в существующий (OS X) исполняемый файл? - PullRequest
5 голосов
/ 26 октября 2010

Есть ли способ добавить разделы в уже связанный исполняемый файл?

Я пытаюсь подписать код исполняемого файла OS X на основе инструкций Apple . К ним относится инструкция по созданию подходящего раздела в двоичном файле для подписи путем добавления аргументов к параметрам компоновщика:

-sectcreate __TEXT __info_plist Info.plist_path

Но: Исполняемый файл, который я пытаюсь подписать, создается с использованием Racket (реализация Схемы), который собирает автономный исполняемый файл из кода Racket / схемы путем клонирования «реального» исполняемый файл и редактирование файла Mach-O напрямую.

Итак, вопрос : есть ли способ, которым я могу еще отредактировать этот исполняемый файл, чтобы добавить раздел, необходимый для подписи кода?

Использование ld не работает при использовании очевидным образом:

% ld -arch i386 -sectcreate __TEXT __info_plist ./hello.txt racket-executable
ld: in racket-executable, can't link with a main executable
%

Кажется, это достаточно справедливо. Libtool не имеет каких-либо вероятных параметров, равно как и команда redo_prebinding (которая по крайней мере является командой для редактирования исполняемых файлов).

Две возможности, предложенные соответствующим списком ракеток, заключались в том, чтобы (i) расширить инструмент компиляции ракеток, чтобы скорректировать операцию, выполняемую на исполняемом файле (выполнимо, но страшно), или (ii) создать собственный исполняемый файл ракетки который имеет нужный раздел уже на месте. Оба кажутся решениями кувалды и гайки. Список macosx-dev не дал никаких предложений.

Ответы [ 2 ]

1 голос
/ 11 декабря 2010

Я думаю, что это невозможно.

Похоже, что нет стандартных команд, редактирующих объектный файл Mach-O (который включает исполняемые файлы).Команда otool позволяет вам просматривать структуру такого файла (используйте otool -l), но это все.

Структура объектного файла Mach-O задокументирована в Appleссылка на сайт .Таким образом, объектный файл Mach-O имеет следующую структуру:

  • заголовок, после которого
  • последовательность «команд загрузки», за которой следует
  • последовательность «сегментов» (некоторые из команд загрузки отвечают за указание на смещения сегментов в файле)

Сегменты содержат ноль или более «секций».Считается, что команды header и load находятся в первом сегменте файла, перед любым из разделов этого сегмента.Есть несколько дюжин задокументированных команд загрузки и другие команды, определенные в соответствующем заголовочном файле, поэтому они явно закрытые.

Добавление раздела подразумевает изменение длины сегмента.Если бы раздел не был очень маленьким, для этого потребовалось бы вставить следующий сегмент в файл.Это нет-нет, потому что партия команд загрузки относится к данным в файле с абсолютными смещениями от начала файла (в отличие, скажем, от начала сегмента или раздела, который содержитих), так что перемещение сегментов в предполагаемом редакторе Mach-O потребовало бы исправления большого количества смещений.Это выглядит нелегко.

В Интернете есть один или два средства просмотра файлов Mach-O, но ни один из них не сильно отличается от otool, насколько я вижу (это не особенно сложно.Я написал большинство из них сегодня днем, пытаясь понять формат).Есть по крайней мере один редактор Mach-O, но он, похоже, не делает ничего такого, чего не делал lipo (называемого 'moatool', но источник, похоже, исчез из кода Google).

Ну что ж.Полагаю, пришло время найти план Б.

0 голосов
/ 28 марта 2018

Утилита gimmedebugah может изменять раздел TEXT __info_plist существующего двоичного файла.См. https://reverse.put.as/2013/05/28/gimmedebugah-how-to-embedded-a-info-plist-into-arbitrary-binaries/

Доступно здесь: https://github.com/gdbinit/gimmedebugah

...