[Из песочницы] Реверс-Инжинеринг iPhone 2G

Здравствуйте, уважаемые читатели, в данной статье я хотел рассказать вам про модификацию системных файлов операционной системы IOS. В качестве подопытного у нас будет выступать айфон первого поколения, что нынче относится к раритетам, но данная информация будет актуальна и для других яблочных девайсов.


Для тех кто не в курсе первый айфон выглядит примерно так


image

Для проведения опытов нам понадобится сам телефон порвергнутый Jajebreak«у, программа IFunBox для просмотра и модификации системных файлов, дизассемблер IDA, HEX редактор.
На моем телефоне установлена IOS 3.1.3, но данные модификации будут работать и на других версиях (может быть).


Думаю, можно переходить от слов к делу.


Модифицировать мы будет системное приложение SpringBoard которое отвечает за интерфейс в том числе и за разблокировку, рабочий стол и тд.


Подключаем смартфон (не побоюсь этого слова) к компьютеру, открываем программу IFunBox и переходим в директорию System/Library/CoreServices/SpringBoard.app и копируем содержимое директории на компьютер для дальнейшего изучения и модификации.


image


Тут мы можем увидеть множество файлов .png, а также папки где находятся данные о локализации, но нас интересует не это. Нас интересует сам код приложение и находится этот код в файле SpringBoard.


860m6gb27yilnpzygzfm3gc-d5w.jpeg

Запускаем IDA и открываем в нем файл SpringBoard, в появившемся окне нажимаем OK, а также во всех следующих окнах жмем OK.


image


Спустя некоторое время анализ кода будет завершен и нам откроется дизассемблированный листенинг


image


Как можно заметить, что у всех функций есть «человеческое» название вида «класс + название метода» что очень даже здорово. Теперь можно приступить к самому моддингу спрингборда.


Изменение максимального числа иконок на рабочем столе


Как можно заметить на рабочем столе иконок можно разместить максимум 4 штуки по горизонтали и столько же по вертикали, но можно это ограничение изменить и изменить его достаточно просто. Самый простой вариант разумеется это поставить твик из сидии, но этот вариант не для нас, мы будем для достижения цели патчить исполняемый файл.


Открываем функцию «SBIconList maxIconRows»


image


Весь алгоритм этой функции состоит в том, чтобы вернуть число 4, это число и является максимальным числом иконок на рабочем столе по вертикали и я предлагаю попробовать изменить его, допустим на число 5.


Для того, чтобы изменить данное ограничение нам нужно узнать смещение инструкции «MOV R0 #4» в файле и делается это очень просто, для этого нужно адрес инструкции 0×4DE18 отнять 0×1000 и мы получим смещение инструкции в исполняемом файле равное 4CE18.
Открываем HEX редактор и переходим по смещению 4CE18


image


В том байте который я выделил на рисунке находится количество иконок на рабочем столе по вертикали и мы меняем его значение на 5 и сохраняем.


После того как вы сохранили файл то переходим в IFunBox и заменяем оригинальный файл SpringBoard на модифицированный после чего перезагружаем телефон и смотрим на результат.


До модификации


image


После


image


Вместо числа 5 можно поставить любое другое число. Теперь изменим число иконок по вертикали и для этого переходим в соседнюю функцию »SBIconList maxIconColumns» и проделываем абсолютно тоже самое что и в прошлый раз.


image


Изменим число иконок по вертикали на 6, для этого вычисляем смещение команды, снова патчим файл и загружаем его на устройство.


Теперь рабочий стол выглядит так


image


Теперь попробуем сделать так, чтобы иконки не отображались вообще


Полезного данная модификация принесет мало, но для получение опыта и просто для развлечения сойдет.


Переходим в функцию «SBIconModel isIconVisible»


image


Данная функция принимает решение отображать иконку или нет и возвращает соответствующий результат. Если функция решила, что иконку нужно отображать то она вернет 1 если решение отрицательно то 0.


Наша задача состоит в том, чтобы подправить функцию таким образом, чтобы она всегда возвращала 0.


Откроем режим «Graph view» и посмотрим на схему функции. Обратим внимание на второй блок, а точнее на условный переход после него и куда он ведет.


v2blxgcx8d3vrl-kbqkbzx71hh4.jpeg

В конце функции мы видим, что все ветвления могут заканчиваться в двух возможных местах в зависимости от результата.


ruafcrp3lm5f5fk0oatfevzdtqi.jpeg

Тот условный переход про который я говорил выше в случае выполнения условия переходит в блок где регистру R3 присваивается число 0, а в случае если условие не выполнено то переход не выполняется и начинаются дальнейшие вычисления необходимости отобразить иконку.


Самый просто вариант сделать так, чтобы переход всегда происходил на нужную нам ветку это изменить команду CMP, а точнее ее аргумент например на 2.


feqhv86sbg4-clgtnetbrhoujgs.jpeg

Но мы поступим несколько более сложным путем и заменим команду BNE (переход если условие не выполнено) на команду BEQ (переход если условие выполнено). Правда при таком раскладе мы просто инвертируем условие тоесть теоритически иконки которые должны отображаться перестанут этого делать, а те которые отображаться не должны отображаться будут.


Открываем адрес команды BNE (которая на рисунке выше после CMP) в HEX редакторе


opgexteejcnb00zwdcrfwusynsk.jpeg

Данная команда занимает 2 байта. Первый это смещение на которое нужно «прыгнуть», а второй это опкод команды который нам и нужно поменять.


Изменяем опкод команды BNE который равен 0XD1 на опкод команды BEQ 0xD0 после этого сохраняем и загружаем измененный файл на устройство.


На скриншоте ниже результат


kvcxgmjaizlev89vkq42-solkoc.png

Почему я решил изучать строение динозавра


Об айфоне самой первой модели я мечтал достаточно давно и только недавно появилась возможность его приобрести, причем в очень неплохом состоянии. После недели использования мне стало мало простого пользования и я загорелся желанием узнать что находится «под капотом». Знания ассемблера и опыт в реверс-инжинеринге у меня уже были, но все сильно осложняло практически полное отсутствие документации (даже иностранной) о внутреннем устройстве IOS поэтому пришлось обучаться методом проб и ошибок.


Если данная статья окажется вам интересна, то я напишу вторую часть где расскажу еще много интересной информации про модификацию прошивки первого айфона.

© Habrahabr.ru