Как я обнаружил древнюю пасхалку в Power Mac G3

в 13:01, , рубрики: apple, mac os, ruvds_перевод, Пасхалки, реверс-инжиниринг
Как я обнаружил древнюю пасхалку в Power Mac G3 - 1

Недавно залез в ROM оригинального Power Macintosh G3 и случайно обнаружил там пасхалку, о которой до этого ещё нигде не писали.

Началось с того, что одним воскресным утром я решил заглянуть в файл-шаблон ROM для Mac с помощью программы HEX Fiend Эрика Хармана. Меня интересовало, какие ресурсы хранятся в постоянной памяти Power Mac G3. Эта ROM использовалась в моделях Beige, Mini Tower и всех G3, выпускавшихся с 1997 по 1999 год.

Пишу я эту статью в середине 2025, и мне не верится, что сегодня Power Mac G3 уже больше 27 лет. Невероятно!

Изучая память этого ПК, я заметил два интересных момента.

Во-первых, я нашёл в ней ресурс с типом HPOE, где хранилась фотография в формате JPEG с изображением множества людей, предположительно тех, кто работал над этими моделями Mac.

Как я обнаружил древнюю пасхалку в Power Mac G3 - 2

Но сей факт не стал открытием. Пьер Дандюмонт писал об этом ещё в 2014 году. Тем не менее в своей статье он отметил, что так и не выяснил, как вывести это скрытое фото на устройстве. В некоторых более старых моделях Mac подобные изображения выводятся секретной комбинацией клавиш, но в этой аналогичный механизм оставался загадкой.

Вторым же интересным наблюдением стала полезная зацепка. Я продолжал искать в ROM прочую любопытную информацию и наткнулся на ресурс nitt с ID 43, который назывался «Native 4.3». Благодаря статье Кита Кайзершота, который хорошо расписал историю Pippin, я быстро понял, что это нативный код SCSI Manager 4.3 для PowerPC. Но внимание моё к этому ресурсу привлёк отнюдь не SCSI Manager. В самом конце этой области данных я нашёл интересные строки на языке Pascal:

Как я обнаружил древнюю пасхалку в Power Mac G3 - 3

Особенно меня заинтриговали следующие:

  • .Edisk,

  • secret ROM image,

  • The Team.

В частности, мне показалось, что текст «secret ROM image» связан с показанной выше фотографией. В надежде разгадать возникшую загадку я решил копнуть глубже, чтобы выяснить роль этих строк в SCSI Manager. Я рассчитывал, что это поможет мне понять, как заставить Power Mac G3 вывести скрытое изображение.

Обратившись к интернету с запросом «secret ROM image», я выяснил, что эта строка использовалась для размещения пасхалок в ранних моделях PowerPC. На них нужно было просто ввести этот текст, выделить его, перетащить на рабочий стол, и вуаля — изображение открывалось. Но на G3 такой подход не работал.

Я подумал, что на этих ПК есть какой-то похожий способ вывода скрытых картинок, но его описание нигде найти не смог. Оставалось только дизассемблировать код в поиске мест использования этого текста. И почему меня постоянно тянет в эти безумные кроличьи норы?

Я извлёк весь ресурс nitt с ID 43 в файл и просмотрел его:

$ file nitt43
 nitt43: header for PowerPC PEF executable

Не сильно удивительно, учитывая, что первые 12 байт представляли “Joy!peffpwpc”. Я сунул весь этот файл в декомпилятор Ghidra, который сразу же распознал его формат PEF и без проблем загрузил. И хотя у меня есть достаточный опыт чтения кода ассемблера для x86 и ARM, я практически ничего не знаю об ассемблере для PowerPC. К счастью, Ghidra прекрасно с этим файлом справился.

Но здесь возникла одна проблемка: анализатор не нашёл в огромном списке указателей на переменные никаких ссылок на строку “secret ROM image”. Немного поломав голову, я понял, что он не обнаруживал ссылки на несколько переменных. И здесь мне повезло, так как повторное выполнение Auto Analyze помогло найти ещё некоторые ссылки, включая все интересовавшие меня строки. Причём для этого не пришлось менять никакие настройки анализатора.

Как я обнаружил древнюю пасхалку в Power Mac G3 - 4

Функция, оперировавшая этими строками, определённо взаимодействовала с драйвером .EDisk, который, как я уже знал из своего опыта, являлся драйвером RAM-диска. Похоже, она с помощью strncmp() проверяла строки на содержание “secret ROM image” и в случае совпадения создавала файл “The Team”, который открывала и заполняла нужными данными.

