Простой способ изменения загрузочного экрана
Если у вас нет желания возиться с шестнадцатеричными редакторами и RAW-файлами, то самый простой метод изменить загрузочный экран на Mac (на базе как Intel, так и PowerPC) заключается в использовании специализированных утилит, разработанных специально для этой цели. Одной из них является программа BootXchanger. Она бесплатна и предлагает широкий диапазон возможностей — на PowerPC практически неограниченные, а на Intel Mac — вполне разумные.
Утилита BootXchanger очень проста в использовании, но есть в ней и свои ограничения: цвет фона изменению не подлежит, размер картинок не может превышать 128×128, а количество доступных цветов картинки ограничено. На Intel Mac рекомендуется использовать простые картинки (если предложенную вами картинку использовать нельзя, BootXchanger сообщит вам об этом).
Если эти ограничения вас не смущают, давайте приступим к изменению загрузочного экрана. Скачайте BootXchanger, запустите программу и перетащите в поле Boot Image картинку (рис. 5.56), которую вы хотели бы использовать (BootXchanger предлагает и несколько образцов). Пройдите процедуру аутентификации, и ваша цель будет достигнута.
Перезагрузите компьютер, и вы увидите, как изменится загрузочный экран (рис. 5.57)!
Изменение загрузочного экрана в хакерском стиле
Я с удовольствием поиграл бы на своем Mac mini в старинные игры в среде эмулятора MacMAME. В настоящее время я использую для этой цели древний PC из разряда «бежевая коробка» под управлением Windows 98. Я действительно хотел бы заменить этот антиквариат на что-то более современное и эстетичное. Mac mini — это самый маленький и самый тихий компьютер, доступный для этой цели, причем его беспроводная сеть (Wi-Fi), клавиатура и мышь нам идеально подходят. Я даже смог запустить на нем Windows XP, поскольку большинство эмуляторов изначально разрабатывались для Windows. Однако еще лучшее решение — это работать под Mac OS X хотя бы для того, чтобы сэкономить $200 на лицензии Windows XP.
Поскольку Mac OS X при этом должна работать как операционная система, встроенная в игровой автомат, я хотел бы скрыть тот факт, что это — типовой компьютер, работающий под управлением стандартной операционной системы. Иными словами, спрятать как можно больше информации о Mac OS X. Заметка Technote TN2602 (http://developer.apple.com/technotes/tn2002/tn2062. html) описывает, каким образом можно скрыть строку меню и панель Dock, и даже — как заменить Finder (основное приложение). Тем не менее, я не захотел на этом останавливаться и пожелал скрыть даже картинки, отображающиеся во время загрузки. На сайте Res Excellence приводится гигантский объем информации по индивидуальной настройке Mac, в том числе — и по замене загрузочного логотипа и загрузочной панели.
Однако они могут применяться только на старых Mac на базе PowerPC. Поэтому я и задался целью найти метод решить ту же самую задачу для компьютеров Mac на базе процессоров Intel. Как выяснилось, компьютеры Intel Mac имеют намного больше ограничений на загрузочные логотипы, чем PowerPC Mac. Тем не менее, мне все же удалось добиться моей цели. Для этого мне пришлось дизассемблировать загрузчик Intel (Intel boot loader), после чего я смог заменить стандартный серый логотип Apple логотипом от игры Adventure для Atari 2600.
Прежде чем углубляться в детали реализации загрузчика Intel, я детально изучил принципы, благодаря которым работают аналогичные хаки для PowerPC. Последовательность загрузки Mac подробно описана Амитом Сингхом (Amit Singh). Загрузчик BootX отвечает за отрисовку логотипа Apple. К счастью, BootX — это открытое программное обеспечение (Open Source), так что вы можете разобраться с тем, как именно отрисовывается логотип. Этот логотип представляет собой картинку размером 128×128 с цветовой палитрой. Данные о пикселах попиксельно входят в файл appleboot.h. Палитра определена в файле clut.h, который, по моему представлению, и является таблицей цветов (color lookup table).
Шестнадцатеричный редактор (hex editor) — это программа, с помощью которой можно просматривать и редактировать двоичные файлы. Обычно при просмотре таких файлов вы видите мешанину символов, которая, на первый взгляд, кажется абсолютно бессмысленной. Но это не должно вас пугать. Двоичные данные кажутся бессмыслицей только людям, но компьютеры (в данном случае — ваш Mac) в состоянии их интерпретировать. В большинстве случаев пользователю не требуется читать или редактировать двоичные файлы. Но, тем не менее, бывают и ситуации, когда потребность в этом возникает. Данный пример как раз и описывает такую ситуацию. Чтобы выполнить эту и другие подобные задачи, вам потребуется специализированная программа — шестнадцатеричный редактор.
Шестнадцатеричные редакторы называются так потому, что они представляют двоичные числа в виде двузначных шестнадцатеричных чисел, от 00 до FF. Когда ставится вопрос о выборе шестнадцатеричного редактора, то здесь вам предоставляется богатейший выбор. Настоящие хакеры предпочитают Emacs (разве есть что-то, что может оказаться этому редактору не под силу?), но, если вы — обычный пользователь, которого Emacs пока еще отпугивает, вам вполне подойдет программа наподобие Hex Fiend.
Я решил убедиться в том, действительно ли это — знакомый нам загрузочный логотип, поэтому с помощью короткой программы на C я создал дамп информации о пикселах и сохранил его в файле appleboot.raw, а цветовую палитру — в файле с именем clut.act. Затем с помощью программы ImageMagick я создал файл формата PNG на основе полученных данных и просмотрел его (листинг 1).
12345//Листинг 1. Создание и просмотр файла, сгенерированного на основе//двоичной информации о загрузочном логотипе$ cat clut.act appleboot.raw > appleboot.map$ convert -depth 8 -size 128×128 appleboot.map appleboot.png$ open appleboot.png
Совершенно предсказуемо, полученный файл appleboot.png действительно оказался всем знакомым и таким родным и любимым логотипом. Он действительно имел размер 128×128 и цветовую палитру. Именно его мы и хотим изменить, заменив данные о пикселах и палитру, а затем перекомпилировав BootX. Но перекомпиляция — это не слишком удобный метод тестирования нового загрузочного логотипа, поэтому вам потребуется написать программу, которая будет выполнять преобразование двоичных данных в массивы C.
К счастью, на уже упомянутом сайте приводится довольно подробное руководство о том, как следует патчить двоичный файл BootX для платформ PowerPC. Обычно для осуществления этого процесса необходимы шестнадцатеричный редактор и Photoshop. Что еще лучше, имеются даже специальные утилиты, которые полностью автоматизируют этот процесс, например, Imagine BootX. К сожалению, аналогичных руководств и специализированного инструментария для пользователей Intel Mac нет, поэтому прежде, чем приступать к осуществлению хака, необходимо внимательно прочесть и понять руководства по патчингу BootX для PowerPC Mac. Процедура для Intel Mac очень похожа. Вы быстро обратите внимание на то, что данные о цветовой палитре и пикселах, извлеченные с помощью шестнадцатеричного редактора, в точности совпадают с теми, которые я получил из исходного кода.
Последовательность загрузки для Intel Mac аналогична последовательности загрузки для PowerPC Mac. Однако вместо Open Firmware используется расширяемый интерфейс микропрограммного обеспечения (Extensible Firmware Interface, EFI27). Таким образом, загрузчик BootX замещается загрузчиком EFI, который называется boot.efi и хранится в папке /System/Library/CoreServices. К сожалению, boot.efi не является ПО на основе открытого кода, в отличие от BootX. Не имея исходного кода, я поначалу даже не мог быть уверенным в том, что boot.efi отвечает за отображение загрузочного логотипа. Поэтому первая задача, которую мне пришлось выполнить, заключалась в проверке факта нахождения стандартного логотипа Apple в файле boot.efi.
Итак, вот и наступил момент приступить к работе с шестнадцатеричным редактором. В качестве отправной точки я предположил, что картинка логотипа на Intel полностью совпадает с картинкой логотипа на PowerPC. В этом загрузочном логотипе используются два основных цвета: светло-серый фон, #BfBfBf и более темный цвет самого изображения, #73737328. Индексы палитры равны 0x01 и 0х50, соответственно. Пользуясь шестнадцатеричным редактором, я выполнил поиск двух трехбайтных последовательностей, задающих цвета, и обнаружил по одному вхождению для каждой из них. Итак, в том, что касается цветовой палитры, я, по всей вероятности, сорвал Джекпот.
Байты с адресами 0x010Е40 до 0x01113F (в файле boot.efi для Mac OS X 10.4.6) полностью соответствуют палитре для PowerPC. Однако поиск длинной строки байт 0x50 (темно-серый) оказался безрезультатным. Таким образом, я пришел к выводу о том, что либо при использовании одной и той же палитры картинка используется другая, либо если картинка та же самая, то она закодирована. Просмотр остальной части файла показывает, что в исходном файле нет длинных последовательностей одних и тех же значений (например, 0x01 и 0x50, как в исходном файле), что навело меня на мысль, что изображение каким-то образом закодировано. Можно ли догадаться о том, как именно оно закодировано, не имея исходного кода?
Я продолжил исследования, потому что люблю загадки. Мое первое предположение заключалось в том, что данные картинки находятся где-то рядом с данными палитры и, скорее всего, должны располагаться непосредственно за ней. Стандарт EFI определяет встроенные процедуры сжатия как раз для этой цели. Я подумал, что это предположение будет хорошей отправной точкой. Однако после прочтения документации по EFI я не смог обнаружить никакой информации за данными палитры, которая соответствовала бы заголовку сжатия, поэтому я прекратил поиски этой информации. Однако данные, которые следовали непосредственно за палитрой (начиная с адреса 0x011140), обладали рядом очень интересных свойств. Шестнадцатеричный дамп этого фрагмента файла приведен в листинге 2.
1234567//Листинг 2. Шестнадцатеричный дамп информации, следующей сразу же за палитройFF 01 FF 01 FF 01 50 01 01 02 01 17 01 34 01 4703 50 01 13 76 01 01 03 01 20 01 40 06 50 01 1375 01 01 1A 01 42 07 50 01 FA 01 0A 73 01 01 0701 34 09 50 01 43 01 02 72 01 01 0E 01 43 0A 5001 36 72 01 01 14 01 4A 0B 50 01 20 71 01 01 1201 4B 0B 50 01 4D 01 0B 70 01 01 0B 01 48 0C 50
Несмотря на то, что в этом фрагменте нет длинных последовательностей строк, состоящих из значений 0x01 и 0x50, эта два числа появляются необычно часто, но в большинстве случаев — в нечетных байтах. Что же тогда содержится в четных? И тут меня осенило: да ведь это же алгоритм RLE29! Это эффективно! RLE — это ведь очень простой алгоритм сжатия, в котором длинные последовательности из одного и того же байта заменяются всего лишь парой байт: (счетчик, значение). Таким образом, если мы встречаем последовательность из двух байт следующего вида: FF 01, то интерпретироваться она должна как строка из 255 байтов со значением 0x01. Я сам впервые столкнулся с этим алгоритмом при написании графической программы DOS с помощью библиотеки для программирования игр Allegro30. По всей видимости, в факс-аппаратах этот алгоритм тоже находит широкое применение.
Отлично, RLE — это прекрасный выбор, но теперь нам надо подтвердить свое предположение. Воспользовавшись скриптом на Ruby (интересное обсуждение применения Ruby для кодирования RLE, я смог декодировать байты с 0x011140 до 0x01169F, применяя RLE. Разумеется, полученные данные совпали с теми, которые я извлек из файла appleboot.raw, полученного из BootX. Вот теперь я точно сорвал Джекпот! Теперь у меня оказались и палитра, и данные о пикселах. Теперь вполне можно приступать к замене картинки.
Из-за применения сжатия RLE, вы не сможете «запихнуть» сюда любую картинку размером 128×128, как в файл BootX. Дело в том, что для того, чтобы картинка оказалась подходящей для замены, она должна обладать возможностью сжатия до размера 1,376 байт или меньше. А найти (или создать самому) такую картинку — это очень нелегко. Практически все загрузочные логотипы на сайте Res Excellence слишком сложны для того, чтобы сжать их до такого размера. Моя задача, впрочем, оказалась не такой сложной: логотип игры Adventure (рис. 5.58) удовлетворяет всем требованиям.
Во-первых, я люблю Adventure, поэтому данный логотип вполне подойдет для машины MacMAME. Кроме того, этот логотип является двухцветным и содержит большое количество длинных блоков одного и того же цвета, а это значит, что степень его сжатия будет очень высокой. Чтобы еще более упростить задачу, я предпочел заменить стандартные цвета этого логотипа (черный и желтый) на традиционные цвета логотипа Apple. С помощью Photoshop, я заменил цвета в палитре clut.act. Кроме того, в оригинальном логотипе использовалась техника антиалиасинга, известная также как сглаживание контура. Поскольку картинке, которую мы выбрали на замену, сглаживание на пользу не пойдет, а дополнительные цвета, которые при этом неизбежно появятся, ухудшат потенциал сжатия RLE, я просто удалил сглаживающие пикселы.
Поскольку Photoshop не работает корректно со сжатием RLE, я сохранил файл логотипа в двоичном виде (raw image) и написал скрипт на Ruby,с помощью которого и сжал этот двоичный файл по алгоритму RLE. К счастью, логотип сжался до размера 622 байт и потому легко поместился в том пространстве (1,376 байт), отведенном ему в оригинале. Вместо модификации исходного файла boot.efi, я воспользовался его копией, которую назвал chalice.efi. Открыв файл chalice.efi, я записал байты RLE файла с новым логотипом поверх исходного логотипа Apple. Теперь наступил решающий момент — необходимо протестировать модифицированный загрузчик.
Команда bless(8) позволяет заменить загрузчик для тома. Это значит, что я могу использовать файл chalice.efi, оставив в неприкосновенности оригинальный файл boot.efi. Как выяснилось, панель Startup Disk окна System Preferences тоже использует bless (или некий эквивалентный API) с возможностью отмены и перехода к оригинальному файлу boot.efi. Таким образом, в случае, если что-то пойдет не так, я имел возможность загрузиться с дистрибутивного DVD Mac OS X и запустить утилиту Startup Disk. Поэтому я создал новый каталог и скопировал туда свой модифицированный загрузчик (листинг 3).
123//Листинг 3. Создание нового каталога и копирование в него модифицированного загрузчика$ sudo mkdir /efi$ sudo cp chalice.efi /efi
Перед тем как запускать bless, необходимо сделать последнее замечание. Загрузочное меню, появляющееся при запуске с нажатой клавишей Option, использует специальный файл для отображения имени тома под значком, называющийся volume label33. Поскольку на момент написания этой книги опция — label команды bless работала некорректно, я просто воспользовался файлом метки, который использовался в оригинальном файле boot.efi (листинг 4).
1234//Листинг 4. Задание метки тома, используемой оригинальным файлом boot.efi$ sudo cp /System/Library/CoreServices/.disk_label /efi$ cd /efi$ sudo bless —folder . —file chalice.efi —labelfile .disk_label
Теперь настало время перезагрузиться и протестировать, действительно ли работает наш хак (рис. 5.59). Святой Грааль! Теперь у нас новый логотип! Это будет довольно приятным дополнением к моему аркадному кабинету MAME. Впрочем, и сам процесс доставил мне удовольствие.