13.06.2015

Безопасность IOS-приложений (часть 33) – Написание твиков при помощи Theos (Cydia Substrate)

image

В предыдущих статьях этого цикла мы рассматривали модификацию приложений при помощи IDA Pro, Hopper, Cycript и т. д. Однако когда мы изменяем логику работы приложения, используя IDA Pro или Hopper, этот процесс часто трудоемок. Если мы используем Cycript - внесенные изменения непостоянны. Еще один способ изменить алгоритм работы приложения – написать твик, чем мы и займемся в этой статье.

Автор: Prateek Gianchandani

В предыдущих статьях этого цикла мы рассматривали модификацию приложений при помощи IDA Pro, Hopper, Cycript и т. д. Однако когда мы изменяем логику работы приложения, используя IDA Pro или Hopper, этот процесс часто трудоемок. Если мы используем Cycript - внесенные изменения непостоянны. Еще один способ изменить алгоритм работы приложения – написать твик, чем мы и займемся в этой статье. Твик представляет собой патч, используемый во время работы приложения (runtime patch), который написан на основе фреймворка Cydia Substrate. Cydia Substrate состоит из трех компонент – MobileHooker, MobileLoader и Safe Mode. Более подробно об этих компонентах можно почитать здесь. Джей Фриман (в узких кругах известен под псевдонимом «Saurik») также написал серию статей на эту тему. В данной статье мы не будем детально рассматривать написание твиков для джейлбрейковых устройств, а рассмотрим этот вопрос поверхностно и касательно безопасности приложений, чтобы вы смогли по-быстрому написать патч в случае необходимости.

По умолчанию во время компиляции и сборки твик конвертируется в формат .dylib и хранится на устройстве в папке /Library/MobileSubstrate/DynamicLibraries. К каждому твику (файлу .dylib) прилагается plist-файл с тем же самым именем, в котором хранятся настройки твика. Например, одна из самых популярных секций в настройках – Filter. Здесь вы можете указать библиотеку или процесс, куда нужно инжектировать код патча. Более подробно о фильтрах и настройках можно почитать здесь.

Если вы уже пользуетесь джейлбрековым устройством и установили несколько патчей при помощи Cydia, используя логи, вы можете увидеть, как инжектируются твики во время выполнения различных приложений. Зайдите в Xcode -> Window -> Organizer -> Devices, выберите ваше устройство и кликните на Console (устройство должно быть подключено к вашему компьютеру). Как только вы запустите приложение на устройстве, то увидите процесс загрузки твиков.

Рисунок 1: Процедура загрузки твиков во время запуска приложения

В папке /Library/MobileSubstrate/DynamicLibraries находятся все твики, установленные на вашем устройстве (посмотреть содержимое этой папки можно, к примеру, при помощи iExplorer). Рекомендуется также проверить plist-файлы, относящиеся к твикам, и ознакомиться с ограничениями, налагаемыми на патч для библиотек и приложений.

Рисунок 2: Секция Filter для настройки твика Accelerate.dylib

Вне всяких сомнений, наиболее предпочтительный и удобный метод для создания твиков – пакет Theos. Чтобы установить Theos на устройстве, следуйте инструкциям, указанным здесь. С установкой не должно возникнуть особых проблем, однако обратите внимание, что в директории с твиками не должно быть папок с пробелами. В прошлом из-за подобных директорий у меня возникали проблемы.

Если у вас возникли вопросы, касающиеся Cydia Substrate, Cycript или Theos, вы всегда можете подключиться к IRC-каналу и задать свой вопрос. На сервере irc.saurik.com есть каналы #substrate и #cycript. На сервере irc.freenode.net есть каналы #theos и #jailbreakqa (на канале #jailbreakqa вы можете задать какой-то специфический вопрос относительно джейлбрейковых устройств).

Если скомпилированный твик работает некорректно (что может повлиять на работу устройства в целом), необходимо удалить соответствующие файлы из папки /Library/MobileSubstrate/DynamicLibraries. Например, если ваше устройство загружается с ошибками, вы можете при помощи iExplorer и удалить файлы твиков, нарушающих работу конкретных приложений.