Как я обнаружил древнюю пасхалку в Power Mac G3 - 5

Я причесал этот вывод дизассемблера, присвоив переменным имена и выяснив типы данных. К счастью, для многих функций вроде PBGetVInfoSync() имелось много доступной документации, поэтому нужно было лишь сообщить Ghidra об использовавшихся структурах Mac Toolbox.

Как я обнаружил древнюю пасхалку в Power Mac G3 - 6

Хорошо, так уже куда понятнее!

Я не смог разобраться, как отформатировать 32-битные аргументы функций вроде 0x48504f45 в 4-буквенные коды вроде HPOE, поэтому добавил комментарии. Просто Ghidra ни в какую не давал мне выводить их при декомпиляции в виде ASCII, хотя при наведении курсора на константу показывал окошко с соответствующим текстом. Это легко проделать в IDA, но добиться того же от Ghidra я так и не смог. Я пробовал Set Equate, но безрезультатно. Если кто-то знает, как это сделать, поделитесь в комментариях.

Тем не менее показанный выше декомпилированный код вполне понятен, и вот описание его действий:

  • Он ищет драйвер .Edisk. (фактически драйвер называется .EDisk, но мне кажется, что Mac OS в этом случае не обращает внимания на регистр.)

  • Находит связанный с этим драйвером диск (RAM-диск).

  • Ищет связанный с этим диском том.

  • Если этот том назван “secret ROM image”:

    • Загружает ресурс HPOE с ID 1, где содержатся JPEG-данные.

    • Создаёт файл с идентификатором создателя ttxt и форматом JPEG под названием “The Team”.

    • Открывает этот файл, записывает в него данные JPEG и закрывает.

    • Проделывает что-то с записью, которая управляет драйвером. Здесь я не стал дальше вникать.

Очень интересно. Значит, этот код явно ищет RAM-диск с именем “secret ROM image”, но я не понимал, как конкретно его запустить. Эта функция вызывалась лишь в одном месте: в другой функции, которая проверяла равенство первого аргумента значению 0x3DA (986 в десятичной форме).

У меня не было подходящего G3 Beige для тестов, поэтому я поделился своими находками в #mac68k на Libera. В итоге на помощь пришёл ^alex, который поэкспериментировал в Infinite Mac, используя мои наработки. Он довольно быстро выяснил, что фишка заключалась в форматировании RAM-диска и вводе специального текста в соответствующее диалоговое окно:

Как я обнаружил древнюю пасхалку в Power Mac G3 - 7

Я достал свой G3 Desktop, протестировал его приём на реальном железе, и он сработал! Если вы хотите попробовать сами, как сделал это ^alex, запустите Infinite Mac в своём браузере по этой ссылке, которая при помощи DingusPPC настроит эмулированный G3 Beige под управлением Mac OS 8.1. Однако есть одна причуда, которая приводит к провалу разрешения псевдонимов при запуске. Я намеренно эту функцию отключил. Просто кликните Stop, когда выскочит ошибка. Вот все необходимые инструкции:

  • Включите Ram Disk в панели управления Memory.

  • Перейдите в меню Special и выберите Restart.

  • Затем на рабочем столе выберите иконку RAM Disk.

  • В меню Special выберите Erase Disk.

  • Введите текст «secret ROM image» в точности, как показано выше.

  • Кликните Erase.

Когда вы откроете отформатированный RAM-диск, там должен находиться файл «The Team»:

Как я обнаружил древнюю пасхалку в Power Mac G3 - 8

Если дважды по нему кликнуть, он откроется в программе SimpleText:

Как я обнаружил древнюю пасхалку в Power Mac G3 - 9

Судя по отзывам тех, кто опробовал этот метод, включая мой собственный опыт, работает он на всех системах вплоть до Mac OS 9.0.4. А вот с 9.1, похоже, уже нет.

Как я понял, этот секрет до нашего эксперимента раскрыт не был. Многие знали, что изображение находится в ROM, но никто не мог выяснить, как активировать его вывод. Это, пожалуй, одна из последних пасхалок, которые были спрятаны в Mac до того, как Стив Джобс открыто запретил их в 1997, когда вернулся в Apple. Интересно, он вообще о ней знал?

Отдельно хочу поблагодарить ^alex, который выяснил, что для активации пасхалки нужно отформатировать Ram Disk. Не уверен, додумался бы я сам до этого или нет, да и мне потребовалось бы куда больше усилий, чтобы трассировать оставшуюся часть кода и разобраться.

Автор: Bright_Translate

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js