Безопасность IOS-приложений (часть 2) – получение информации о классах IOS-приложений

Безопасность IOS-приложений (часть 2) – получение информации о классах IOS-приложений

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

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

Введение

Вы когда-нибудь интересовались внутренним устройством IOS-приложения? Интересовало ли вас то, как получить какую-либо информацию об исходном коде, об использовании сторонних библиотек или алгоритм работы приложения? Интересовала ли вас возможность выгрузить все картинки и plist-файлы, используемые либо предустановленными приложениями, либо приложениями, загруженными из App Store? Если ответ на вышеперечисленные вопросы положительный, тогда вы оказались в правильном месте.

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

Выгрузка информации о классах из предустановленных на устройстве приложений

Сейчас мы находимся на той стадии, когда можно проанализировать приложение на предмет информации о классах. Возьмем, к примеру, приложение Maps. Первым делом необходимо выяснить местонахождение исполняемого файла. Все предустановленные приложения находятся в директории /Applications. Рассмотрим повнимательнее содержимое этой папки.


Рисунок 1: Содержимое директории /Applications

Внутри папки /Applications мы видим все предустановленные приложения. Теперь перейдем в директорию приложения Maps и выведем ее содержимое.

Рисунок 2: Содержимое директории приложения Maps

Внутри папки, показанной выше, вы можете видеть все изображения и plist-файлы, используемые приложением Maps. Далее мы рассмотрим способы получения всех изображений и других файлов конкретного IOS-приложения. Также среди всей этой кучи файлов находится и исполняемый файл (в левой стороне на рисунке ниже). Обратите внимание, что имя исполняемого файла такое же, как и имя приложения. Здесь же находятся файлы pdf, хотя я не совсем понимаю, зачем они нужны.

Рисунок 3: Исполняемый файл приложения Maps (зеленого цвета на левой стороне изображения)

Для выгрузки информации о классах приложения Maps просто введите команду class-dump-z Maps.

Рисунок 4: Процедура выгрузки информации о классах

Как видно из рисунка выше, объем выходных данных весьма большой, поэтому лучше сохранить их в отдельный файл (в нашем случае имя файла class-dump-Maps).

Рисунок 5: Процедура выгрузки информации о классах в отдельный файл

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

Рисунок 6: Процедура загрузки файла с устройства

Как только файл загружен на наш компьютер, мы можем открыть его в приложении TextMate (или любом другом текстовом редакторе на ваш выбор).

Рисунок 7: Файл с информацией о классах

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

Рисунок 8: Участок карты, отображаемый приложением Maps

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

Рисунок 9: Подробная информация о конкретном местонахождении на карте, отображаемая контроллером InfoCardViewController

Если вы повнимательнее посмотрите на это изображение и на объявление InfoCardViewController, то легко догадаетесь о том, какие методы вызываются при нажатии на конкретные кнопки. К примеру, если нажать на кнопку Direction to here, будет вызван следующий метод:

-(void)_directionsTo:(id)to person:(void*)person property:(int)property identifier:(int)identifier;

Если нажать на кнопку Add to Bookmarks, будет вызван такой метод:

-(void)_addToBookmarks:(id)bookmarks person:(void*)person property:(int)property identifier:(int)identifier;

Вы также можете найти много другой полезной информации. К примеру, класс с именем UserLocationSearchResults, который наследует признаки класса SearchResult.

Рисунок 10: Объявление класса UserLocationSearchResults

Короче говоря, объем информации, который вы можете получить, ограничивается лишь вашей фантазией и любознательностью :).

Выгрузка информации о классах из приложений, загружаемых из App Store

Необходимо знать о двух вещах, если вы хотите анализировать приложения, загружаемые из App Store:

  1. Эти приложения хранятся в другом месте (/var/mobile/Applications/)
  2. В отличие от предустановленных на устройстве приложений, эти приложения зашифрованы и перед анализом их необходимо расшифровать

