Resource fork — «вилка ресурсов» или «поток ресурсов» — это один из компонентов, из которых состоят файлы в Mac OS, предназначенный для хранения в файле структурированных данных. Второй компонент — это data fork («вилка данных» или «поток данных»), применяемый для хранения неструктурированных данных. Компонент файла resource fork хранит такую информацию, как значки (icons), определения меню и их содержимого, диалоговые окна, а также код приложения (machine code). Хотя resource fork наиболее активно используется приложениями и исполняемыми файлами, каждый файл может иметь в своем составе этот компонент. Например, файл, созданный текстовым процессором, может хранить встроенные графические объекты в resource fork, а текст — в data fork. Более подробную информацию о resource fork и data fork можно найти здесь: http://en.wikipedia.org/wiki/Resource_fork.
Начнем, пожалуй, с добавления текстового сообщения в окно регистрации. Текст может быть любым (покуда размеры окна регистрации это позволяют), но в данном примере мы добавим текстовую строку This User Has Too Much free Time. Итак, приступим. Запустите приложение Terminal (найти его можно в папке Utilities, вложенной в папку Applications).
Первый файл, который нуждается в модификации — это файл com.apple.loginwindow.plist, но прежде, чем начинать какие-либо манипуляции, вам следует создать его резервную копию. Лучше всего сохранить временную резервную копию на рабочем столе, но можно использовать для этой цели любую папку. Если вас вполне устраивает рабочий стол, то команда для резервного копирования будет выглядеть примерно так:
1$ cp /Library/Preferences/com.apple.loginwindow.plist ~/Desktop
Значок $ представляет собой приглашение командной строки, при вводе команды его следует пропустить.
Смысл этой команды очень прост. Вы даете оболочке указание скопировать (cp) файл /Library/Preferences/com.apple.loginwindow.plist в другую папку: /Users/username/Desktop. Здесь значок ~ обозначает путь к вашему домашнему каталогу Users/yourusername/, где username — это входное имя, под которым вы зарегистрировались в системе (в моем случае — cks). В любом случае, появление нового значка с именем com.apple.loginwindow.plist на рабочем столе будет означать, что резервная копия успешно сохранена.
После того как резервная копия будет создана, можно приступать к экспериментам с оригиналом. Поскольку файл, о котором идет речь, имеет двоичный формат, вы не можете просто открыть его любым текстовым редактором и начинать вносить изменения. Вернитесь в окно Terminal и преобразуйте файл в формат, подлежащий редактированию. Воспользуйтесь для этого командой plutil:
12$ sudo plutil -convert xml/Library/Preferences/com.apple.loginwindow.plist
Обратите внимание, что команду plutil необходимо предварить командой sudo (это позволит вам получить привилегии, необходимые для модификации файла). Система предложит вам ввести пароль и выведет предупреждение, показанное на рис. 5.1 (это предупреждение появляется, когда вы впервые запускаете команду sudo; в следующий раз оно уже не появится).
После обработки командой plutil файл можно будет редактировать текстовым редактором Nano, который можно запустить из командной строки. Чтобы открыть файл в редакторе Nano, введите следующую команду:
1$ sudo nano /Library/Preferences/com.apple.loginwindow.plist
Ранее редактор Nano был известен под именем Pico, и если вы введете из командной строки команду pico, то запущен будет редактор Nano.
Теперь окно Terminal будет выглядеть примерно так, как показано на рис. 5.2.
Переместите курсор в позицию, следующую непосредственно за тегом (перемещение курсора в Nano осуществляется с помощью клавиш с изображением стрелок) и нажмите клавишу Return. Теперь введите следующий текст (листинг 1).
12345//Листинг 1. Код, который требуется добавить в файл//com.apple.loginwindow.plist, чтобы в регистрационном окне появилось//индивидуальное текстовое сообщение<key>LoginwindowText</key><string> This User Has Too Much Free Time</string>
Обратите внимание, что первая строка (с тегом key) является обязательной, и она должна находиться на своем месте, потому что система читает из нее инструкции по дальнейшим действиям. Вторая же строка дает вам возможность добавить в окно любой текст по вашему усмотрению (при этом вводимая вами строка должна заключаться между тегами string).
Добавив эти две строки, сохраните файл. В Nano вызов команд осуществляется нажатием управляющих клавиш (в нижней части экрана Nano имеется значок «^», что соответствует нажатию клавиши Ctrl). Итак, нажмите клавишу Ctrl. Чтобы действительно сохранить файл (в терминологии Nano — Writeout, т. е. перезаписать), нажмите клавишу Return. Внесенные изменения будут сохранены, а модифицированный файл перезаписан. Теперь, чтобы выйти из Nano, нажмите клавиатурную комбинацию Ctrl+X. Как вы помните, ранее вы выполняли преобразование файла из двоичного формата с помощью команды plutil. При желании вы можете преобразовать ее обратно в двоичный формат, дав следующую команду:
12$ sudo plutil -convert binary1/Library/Preferences/com.apple.loginwindow.plist
Теперь, когда вы в следующий раз будете регистрироваться в системе, вы увидите окно, выглядящее примерно так, как показано на рис. 5.3.
Как получить снимок экрана окна регистрации в системе
Этот совет практически бесполезен для большинства пользователей, кроме тех, кто пишет книги или составляет справочные руководства. Тем не менее, я получаю множество вопросов от пользователей, интересующихся тем, как же получить экранные снимки окон регистрации. Это очень хороший вопрос, так как ни одна из явно доступных и очевидных опций (клавиатурные комбинации, утилиты Grab и Skitch) не будут работать до того, как вы зарегистрируетесь в системе.
Вам потребуется два компьютера Mac, чтобы добиться поставленной цели. Кроме того, чтобы эта задача была максимально упрощена, оба компьютера должны работать под управлением Mac OS X Leopard. Если это требование соблюдено, активизируйте на обоих компьютерах совместное использование экрана (screen sharing). Для этого откройте окно System Preferences, выберите опцию Sharing, а затем установите флажок, соответствующий опции Screen Sharing.
На боковой панели окна приложения Finder выберите компьютер, экран которого требуется предоставить в общий доступ, и окно Finder немного изменится. В правом верхнем углу вы увидите кнопку Share Screen (рис. 5.4). Щелкните по этой кнопке, пройдите процедуру аутентификации, и раскроется новое окно, в котором отобразится точная копия экрана удаленного компьютера. При этом вы сможете не только наблюдать за тем, что происходит на этом компьютере, но и получите довольно широкие возможности по управлению им.
Чтобы получить экранный снимок, выйдите из системы (да-да, при использовании опции совместного доступа к экрану вы можете выйти из системы на удаленном компьютере). Вы получите сообщение о разорванном соединении от приложения Screen Sharing.app, но соединение будет автоматически восстановлено, поэтому беспокоиться не стоит. Как только регистрационное окно появится вновь, вы сможете снять экранный снимок любым методом, который вы предпочитаете.
Если же вы работаете с версией Mac OS X, более ранней, чем Leopard, то метод получения экранных снимков будет очень похожим, но более трудоемким. Вам придется установить между компьютерами соединение SSH (Secure Shell). Проще всего это сделать, установив флажок, расположенный рядом с опцией Remote Login на панели Sharing окна параметров предпочтительной настройки системы. Как только вы сообщите удаленному Mac о своем намерении осуществить удаленный вход в систему, вам будет предложено зарегистрироваться из окна Terminal. Естественно, вам понадобится ввести и пароль к учетной записи пользователя. После того как это будет сделано, воспользуйтесь утилитой командной строки для получения снимка экрана удаленного компьютера. Типичная команда может выглядеть так:
1$ sudo screencapture -tjpg logwindow.jpg
Команда sudo повышает уровень привилегий команды, следующей за ней (в данном случае это — команда screencapture, предназначенная для получения экранного снимка). Опция -t задает формат графического файла (в данном примере выбран формат JPG), а аргумент logwindow.jpg задает имя, под которым утилита screencapture сохранит полученный файл. И где же будет сохранен ваш файл? Он появится на удаленном компьютере в том каталоге, из которого вы дали команду для получения экранного снимка (скорее всего, это будет ваша домашняя папка). Так как вы запустили команду screencapture с помощью sudo, файл будет принадлежать пользователю root, поэтому для того, чтобы присвоить себе права владельца этого файла, вам потребуется дать следующую команду:
1$ sudo chown yourusername logwindow.jpg
Отмена модификации
Если вам надоест сообщение, регулярно появляющееся в вашем регистрационном окне, то отменить внесенную модификацию будет очень просто. Найдите резервную копию файла, которую вы создали прежде, чем приступать к выполнению данного рецепта, и переместите его обратно в папку Preferences, вложенную в вашу папку Library. Это же просто! А что, если вы пренебрегли резервным копированием? И в этом случае вы не столкнетесь с проблемами.
Повторите всю процедуру, описанную чуть ранее, но теперь, вместо добавления кода в файл com.apple.loginwindow.plist, удалите строки, заключенные в тэги key и string, добавленные вами ранее (см. листинг 1). После этого ваше регистрационное окно приобретет прежний вид.
В общем-то, индивидуальное текстовое сообщение в регистрационном окне — это явно недостаточно для хакера. В конце концов, вы работаете с Mac, а это значит, что вам наверняка захочется попробовать модифицировать и остальные визуальные элементы интерфейса Mac OS X. Давайте выведем наш рецепт на новый уровень и добавим дополнительные модификации в регистрационное окно. Это уже более серьезный хак, нежели предыдущий, и поэтому вам понадобится произвести некоторую предварительную подготовку.
В первую очередь создайте файл формата TIFF размером 90×90 пикселов и с разрешением 72 dpi. В рассматриваемом примере я использовал фотографию моего сына (именно к нему и относится строка о том, что «Данный пользователь имеет слишком много свободного времени»). Вы, разумеется, можете воспользоваться любой картинкой, которая вам понравится.
Присвойте файлу имя, не конфликтующее ни с одним из файлов, уже присутствующих в каталоге, и переместите этот файл в папку Resources. Если вы зададитесь вопросом «а как я узнаю, какие файлы уже находятся в папке Resource?», то вы абсолютно правы. Вы же не собираетесь перезаписать один из существующих файлов, ведь так? Конечно, вы можете и просмотреть эту папку через Finder, но более простое решение — выполнить ту же задачу с помощью Terminal. Сначала перейдите в нужный каталог (обратите внимание, что всю эту команду необходимо вводить одной строкой):
12$ cd /System/Library/CoreServices/SecurityAgentPlugins/loginwindow.bundle/Contents/Resources
Затем дайте следующую команду:
1$ ls
Вы увидите список файлов, уже имеющихся в этом каталоге (рис. 5.5).
Что ж, вероятность того, что вы вдруг ни с того ни с сего решите назвать свой файл именем rbPressed.tif, ничтожно мала, но если вы очень любите выполнять все без подготовки и, как говорится, «играть с листа», то вероятность выбора имени yellow.tiff все же существует. И это будет очень неудачный выбор! Итак, теперь вы знаете, каких имен следует избегать при сохранении вашего нового файла. Не забывайте, файл должен быть сохранен именно в формате TIFF, и его размер должен составлять 90×90. Пользуйтесь любым графическим редактором — например, для этой цели вполне подойдет и встроенный редактор Leopard — это приложение, которое называется Preview. Просто откройте ваш файл этим приложением и отредактируйте его.
Создав новый файл, сохраните его, а затем переместите в нужный каталог. Здесь действует то же самое правило — вы можете перемещаться по папкам с помощью Finder, но гораздо проще и быстрее эта задача выполняется через Terminal. Сначала сохраните файл на рабочем столе, а затем переместите в нужную папку:
123$ sudo cp ~/Desktop/abide.tif/System/Library/CoreServices/SecurityAgentPlugins/loginwindow.bundle/Contents/Resources/
Обратите внимание, что, как и в предыдущем случае, эта команда должна вводиться одной строкой, без пробелов при указании пути к каталогу (в данном примере abide.tif — это имя исходного файла, а следующая за ним строка — путь к целевому каталогу).
На следующем шаге вам потребуется модифицировать файл LoginWindowUI.nib3, который задает вид регистрационного окна. Сначала следует создать резервную копию этого файла. Делается это с помощью следующей команды (здесь, как и во всех предыдущих случаях, команда должна вводиться одной строкой, без пробела между loginwindow.bundle и Contents):
123$ cp -R/System/Library/CoreServices/SecurityAgentPlugins/loginwindow.bundle/Contents/Resources/English.lproj/LoginWindowUI.nib ~/Desktop
После того как вы нажмете клавишу Return, вы увидите, что на вашем рабочем столе появился новый .nib-файл с именем LoginWindowUI.nib. Лучше всего переместите этот файл в безопасное место, где он точно останется в неприкосновенности. Теперь выполните двойной щелчок мышью по копии LoginWindowUI.nib на рабочем столе, и файл будет открыт в приложении Interface Builder (чтобы это произошло, необходимо, чтобы на вашем компьютере был установлен инструментарий разработчика Xcode). На экране вы увидите два окна, показанные на рис. 5.6.
На данном этапе ситуация становится немного более сложной. Выполните двойной щелчок мышью по значку Window, и на экране появится следующее окно (рис. 5.7).
На первый взгляд вы не можете сказать этого с уверенностью, но появившееся окно — это и есть регистрационное окно. Однако это так, и большой квадрат в его центре — это логотип Apple. Выполните по нему щелчок мышью и выберите опцию Inspector из меню Tools приложения Interface Builder. Если все выполнено правильно, вы увидите окна, показанные на рис. 5.8.
Обратите внимание на раскрывающийся список правее метки Image. Если вы измените значение applelogo на имя вашего .tiff-файла, помещенного в папку Resources (в рассматриваемом примере я назвал файл abide.tif), то вместо логотипа Apple в регистрационном окне появится именно эта картинка. Например, если вы замените его на имя файла contH.tiff, то вместо логотипа Apple в окне регистрации вы увидите кнопку Continue.
Итак, введите имя графического файла, который вы поместили в папку Resources на предыдущем шаге. Для этого выберите из меню опции File → Save, чтобы сохранить .nib-файл, а затем закройте Interface Builder, нажав клавиатурную комбинацию Command+Q. Теперь скопируйте вашу модифицированную копию файла LoginWindowUI.nib обратно в папку English.lproj, и на этот раз — с перезаписью исходного файла. Когда вы попытаетесь это сделать, вы получите сообщение о том, что эта операция вам запрещена.
Но ведь вы же не кто-нибудь, а владелец данного компьютера! Поэтому вы можете все. Щелкните по кнопке Authenticate (или, если вы работаете из командной строки, предварите команду cp командой sudo), а затем введите ваш пароль. После этого система сделает то, что вы хотите — сохранит файл в папке English.lproj. Командная строка, выполняющая эту операцию, выглядит следующим образом (введите пробел после LoginWindowUI.nib/, но не вводите пробела между loginwindow.bundle/ и Contents):
123$ sudo cp -r ~/Desktop/LoginWindowUI.nib//System/Library/CoreServices/SecurityAgentPlugins/loginwindow.bundle/Contents/Resources/English.lproj/LoginWindowUI.nib
Теперь настало время посмотреть на результат. Выйдите из системы, и при последующей попытке регистрации регистрационное окно будет выглядеть так, как показано на рис. 5.9.
Еще один вариант добиться того же результата (но несколько менее корректный) — просто взять и заменить файл applelogo.tif на ваш собственный .tiff-файл. Конечно, это тоже сработает, но данный подход, во-первых, гораздо менее элегантен, а во-вторых — менее познавателен. Ведь, в конце концов, следуя данному рецепту, вы приобретете навыки работы с Interface Builder.
В отличие от хака с заменой значка Safari, который будет использоваться только при открытии страницы с ошибкой Safari, логотип Apple (applelogo) отображается не только в окне регистрации. Вероятно, вам не понравится, если замененный значок будет выскакивать вместо логотипа Apple в не самое подходящее время.
Как вы, вероятно, уже догадались, этот подход можно использовать и для других модификаций регистрационного окна. Таким образом, вы можете изменить его буквально до неузнаваемости. Ну, а я удовлетворился лишь добавлением сообщения и картинки с изображением моего ребенка. Вы же можете использовать Interface Builder как вам заблагорассудится и при желании модифицировать абсолютно все его визуальные элементы.
Как только вы начнете модифицировать .nib-файлы, вы сразу же почувствуете искушение повозиться с .nib-файлами абсолютно всех приложений. Чтобы посмотреть, какие .nib-файлы содержатся в том или ином приложении, щелкните по приложению правой кнопкой мыши и из контекстного меню выберите команду Show Package Contents. Здесь стоит отметить, что .nib-файлы содержатся не во всех приложениях, но многие программы их имеют.