В этой статье мы рассмотрим использование Introspy внутри скриптов в качестве python-модуля.
Автор: Пратик Джианчандани (Prateek Gianchandani)
В этой статье мы рассмотрим использование Introspy внутри скриптов в качестве python-модуля.
Первым делом необходимо импортировать модуль introspy, а также Namespace из модуля argparse.
Рисунок 1: Импорт модуля introspy, а также Namespace из модуля argparse
Затем создадим экземпляр класса Introspy. В качестве аргументов необходимо указать имя базы данных, имя группы, подгруппы и списка. Мы будем указывать только имя базы данных, а в остальных аргумента будем передавать значение None (в этом случае в экземпляре будет содержимое всех групп и подгрупп).
Рисунок 2: Создание экземпляра класса Introspy
Теперь создадим экземпляр с указанием конкретной группы и подгруппы. Названия групп и подгрупп я смог найти только в HTML-отчетах, которые мы создавали в предыдущих статьях. Если вы посмотрите на рисунок ниже, то увидите, что элементы меню могут быть использованы в качестве имен групп, а подменю – в качестве имен подгрупп.
Рисунок 3: Элементы меня и подменю созданного отчета
Именами групп могут быть DataStorage, Crypto, Network, IPC и т. д., а именем подгруппы для группы Network – HTTP. Создадим объект с именем группы Network и именем подгруппы HTTP.
Рисунок 4: Создание экземпляра Introspy с указанием группы и подгруппы
Отобразим все методы и атрибуты, которые доступны в объекте introspy.
Рисунок 5: Перечень методов и атрибутов объекта introspy
Как видно из рисунка выше, у объекта Introspy есть атрибут analyzer. Рассмотрим все методы и атрибуты у этого атрибута.
Рисунок 6: Перечень методов и атрибутов у атрибута analyzer
Содержимое findings (элементы отчета по конкретной группе и подгруппе) можно увидеть либо используя атрибут findings, либо метод get_findings (см. рисунок ниже).
Рисунок 7: Перечень элементов отчета по конкретной группе и подгруппе
Все сигнатуры анализатора можно увидеть внутри атрибута signatures.
Рисунок 8: Перечень всех сигнатур анализатора
На рисунке выше приведен перечень экземпляров объекта signature. Попробуем получить информацию из экземпляров сигнатур. В предыдущей статье мы, изучая файл signatures.py, выяснили, что каждый экземпляр сигнатуры содержит заголовок, описание, фильтр и т. д.
Рисунок 9: Перечень атрибутов объекта сигнатуры
Давайте пробежимся по каждому экземпляру и выведем заголовок и описание этого экземпляра.
Рисунок 10: Цикл по списку и отображение заголовка и описания экземпляров сигнатур
Далее я вывел список всех комбинаций методов и классов, содержащихся в фильтрах каждой сигнатуры. Обратите внимание, что в этом списке может не быть точной реализации метода, используемой фильтром, поскольку метод может принадлежать как классу, так экземпляру класса. К примеру, как видно из рисунка ниже, не существует метода [NSUserDefaults stringForKey:], но существует метод экземпляра [[NSUserDefaults standardUserDefaults] stringForKey:].
Рисунок 11: Перечень комбинаций классов и методов
У каждого объекта анализатора есть атрибут с именем tracedCalls, содержащего перечень всех вызовов, которые были обнаружены во время выполнения приложения. Если мы посмотрим на код класса tracedCalls, мы увидим у него атрибуты callId, method, clazz и т. д.
Рисунок 12: Перечень атрибутов класса tracedCalls
Мы можем просматривать информацию любого экземпляра класса tracedCall. На рисунке ниже приведено содержимое атрибутов первого вызова.
Рисунок 13: Содержимое атрибутов первого вызова
Заключение
В этой статье мы научились использовать модуль introspy внутри наших собственных скриптов, получать различную информацию о сигнатурах, вызовах и т. д. из сгенерированного файла базы данных и отображать эту информацию в том виде, в котором захотим. Это полезно при подготовке нестандартных отчетов во время анализа конкретного IOS-приложения. Эту информацию также можно передавать в другие python-скрипты для выполнения других специфических задач.
Ссылки