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

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

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

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

Введение

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

Нахождение методов определенного класса

Давайте представим, что мы проводим динамический анализ приложения. При этом было бы неплохо узнать, какие методы вызывает определенный контроллер представления или определенный класс. Поскольку Cycript представляет собой смесь Objective-C и Javascript, мы можем написать функцию, содержащую комбинацию обоих синтаксисов. Мы можем определять функции в интерпретаторе, а затем вызывать их в любой момент, когда захотим получить определенную информацию о приложении. Существует хороший источник, где вы можете найти фрагменты кода по поиску информации внутри приложения (большинство из этих фрагментов кода мы будем использовать далее в этой статье).

Для начала подцепимся к запущенному процессу (как и в предыдущей статье, нашим подопытным приложением будет Yahoo Weather).

Рисунок 1: Подцепление к запущенному процессу приложения Yahoo Weather

Теперь определим метод, который выводит на экран список методов определенного класса. Фрагмент кода, решающий эту задачу, вы можете найти в вышеупомянутом источнике.

Рисунок 2: Объявление функции, которая выводит список методов определенного класса

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

Рисунок 3: Вывод на экран список методов класса YWAppDelegate

В вышеприведенном списке показаны все методы, объявленные внутри класса YWAppDelegate. Все что идет после @selector – имя метода. Обратите внимание, что в этом списке присутствуют закрытые методы (private methods). Также здесь включены геттеры и сеттеры для свойств, объявленных в этом классе.

Теперь выведем список методов контроллера представления YahooSlidingViewController.

Рисунок 4: Список методов контроллера представлений YahooSlidingViewController

Как мы выяснили в предыдущей статье, YahooSlidingViewController управляет меню-слайдером и является оболочкой для других контроллеров представлений. Для того чтобы выяснить, который отображает информацию о погоде в приложение, используем следующую команду.

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

Из рисунка выше видно, что YWMainViewController является контроллером представления, который выводит информацию о погоде. Таким образом, представление, показанное на рисунке ниже, фактически происходит из YWMainViewController.

Рисунок 6: Представление, которое рождает класс YWMainViewController

Выведем список методов контроллера представления YWMainViewController.

Рисунок 7: Список методов YWMainViewController

В этом списке присутствует метод userDidRequestUpdate.

Рисунок 8: Метод userDidRequestUpdate

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

Рисунок 9: Вызов метода userDidRequestUpdate

Если теперь вы взглянете на приложение, то увидите результат вызова метода, даже если мы не предпринимали никаких действий внутри приложения.

Рисунок 10: Результат после вызова метода userDidRequestUpdate

Как говорилось ранее в этой статье, в списке методов присутствую геттеры и сеттеры свойств класса.

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

Было бы неплохо, если бы мы могли вывести все переменные, которые используются в определенном контроллере представления. Объявим функцию, которая выводит на экран все экземпляры переменных (опять же обратитесь к вышеупомянутому источнику).

Рисунок 11: Объявление функции, которая выводит на экран экземпляры переменных

Теперь выведем экземпляры переменных контроллера представления YWMainViewController.

Рисунок 12: Экземпляры переменных контроллера представления YWMainViewController

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

Рисунок 13: Содержимое переменной locationViewControllers

Теперь скользнем вправо на другое место Нью-Йорка.

Рисунок 14: Изображение другого места Нью-Йорка

Распечатаем текущее значение переменной.

Рисунок 15: Текущее значение переменной locationViewControllers

Как видно из рисунка выше, этот массив всегда содержит три ненулевых элемента (три контроллера представлений), а в остальных элемента содержится значение null. Это сделано с целью более эффективного управления памятью. В каждый момент времени в массиве хранится текущий контроллер представления, который отвечает за вывод текущего изображения, а также контроллеры представлений, отвечающих за вывод изображения при скольжении влево или вправо. При скольжении появляется картинка нового контроллера представлений, а также создаются экземпляры новых контроллеров представлений (левого и правого). Таким образом, скольжение пользователя происходит без задержек. Это один из примеров написания кода, когда не требуется большого количества памяти.

Заключение

В этой и предыдущей статьях мы экспериментировали с приложением Yahoo weather. В следующей статье мы рассмотрим другие трюки с Cycript и обратим особое внимание на технику под названием method swizzling.

Ссылки

Ваша приватность умирает красиво, но мы можем спасти её.

Присоединяйтесь к нам!