Для расшифровки приложений мы будем использовать утилиту Clutch, которая работает из командной строки. Пожалуйста, имейте в виду, что Clutch была разработана командой Hackulous, которая ушла в небытие несколько месяцев назад. Хотя исполняемые файлы Clutch все еще можно найти в интернете.

Теперь вам нужно загрузить бинарный файл на устройство. Для этого мы будем использовать sftp и команду put.

Рисунок 11: Процедура загрузки исполняемого файла Clutch на мобильное устройство

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

Рисунок 12: Список приложений, которые могут быть дешифрованы

Для дешифровки конкретного приложения наберите в командной строке clutch app-name, где app-name – имя приложения из списка. К примеру, если мы хотим крякнуть приложение для Facebook, то наберем команду clutch Facebook.

Рисунок 13: Процедура дешифровки приложения Facebook

По завершению дешифровки, на экране появится местонахождение сохраненного ipa-файла. Ipa-файл представляет собой сжатую версию всего пакета приложения. Чтобы разархивировать файл используйте команду unzip и сохраните его в какую-нибудь директорию, используя параметр –d, как показано ниже. Вы также можете загрузить ipa-файл на ваш компьютер (при помощи sftp) и разархивировать его там. После распаковки вам будут доступны все изображения и все остальные файлы, которые идут в комплекте с приложением, которые будут находиться в директории, куда вы разархивировали файл.

Рисунок 14: Процедура распаковки архива

Теперь настал черед выгрузки информации о классах из распакованного файла при помощи class-dump-z. В этот раз мы назовем файл именем class-info-Facebook.

Рисунок 15: Выгрузка информации о классах приложения Facebook в файл class-info-Facebook

По завершению выгрузки, вы можете завершить ssh-сессию, и при помощи sftp загрузить файл class-info-Facebook на ваш компьютер.

Рисунок 16: Процедура загрузки файла с информацией о классах

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

Рисунок 17: Объявление протокола FBFacebookRequestSender

Получение картинок и других файлов из конкретного приложения

Как говорилось ранее в этой статье, один из методов для загрузки/выгрузки файлов с устройства, - использовать утилиту sftp. Однако есть намного более простые методы. Один из них – использовать приложение iExplorer. Это приложения можно загрузить с официального веб-сайта. После загрузки откройте приложение и удостоверьтесь в том, что устройство подключено к вашему компьютеру через USB.

Рисунок 18: Приложение iExplorer

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

Рисунок 19: Содержимое вкладки Files

Для просмотра файлов конкретного приложения, кликните на Apps.

Рисунок 20: Файлы приложения для Facebook

Как вы можете видеть, очень просто просматривать и загружать файлы. Мы будем загружать все картинки и другие файлы, принадлежащие приложению Facebook. Для этого на левой стороне экрана найдите Facebook и кликните на него. Перед вами отобразятся все файла из директории этого приложения.

Рисунок 21: Выгрузка файлов приложения для Facebook

Для загрузки файлов нажмите Cmd + A, щелкните правой кнопкой мыши и выберите Export to Folder. Затем выберите папку, в которую вы хотите загрузить все файлы.

Заключение

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

Теперь, когда мы научились получать информацию о классах и методах, возникает следующий вопрос. А возможно ли вносить изменения во время работы приложения? К примеру, если метод -(BOOL)isFacebookSessionValid в определенных случаях возвращает false, возможно ли сделать так, чтобы он возвращал true, и тем самым изменить логику работы приложения? Еще один вопрос: возможно ли создать свой собственный метод, который будет вызываться всякий раз, вместо какого-то другого? Возможно ли изменять имена переменных во время выполнения приложения или после определенной инструкции? На все эти вопросы ответ «Да», и как это сделать мы узнаем в следующей статье.  

Если вам нравится играть в опасную игру, присоединитесь к нам - мы научим вас правилам!

Подписаться