29.10.2013

Безопасность IOS-приложений (часть 4) – динамический анализ приложения Yahoo Weather при помощи Cycript

image

В предыдущей статье мы узнали о среде выполнения, предоставляемой фреймворком Cocoa, которую используют IOS-приложения, написанные на Objective-C. В этой статье мы рассмотрим утилиту Cycript, которая должна быть арсенале каждого исследователя.

Автор: Пратик Джианчандани (Prateek Gianchandani)

Введение

В предыдущей статье мы узнали о среде выполнения, предоставляемой фреймворком Cocoa, которую используют IOS-приложения, написанные на Objective-C. В этой статье мы рассмотрим утилиту Cycript, которая должна быть арсенале каждого исследователя. При помощи Cycript мы будем анализировать и изменять логику работы приложения во время его выполнения. В этой статье мы будем проводить анализ приложения Yahoo Weather.

Cycript

Cycript представляет собой интерпретатор javascript, который также понимает и синтаксис Objective-C. Это означает, что мы можем использовать либо javascript, либо Objective-C (или их комбинацию) при создании определенной команды. Также при помощи Cycript можно цепляться к запущенному процессу и модифицировать множество вещей во время выполнения приложения. Поскольку применение Cycript напрямую связано с IOS-приложениями, существует несколько преимуществ при использовании этой утилиты:

  1. Мы можем цепляться к запущенному процессу и находить имена всех используемых классов, т.е. контроллеров представлений (view controllers) и используемых внутренних и сторонних библиотек и даже имя уполномоченного приложения (application delegate).
  2. Для каждого конкретного класса (контроллера представления, уполномоченного приложения или любого другого класса) мы также можем найти имена всех используемых методов.
  3. Мы можем найти имена всех экземпляров переменных и их значения в любой момент времени во время выполнения приложения.
  4. Мы можем менять значения у переменных во время выполнения приложения.
  5. Мы можем выполнить Method Swizzling, т.е. изменить логику работы конкретного метода.
  6. Мы можем вызвать любой метод во время выполнения приложения (даже если не предполагается использование этого метода во время выполнения).

Установка Cycript

Для установки Cycript на устройство необходимо скачать последнюю версию с официального сайта.

Рисунок 1: Последние версии файлов для Сycript

После этого закачайте загруженные файлы на ваше устройство при помощи sftp.

Рисунок 2: Загрузка Cycript на устройство при помощи sftp

Затем используйте команду dpkg для установки Сycript на устройстве.

Рисунок 3: Установка Cycript на устройстве при помощи команды dpkg

Теперь проверьте работоспособность Cycript, введя в командной строке cycript.

Рисунок 4: Проверка работоспособности Cycript

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

Как только приложение установлено, запустите его и убедитесь, что оно работает на переднем плане (foreground). Это необходимо потому, что как только приложение оказывается в фоновом режиме, оно находится на паузе, и вы ничего не сможете с ним сделать. Как только приложение запущено, вам необходимо узнать идентификатор процесса (PID), после чего можно подцепиться к запущенному процессу при помощи команды cycript –p.

Рисунок 5: Выяснение идентификатора процесса и подцепление к запущенному процессу

Если подцепление к запущенному процессу прошло успешно, вы увидите командную строку интерпретатора Cycript. Теперь все готово к работе, и вы можете получить экземпляр приложения при помощи синтаксиса Objective-C [UIApplication sharedApplication].

Рисунок 6: Получаем экземпляр приложения

Вы также можете объявлять переменные в интерпретаторе Cycript (см. рисунок ниже). Я объявил переменную «a», в которой хранится экземпляр приложения ([UIApplication sharedApplication]). Обратите внимание, что левая часть этой команды соответствует синтаксису Javascript, а правая – синтаксису Objective-C. В этом вся прелесть Cycript.

Рисунок 7: Объявление новой переменной

По умолчанию в Cycript есть переменная с коротким именем, которая позволяет ссылаться на экземпляр приложения.

Рисунок 8: Служебная переменная, в которой хранится экземпляр приложения

Для нахождения делегированного класса (delegate class) этого приложения мы можем использовать команду [UIApplication sharedApplication].delegate. Однако поскольку мы уже объявили новую переменную «a», как экземпляр приложения, мы можем использовать более короткую команду, как показано на рисунке ниже.

Рисунок 9: Получение информации о делегируемом классе приложения

Теперь мы знаем, что имя делегируемого класса YWAppDelegate, следовательно, к нему относятся файлы YWAppDelegate.h и YWAppDelegate.m. Попробуем вызвать некоторые методы во время работы приложения. Само приложение выглядит так:

Рисунок 10: Внешний вид приложения Yahoo Weather

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

Рисунок 11: Вызов метода для открытия панели статуса

Теперь приложение выглядит так.

Рисунок 12: Приложение с активированной панелью статуса

Как видно из рисунка выше, появилась панель статуса. Теперь попробуем изменить число (badge count), которое показывается в правом верхнем углу иконки приложения. Обычно это число показывает количество новых уведомлений. В случае с почтовыми приложениями, оно указывает на количество непрочитанных писем. Приложение Yahoo Weather не показывает новые уведомления и поэтому на иконке в правом верхнем углу не показывается никаких чисел. Это число можно изменить локально внутри приложения через вызов простой функции, а также удаленно через push-уведомления со стороны сервера. Сейчас мы попробуем изменить число уведомлений для приложения Yahoo Weather. На рисунке ниже показан метод, который необходимо вызывать (я выставил число 999).

Рисунок 13: Вызываем метод для изменения числа новых уведомлений для приложения Yahoo Weather

Теперь смотрим на иконку приложения.

Рисунок 14: Иконка с обновленным числом новых уведомлений

Как видно из рисунка выше, наш трюк сработал. Замечательно!

Продолжим наши исследования и попытаемся найти новую информацию относительно приложения Yahoo Weather. Для того чтобы выяснить текущий контроллер представления, мы должны выяснить содержимое свойства keyWindow. keyWindow представляет собой окно, с которым в данный момент взаимодействует пользователь. Если вы хотите узнать информацию обо всех окнах в приложении, на рисунке ниже показано, как это сделать. Обратите внимание, что окно представляет собой тип класса UIWindow.

Рисунок 15: Информация обо всех окнах приложения

Теперь выясним содержимое свойства keyWindow.

Рисунок 16: Содержимое свойства keyWindow

Теперь, чтобы выяснить корневой контроллер представлений для этого окна, мы будем использовать свойство rootViewController. Это свойство отвечает за содержание, отображаемое в окне.

Рисунок 17: Содержимое свойства rootViewController

Как видно из рисунка выше, имя класса свойства rootViewController – YahooSlidingViewController. Из имени класса предельно ясно, что сам класс представляет собой слайдер, используемый приложением, как показано на рисунке ниже.

Рисунок 18: Внешний вид слайдера

Следовательно, этот класс в основном выступает в роли внешней оболочки для всех остальных контроллеров представлений. Это означает, что всякий раз, когда выбирается пункт меню (как показано на рисунке выше), YahooSlidingViewController отображает соответствующий контроллер представлений.

Заключение

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

Ссылки

или введите имя

CAPTCHA