Содержание статьи
warning
Вся информация предоставлена исключительно в ознакомительных и обучающих целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Нарушение лицензии при использовании ПО может преследоваться по закону.
Немного теории
Для начала коротко попытаемся получить представление, что именно нам предстоит ломать. Мы уже привыкли, что все исполняемые файлы и библиотеки под актуальные версии Windows именуются EXE/DLL и имеют структуру MZ-PE. Под macOS используется формат Mach-O (сокращение от Mach object), являющийся потомком формата a.out, который макось унаследовала от Unix.
Как известно, Apple любит периодически переходить с одного семейства процессоров на другое, из‑за чего меняется и архитектура приложений. Начав с PowerPC, Apple в середине нулевых переметнулась в стан Intel, после чего в недавнем прошлом корпорация решила перейти на платформу ARM. Дабы пользователи поменьше страдали от подобных метаний, был взят на вооружение мультипроцессорный формат Fat binary («жирный бинарник»), который может содержать код одновременно под несколько процессоров. Такой модуль может работать как под Intel, так и под ARM.
Что же такое модуль Mach-O? Обычно он состоит из трех областей. Заголовок содержит общую информацию о двоичном файле: порядок байтов (магическое число), тип процессора, количество команд загрузки и т. д. Затем следуют команды загрузки — это своего рода оглавление, которое описывает положение сегментов, динамическую таблицу символов и прочие полезные вещи. Каждая команда загрузки содержит метаданные, такие как тип команды, ее имя, позиция в двоичном файле. Наконец, третья область — это данные, обычно самая большая часть объектного файла. Она содержит код и различную дополнительную информацию.
Мультипроцессорный «жирный» модуль может включать в себя несколько обычных модулей Mach-O, заточенных под разные процессоры (обычно это i386 и x86_64, ARM или ARM64). Структура его предельно проста — сразу за Fat header, в котором описываются входящие в модуль блоки Mach-O, следует код этих блоков, расположенный подряд. Я не буду подробно останавливаться на описании всех секций и полей данного формата, желающие могут легко нагуглить спецификацию. Остановимся лишь на формате заголовков, поскольку они понадобятся нам в дальнейших действиях.
Структура классического заголовка Mach-O выглядит так.
struct mach_header { // Сигнатура, обычно CF FA ED FE или CE FA ED FE, но для варианта с обратным порядком байтов возможна и обратная сигнатура FE ED FA CF uint32_t magic; // Тип процессора, для intel это 7, для ARM — С cpu_type_t cputype; // Подтип процессора, 1 означает 64-разрядность, например 07000001h — x86_64 cpu_subtype_t cpusubtype; // Тип файла uint32_t filetype; // Количество команд, следующих за хидером uint32_t ncmds; // Размер команд, следующих за хидером uint32_t sizeofcmds; // Набор битовых флагов, которые указывают состояние некоторых дополнительных функций формата файла Mach-O uint32_t flags;};
«Жирный заголовок» представляет собой типичный заголовок Universal binary и выглядит вот так.
struct fat_header { uint32_t magic; // 0BEBAFECAh // Количество последующих блоков fat_arch, соответствующих поддерживаемым процессорам uint32_t nfat_arch;};struct fat_arch { cpu_type_t cputype; cpu_subtype_t cpusubtype; // Смещение до блока кода относительно начала файла uint32_t offset; // Длина соответствующего блока кода uint32_t size; // Выравнивание uint32_t align;};struct fat_arch { ...}
Ну а теперь, когда мы в достаточной степени вооружились теорией, рассмотрим практический пример. У нас есть некий инсталлированный иллюстраторовский плагин, который требуется отучить от суицида по прошествии триального периода. Предположим также, что доступа к маку, на котором он установлен, у нас нет, как и другого мака под рукой — только возможность переписывать файлы. Ищем в папке нужного плагина подпапку Contents\
, а в ней — исполняемый модуль плагина. В данном случае это динамическая библиотека Fat Mach-O file, о чем нам говорит сигнатура CA
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»