[Из песочницы] Реверс-Инжинеринг iPhone 2G
Здравствуйте, уважаемые читатели, в данной статье я хотел рассказать вам про модификацию системных файлов операционной системы IOS. В качестве подопытного у нас будет выступать айфон первого поколения, что нынче относится к раритетам, но данная информация будет актуальна и для других яблочных девайсов.
Для тех кто не в курсе первый айфон выглядит примерно так
Для проведения опытов нам понадобится сам телефон порвергнутый Jajebreak«у, программа IFunBox для просмотра и модификации системных файлов, дизассемблер IDA, HEX редактор.
На моем телефоне установлена IOS 3.1.3, но данные модификации будут работать и на других версиях (может быть).
Думаю, можно переходить от слов к делу.
Модифицировать мы будет системное приложение SpringBoard которое отвечает за интерфейс в том числе и за разблокировку, рабочий стол и тд.
Подключаем смартфон (не побоюсь этого слова) к компьютеру, открываем программу IFunBox и переходим в директорию System/Library/CoreServices/SpringBoard.app и копируем содержимое директории на компьютер для дальнейшего изучения и модификации.
Тут мы можем увидеть множество файлов .png, а также папки где находятся данные о локализации, но нас интересует не это. Нас интересует сам код приложение и находится этот код в файле SpringBoard.
Запускаем IDA и открываем в нем файл SpringBoard, в появившемся окне нажимаем OK, а также во всех следующих окнах жмем OK.
Спустя некоторое время анализ кода будет завершен и нам откроется дизассемблированный листенинг
Как можно заметить, что у всех функций есть «человеческое» название вида «класс + название метода» что очень даже здорово. Теперь можно приступить к самому моддингу спрингборда.
Изменение максимального числа иконок на рабочем столе
Как можно заметить на рабочем столе иконок можно разместить максимум 4 штуки по горизонтали и столько же по вертикали, но можно это ограничение изменить и изменить его достаточно просто. Самый простой вариант разумеется это поставить твик из сидии, но этот вариант не для нас, мы будем для достижения цели патчить исполняемый файл.
Открываем функцию «SBIconList maxIconRows»
Весь алгоритм этой функции состоит в том, чтобы вернуть число 4, это число и является максимальным числом иконок на рабочем столе по вертикали и я предлагаю попробовать изменить его, допустим на число 5.
Для того, чтобы изменить данное ограничение нам нужно узнать смещение инструкции «MOV R0 #4» в файле и делается это очень просто, для этого нужно адрес инструкции 0×4DE18 отнять 0×1000 и мы получим смещение инструкции в исполняемом файле равное 4CE18.
Открываем HEX редактор и переходим по смещению 4CE18
В том байте который я выделил на рисунке находится количество иконок на рабочем столе по вертикали и мы меняем его значение на 5 и сохраняем.
После того как вы сохранили файл то переходим в IFunBox и заменяем оригинальный файл SpringBoard на модифицированный после чего перезагружаем телефон и смотрим на результат.
До модификации
После
Вместо числа 5 можно поставить любое другое число. Теперь изменим число иконок по вертикали и для этого переходим в соседнюю функцию »SBIconList maxIconColumns» и проделываем абсолютно тоже самое что и в прошлый раз.
Изменим число иконок по вертикали на 6, для этого вычисляем смещение команды, снова патчим файл и загружаем его на устройство.
Теперь рабочий стол выглядит так
Теперь попробуем сделать так, чтобы иконки не отображались вообще
Полезного данная модификация принесет мало, но для получение опыта и просто для развлечения сойдет.
Переходим в функцию «SBIconModel isIconVisible»
Данная функция принимает решение отображать иконку или нет и возвращает соответствующий результат. Если функция решила, что иконку нужно отображать то она вернет 1 если решение отрицательно то 0.
Наша задача состоит в том, чтобы подправить функцию таким образом, чтобы она всегда возвращала 0.
Откроем режим «Graph view» и посмотрим на схему функции. Обратим внимание на второй блок, а точнее на условный переход после него и куда он ведет.
В конце функции мы видим, что все ветвления могут заканчиваться в двух возможных местах в зависимости от результата.
Тот условный переход про который я говорил выше в случае выполнения условия переходит в блок где регистру R3 присваивается число 0, а в случае если условие не выполнено то переход не выполняется и начинаются дальнейшие вычисления необходимости отобразить иконку.
Самый просто вариант сделать так, чтобы переход всегда происходил на нужную нам ветку это изменить команду CMP, а точнее ее аргумент например на 2.
Но мы поступим несколько более сложным путем и заменим команду BNE (переход если условие не выполнено) на команду BEQ (переход если условие выполнено). Правда при таком раскладе мы просто инвертируем условие тоесть теоритически иконки которые должны отображаться перестанут этого делать, а те которые отображаться не должны отображаться будут.
Открываем адрес команды BNE (которая на рисунке выше после CMP) в HEX редакторе
Данная команда занимает 2 байта. Первый это смещение на которое нужно «прыгнуть», а второй это опкод команды который нам и нужно поменять.
Изменяем опкод команды BNE который равен 0XD1 на опкод команды BEQ 0xD0 после этого сохраняем и загружаем измененный файл на устройство.
На скриншоте ниже результат
Почему я решил изучать строение динозавра
Об айфоне самой первой модели я мечтал достаточно давно и только недавно появилась возможность его приобрести, причем в очень неплохом состоянии. После недели использования мне стало мало простого пользования и я загорелся желанием узнать что находится «под капотом». Знания ассемблера и опыт в реверс-инжинеринге у меня уже были, но все сильно осложняло практически полное отсутствие документации (даже иностранной) о внутреннем устройстве IOS поэтому пришлось обучаться методом проб и ошибок.
Если данная статья окажется вам интересна, то я напишу вторую часть где расскажу еще много интересной информации про модификацию прошивки первого айфона.