Как самому сделать кастомный бандл для Pwnage Tool

Выполняя настойчивую просьбу одного нашего читателя, мы публикуем инструкцию по созданию дополнительных бандлов для утилиты Pwnage Tool. Сразу нужно оговориться, что процедура, о которой пойдёт речь далее, будет интересна преимущественно продвинутым пользователям. Если вы плохо представляете себе, зачем нужна утилита Pwnage Tool, то не советуем вам напрягать мозг и пытаться разобраться в перипетиях нашего мануала, он отнюдь не для новичков. Сам мануал адресован тем, кто часто собирает кастомные прошивки и горит желанием неограниченно модифицировать их содержимое. Как раз это и призваны делать бандлы для Pwnage Tool — например, они позволяют добавить в iOS любые нужные вам файлы, перезаписать ненужные файлы их нужными версиями или вообще удалить какие-либо объекты внутри прошивки. Мы расскажем про принципы устройства бандлов, а как их применять — решайте сами. Главными ограничителями здесь будут ваша фантазия и количество свободного времени ;)

Что такое бандл? Это пакет, содержащий некоторые файлы, которые затем добавляются в прошивку, и/или некоторые скрипты, которые выполняются над её содержимым. Так уж получилось, что в утилите Pwnage Tool, предназначенной для создания кастомных прошивок, словом «бандл» называются две разные вещи:

  • те самые бандлы, о которых мы будем говорить сегодня
  • бандлы пропатчивания ядра и загрузчика iOS, которые отвечают за возможность работы Pwnage Tool с той или иной версии прошивки

Чтобы создавать бандлы второго типа, нужны гораздо более глубокие познания в устройстве iOS и в программировании. Если вы научитесь их делать, то можете гордо называть себя iOS-хакером.

Бандлы первого типа создаются не в пример проще. Знаете вы или нет, но с одним таким бандлом вы имеете дело каждый раз, когда запускаете Pwnage Tool и создаёте кастомную прошивку. Этот бандл ставит в прошивку Cydia. На нём проще всего рассмотреть устройство и правила создания бандлов.

Итак, все бандлы спрятаны внутри программы Pwnage Tool. Чтобы заглянуть к ней внутрь, в её контекстном меню выберите пункт «Показать содержание пакета»:

Откроется новая папка с начинкой программы. Перейдите в подпапку /Contents/Resources/CustomPackages, и вы увидите встроенные в Pwnage Tool бандлы:

Скопируйте CydiaInstaller.bundle на Рабочий стол. По его подобию вы сможете смастерить свой бандл. Бандл, также как и любая программа в Mac OS X — просто папка. Его содержимое тоже можно увидеть через команду «Показать содержание пакета» в контекстном меню. Содержимое это выглядит очень просто:

В папке files собраны все файлы, добавляемые в прошивку. При этом файлы, лежащие непосредственно в папке files, потом попадут в самый корень диска iPhone/iPod Touch/iPad/Apple TV. Файлы, лежащие в подпапках, попадут в одноимённые подпапки внутри файловой системы устройств. Если при этом имена добавляемых файлов совпадут с уже имеющимися, последние будут перезаписаны.

Похожим образом устроены и все DEB-пакеты из Cydia: они имитируют строение файловой системы iOS. Казалось бы, всё элементарно просто, но как раз здесь и кроется самая главная ловушка. Это права доступа и владельцы. В iOS, как и в Mac OS X, права и владельцы имеют ключевое значение: если вы неверно их выставите, то в лучшем случае получите вылет той программы, которую хотели поставить, а в худшем — убьёте прошивку, и устройство вообще не загрузится.

Остюда вытекает важный совет. Если вы что-то собираетесь менять в файловой системе iOS, то поставьте на свой гаджет программу типа iFile из Сидии или подключитесь к устройству по SSH, чтобы узнать нужного владельца, группу и права на каждый изменяемый объект. Владелец, группа и права задаются отдельно для каждой папки, подпапки, для каждого файла — представляете, насколько это геморройная работа?

Задавать нужные права можно двумя способами: через файл Info.plist внутри бандла или через подключаемый скрипт. Начнём с файла Info.plist. Он содержит основную информацию о вашем бандле: идентификатор, название и описание, а также совместимость. Типичный вид файла Info.plist таков:

