Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Вся информация предоставлена исключительно в ознакомительных и обучающих целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Нарушение лицензии при использовании ПО может преследоваться по закону.
Для начала коротко попытаемся получить представление, что именно нам предстоит ломать. Мы уже привыкли, что все исполняемые файлы и библиотеки под актуальные версии 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 {
...
}
Структура заголовка Mach-OНу а теперь, когда мы в достаточной степени вооружились теорией, рассмотрим практический пример. У нас есть некий инсталлированный иллюстраторовский плагин, который требуется отучить от суицида по прошествии триального периода. Предположим также, что доступа к маку, на котором он установлен, у нас нет, как и другого мака под рукой — только возможность переписывать файлы. Ищем в папке нужного плагина подпапку ContentsMacOS
, а в ней — исполняемый модуль плагина. В данном случае это динамическая библиотека Fat Mach-O file, о чем нам говорит сигнатура CA
.
|
|