14.08.2015

Безопасность IOS-приложений (часть 41) – Отладка приложений при помощи LLDB

image

В этой статье мы коснемся отладки приложений в Xcode при помощи LLDB. Также мы рассмотрим, почему этот отладчик лучше подходит для аудита, и, конечно же, научимся самому процессу отладки.

Автор: Prateek Gianchandani

В этой статье мы коснемся отладки приложений в Xcode при помощи LLDB. Также мы рассмотрим, почему этот отладчик лучше подходит для аудита, и, конечно же, научимся самому процессу отладки.

Следующая выдержка взята из официальной документации от компании Apple:

Отладчик LLDB является альтернативой GDB. LLDB разрабатывался совместно с LLVM-компиляторами (Low Level Virtual Machine) и обладает широкими возможностями управления потоком выполнения приложения и анализа данных. Начиная с Xcode 5, все новые и уже существующие проекты автоматически настраиваются на использование LLDB. В стандартной конфигурации LLDB уже есть расширенный набор команд, совместимый с аналогичными командами в GDB. Помимо использования стандартной конфигурации вы всегда можете настроить LLDB под свои нужды.

Начать изучение LLDB уместно с просмотра видео с конференции WWDC 2014.

Остается лишь вопрос, почему LLDB лучше, чем GDB?

Вот несколько причин:

  1. LLDB стабильно работает в iOS8.
  2. LLDB намного быстрее, умеет работать с многопоточными приложениями и поддерживает использование скриптов.
  3. LLDB понимает dot-синтаксис. Во время отладки вы можете использовать конструкции наподобие po self.propertyName или даже po instanceVariable для нахождения любых свойств или экземпляров переменных.
  4. LLDB поддерживает плагины.

Для отладки приложений на iOS-устройстве мы будем использовать утилиту debugserver, входящую в состав Xcode. Обычно debugserver устанавливается на устройстве автоматически, когда устройству назначается статус «development». Отлаживаться будут только приложения, подписанные специальным профилем (provisioning profile) из-за ограничения прав на функцию task_for_pid(). Таким образом, чтобы отлаживать любое приложение, мы должны создать новый файл с правами доступа (entitlement file), где разрешена функция task_for_pid(), подписать debugserver и установить сервер отладки на устройстве. Обратите внимание, что debugserver в Mac OS находится внутри ram-диска с атрибутом «только чтение». То есть debugserver должен быть скопирован куда-то в другое место перед подписью новым файлом.

Итак, для начала монтируем образ диска на Мак и копируем debugserver в другое место. Используем следующую команду:

hdiutil attach /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/[ios version]\ \(12B411\)/DeveloperDiskImage.dmg

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat1.png

Рисунок 1: Подключаем образ диска

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat2.png

Рисунок 2: Содержимое диска

Затем создаем новый файл entitlements.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/ PropertyList-1.0.dtd">

<key>com.apple.springboard.debugapplications
<true/>
<key>run-unsigned-code
<true/>
<key>get-task-allow
<true/>
<key>task_for_pid-allow
<true/>

Далее подписываем debugserver при помощи ранее созданного файла.

codesign -s – –entitlements entitlements.plist -f debugserver

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat3.png

Рисунок 3: Подписывание debugserver

Затем устанавливаем заново подписанный файл на устройстве. Чтобы запустить debugserver, используйте команду ниже. Кроме того, не забудьте указать приложение, к которому вы хотите подцепить отладчик.

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat4.png

Рисунок 4: Подключение отладчика к приложению Twitter

Теперь на компьютере запускаем LLDB и заходим в интерпретатор. Для подключения к устройству используйте команды ниже. Не забудьте поменять IP-адрес на IP-адрес вашего устройства.

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat5.png

Рисунок 5: Подключение к устройству

Теперь вы можете отлаживать приложение.

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat6.png

Рисунок 6: Попытка подключения к процессу

Затем вы можете использовать команду po для вывода экземпляров объектов.

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat7.png

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat8.png

Рисунок 7: Экземпляры некоторых объектов

Синтаксис LLDB немного отличается от GDB. Например, чтобы вывести содержимое всех регистров, используйте следующую команду:

http://2we26u4fam7n16rz3a44uhbe1bq2.wpengine.netdna-cdn.com/wp-content/uploads/041515_0034_iOSApplicat9.png

Рисунок 8: Команда для вывода содержимого всех регистров

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