[php]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Commands</key>
<array/>
<key>Description</key>
<string>Описание пакета</string>
<key>Identifier</key>
<string>org.company.package</string>
<key>Name</key>
<string>Имя пакета</string>
<key>Size</key>
<integer>12345</integer>
<key>SupportedFirmware</key>
<array>
<string>iPhone1,2_4.1_8B117</string>
<string>iPhone2,1_4.1_8B117</string>
<string>iPhone3,1_4,1_8B117</string>
</array>
</dict>
</plist>[/php]

Пройдёмся по структуре файла:

  • Name / Description — название и описание проекта. Эти поля влияют только на то, как бандл будет показываться в Pwnage Tool
  • Size — размер пакета. Задаётся в байтах, тоже касается только отображения бандла в Pwnage Tool
  • Identifier — уникальный идентификатор вашего бандла. Обычно идентификаторы имеют вид com.company.package, где company меняют на имя разработчика, package — на название пакета. Например, com.appstudio.somethingstrange. Очень важно, чтобы идентификатор не совпал с таковым у других бандлов Pwnage Tool
  • SupportedFirmware — массив, где по строкам указываются совместимые с бандлом версии прошивок. Как правильно заполнить эти строки? Очень просто: идёте в наш Архив версий iOS, находите нужную прошивку, копируете ссылку на неё и оставляете нужный фрагмент из имени файла (он помечен красным):

http://appldnld.apple.com/iPhone4/061-9858.20101122.Er456/iPhone3,1_4.2.1_8C148_Restore.ipsw

  • Commands — очень важный массив команд над объектами. Про него нужно рассказать отдельно.

Массив Commands позволяет задать основные операции над файлами бандла, заливаемыми в прошивку. Вот сокращённая версия данного массива из бандла Сидии:

[php] <key>Commands</key>
<array>
<dict>
<key>Action</key>
<string>SetOwner</string>
<key>File</key>
<string>Applications</string>
<key>Owner</key>
<string>0:80</string>
</dict>
<dict>
<key>Action</key>
<string>SetPermission</string>
<key>File</key>
<string>usr/bin/login</string>
<key>Permission</key>
<string>0755</string>
</dict>
<dict>
<key>Action</key>
<string>RunScript</string>
<key>File</key>
<string>space.sh</string>
</dict>
</array>[/php]

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

  • SetOwner задаёт объект (строка File) и соответствующих ему владельца и группу (в числовой форме через двоеточие — 0:80, т.е. владелец root, группа admin)
  • SetPermission задаёт объект и соответствующие ему права доступа (в четырёхзначном формате)
  • Action запускает скрипт или программы (в отличие от предыдущих двух команд, путь отсчитывается от корня бандла, а не от корня папки files)

Как видите, в файл Info.plist можно прописать вызов скрипта (SH-файла), ну а вписать в скрипт можно всё, что угодно. Создаёте текстовый файл, вбиваете для него правильный заголовок:

[php]#!/bin/bash[/php]

Со следующей строки можете начинать вбивать нужные команды. Например, можете удалить приложение «Камера» (это исключительно для примера :).

[php]#!/bin/bash
rm -rf Applications/Camera.app[/php]

Как вы понимаете, без знания терминальных команд Mac OS X скрипты вы не напишете. Основы этой сложно области знаний вы сможете найти в нашем цикле статей Знакомство с терминалом. Кстати, там же идёт речь и о правах доступа.

После того, как вы распортрошили бандл и поменяли в нём всё, что нужно, исправили под себя Info.plist и добавили нужные скрипты, остаётся просто закрыть папку и скопировать изменённый бандл обратно внутрь Pwnage Tool, в ту же подпапку /Contents/Resources/CustomPackages. Потом можно запустить Pwnage Tool… и вуаля:

Не думайте, что у вас всё замечательно получится с первого раза. Бандлы — очень капризные штуковины (особенно при наличии в них сложных скриптов). Порой можно убить целый день на то, чтобы понять, в чём загвоздка. Как раз поэтому мы и сказали в начале статьи, что советуем морочиться с бандлами только тем, кто готов безжалостно убивать своё свободное время.