Давайте напишем первый твик для приложения Damn Vulnerable iOS Application. Вначале будем работать с секцией Runtime Manipulation, где мы будем обходить проверку учетной записи во время нажатия на кнопку Login Method 1.

Рисунок 3: Внешний вид приложения Damn Vulnerable iOS Application

Запустите Theos. Появится перечень шаблонов. Выберите шаблон для создания твика (самый последний пункт). Имя у твика будет DVIABypass. Theos попросит вас указать идентификатор бандла (bundle identifier). Так как мы подключаемся только к DVIA, указываем бандл только этого приложения. Если вы не знаете идентификатор бандла, загляните в файл Info.plist, находящийся в папке с приложением. Вскоре вы увидите, что идентификатор бандла автоматически добавляется в plist-файл, соответствующий созданному твику.

Рисунок 4: Процедура создания твика

Как видно из рисунка выше, создана папка для проекта. Зайдем туда.

Рисунок 5: Содержимое папки с проектом

В папке находится несколько странных файлов. О plist-файле, который копируется на устройство вместе со скомпилированной динамической библиотекой, мы уже говорили ранее. В файле Tweak.xm находится вся логика работы твика. В файл Makefile вы будете добавлять все необходимые фреймворки и другие глобальные переменные.

Для того чтобы написать патч для конкретного метода приложения или библиотеки, мы должны знать информацию о заголовочных файлах классов, к которым хотим подключиться. Сведения о заголовочных файлах легко выгрузить при помощи утилиты class-dump-z. В нашем случае, так как мы имеем дело только с DVIA, нам нужно выгрузить методы классов для конкретного приложения. С другой стороны, если вы хотите подключиться к любому другому методу Springboard’а (приложение, отвечающее за главный экран iOS), вам потребуется выгрузить полную информацию о классах. Тут есть два пути: либо выгрузить полную информацию о классах самостоятельно при помощи class-dump-z, либо выгрузить информацию из репозитория. Например, здесь находится репозиторий со всеми заголовками от Springboard для iOS 7.

Изучив информацию о классах приложения DVIA, выбираем для подключения метод isLoginValidated, принадлежащий контроллеру представлений RuntimeManipulationDetailsVC.

Рисунок 6: Перечень методов контроллера представлений RuntimeManipulationDetailsVC

Переходим к Tweak.xm. Просто ознакомившись с этим файлом, вы уже много поймете о том, как написать собственный твик. Я не буду вдаваться в подробности и объяснять элементарные вещи.

Рисунок 7: Содержимое файла Tweak.xm

Замените содержимое Tweak.xm на код, показанный на рисунке ниже. Здесь все довольно очевидно. Происходит подключение к классу RuntimeManipulationDetailsVC и подмена метода isLoginValidated, который теперь всегда будет возвращать TRUE.

Рисунок 8: Новая логика работы метода isLoginValidated

Теперь нужно установить все необходимые переменные. Убедитесь в том, что компьютер и устройство находятся в одной сети. Когда вы в первый раз будете собирать и устанавливать пакет на устройстве, появится сообщение о вводе пароля для ssh.

Рисунок 9: Установка необходимых переменных

Теперь собираем и устанавливаем пакет при помощи команды make package install.

Рисунок 10: Сборка пакета

После установки патча каждый раз при нажатии на кнопку Login Method 1 авторизация будет проходить автоматически.

Вы также можете проверить, установился ли на устройстве собранный твик, если зайдете в папку /Library/MobileSubstrate/DynamicLibraries.

Рисунок 11: Содержимое папки с установленными твиками

Если после установки твика приложение работает некорректно, вы всегда можете удалить соответствующие файлы с расширением .dylib и .plist и перезагрузить устройство.

Главное, что следует отметить, - твик, во-первых, действует постоянно, а во-вторых, написать этот патч намного проще, чем ковыряться в дизассемблере. В этой статье мы рассмотрели лишь самые основы. Более подробно с темой разработки твиков можно ознакомиться здесь