Владимир Пузанов - JailBreak: Разработка без лимитов
1. Jailbreak: разработка без лимитов
Владимир Пузанов farcaller@hackndev.com
Владимир Кириллов proger@hackndev.com
Hack&Dev Team
2. Что такое Jailbreak
возможность доступа ко всей ФС устройства
возможность выполнения приложений вне системной песочницы
использование всех системных вызовов, в т.ч. fork(2)
возможность запуска неподписанных бинарников
возможность использования динамических библиотек
активируется при помощи бинарного патча на ядро
Sandbox
Системный фреймворк для ограничения доступа, управляется набором правил
(аналог systrace, DTrace)
Активен для всех установленых приложений (в ˜/Applications/).
3. Cydia
Порт APT (Application Packaging
Tool для Debian Linux) на iPhone,
GUI.
Полноценная система
зависимостей, обновлений и
блокировок.
Встроенный магазин для продажи
контента (Cydia Store).
4. Новые горизонты
публикация (и продажа) приложений, не прошедших модерацию в AppStore
интеграция привычных UNIX-приложений на iPhone:
OpenSSH
gdb
<your favorite unix tool here>
темы оформления
расширеная функциональность:
доступ ко всем системным вызовам
использование демонов
инъекция в приложения (в том числе системные демоны и менеджеры:
SpringBoard, etc.)
5. Hacking iPhone: ABI
ABI Application Binary Interface набор соглашений между
программами, библиотеками и операционной системой,
обеспечивающих взаимодействие этих компонентов на низком
уровне на данной платформе
Mach-O Mach Object стандарт ABI в Mac OS X (mach-o(5))
mobile$ file /System/Library/CoreServices/SpringBoard.app/SpringBoard
/System/Library/CoreServices/SpringBoard.app/SpringBoard: Mach-O executable acorn
6. Mach Object
reference: xnu/osfmk/mach-o/
заголовок
struct mach_header
команды загрузки (описывают разметку и компоновочные характеристики
файла)
struct load_command
сегменты описывают регионы виртуальной памяти (код, данные, стек, ...)
struct segment_command
сегмент редактирования ссылок (link edit, для динамических бинарников)
struct dysymtab_command
7. Лезем в бинарник
binutils
as ассемблер
ld компоновщик объектных файлов
dyld рантаймовый редактор компоновки
nm просмотрщик символов (помогает найти точки для внедрения)
otool парсер формата Mach-O (информация о бинарнике)
10. More Tools
gdb GNU Debugger, позволяет изучать программу изнутри почти в
режиме интерпретатора
реализован на ptrace(2)
class-dump генератор прототипов классов и протоколов на базе runtime-секции
бинарника
IDA профессиональный инструмент для дизассемблирования и анализа
кода
ARM Help встроенный в OSX ARMARM с индексированием
man(1) ваш друг, товарищ и брат
12. Лезем в бинарник время выполнения
DYLD_PRELOAD (dyld(1))
изменение протекции виртуальных страниц vm_protect/mprotect(2)
не везде!
13. Плагин для просмотра баланса оператора
Разработаем плагин, который
1 будет посылать USSD-запрос оператору с текстом ∗101#
2 будет перехватывать интерфейс USSD-оповещений в SpringBoard и временно
отключать его
3 будет обрабатывать ответ и выдирать из него остаток на счету
4 будет показывать остаток в форме, доступной через SBSettings
5 и будет автоматически обновлять баланс каждые пять минут
14. Алло, коммборд!
Для звонков в iPhone используется связка из MobilePhone, CoreTelephony и
commcenter.
Необходимый нам код скорее всего находится в MobilePhone, изучим его с помощью
class-dump, IDA и GDB...
Судя по списку классов, нам надо смотреть в PhoneApplication, особенно красив
метод
- (BOOL)dialPhoneNumber:(NSString *)phone
forUID:(int)fp12
dialAssist:(BOOL)fp16;
// IMP=0x0000a14c
15. Внутри MobilePhone...
Агрументы функции в arm передаются в регистрах (при этом не забываем про
“магические” self и cmd в r0 и r1). Остановим выполнение MobilePhone в gdb прямо
в начале потенциального метода:
(gdb) b *0xa14c
Breakpoint 1 at 0xa14c
(gdb) cont
Continuing.
и посмотрим на phone, как только брекпоинт сработает:
Breakpoint 1, 0x0000a14c in ?? ()
(gdb) po $r2
*101#
(тут po сокращение от print-object, команды, которая вызывает -description на
целевом ObjC-объекте)
16. Внутри MobilePhone... (продолжение)
В теле функции есть интересный вызов к CoreTelephony: CTCallDialWithID
После анализа тела функции выше, можно смело утверждать о назначании двух
аргументов этой функции. Попробуем запустить ее самостоятельно:
(gdb) p (int)*0x5e3ac(@"*101#", -1)
0x0
функция выполнилась, а на экране – UI отправки USSD запроса. Искомый API для
инициализации USSD запросов найден.
17. MobileSubstrate перехват вызовов
MobileSubstrate позволяет перехватить C и ObjC вызовы и выполнить необходимый
код. Так, Winterboard перехватывает open и возвращает не оригинальные файлы с
графикой, а файлы из каталогов текущей темы.
Функции:
инъекция в любую ARM/Thumb C-функцию
инъекция в любой Objective-C метод
загрузка пользовательских библиотек или бандлов
18. Блокируем USSD интерфейс в SpringBoard
Задача: заблокировать отображение USSD-окон в SpringBoard.
получим список классов с помощью class-dump и изучим их. Нашей цели
скорее всего соответствует класс SBUSSDAlert.
с помощью анализа бектрейса у методов этого класса (используя брейкпоинты
в gdb и адресам полученным из class-dump), что в методе
+registerForAlerts происходит регистрация SpringBoard в системе событий
CoreTelephony.