Декомпіляція і налагодження android-додатків

У статті буде розказано про те, як підключити відладчик до Android-додатку і покроково пройти через викликані методи, використовуючи інформацію, отриману після декомпіляцію додатки.
Вимоги до тестової середовищі:
У статті буде використовуватися наступна конфігурація: Windows 8, Android Studio і IntelliJ IDEA. Пристрій: Nexus 4 з Android версії 4.4.4. Рекомендую все утиліти додати в змінну оточення PATH, щоб полегшити і прискорити доступ до цих інструментів.
Android application package (APK), який використовується в статті, можна завантажити звідси: com.netspi.egruber.test.apk.
Інструкція нижче допоможе вам підготувати пристрій для експериментів.
Активація розділу Developer Options
Для початку на Android-пристрої повинна бути дозволена налагодження через USB (опція USB debugging), що дозволить «спілкуватися» з девайсом за допомогою інструментів з набору Android SDK. Однак перед цим необхідно активувати розділ Developer options. На пристрої зайдіть в розділ Settings> About Phone і натисніть кілька разів на пункт Build Number, після чого має з'явитися повідомлення про те, що розділ Developer options активований.


Малюнок 1: Для того щоб активувати розділ Developer options, необхідно кілька разів клацнути на Build number
Дозвіл налагодження через USB
Щоб дозволити налагодження через USB-порт, зайдіть в розділ Settings> Developer options і відзначте прапорець навпроти USB debugging.

Малюнок 2: Включення опції USB debugging
Підключення пристрою і запуск ADB
Після підключення пристрою до комп'ютера через USB-порт, має з'явитися повідомлення «USB debugging connected on the device». Також слід перевірити, чи можна підключитися до пристрою за допомогою додатка Android Debug Bridge (ADB), що входить до складу Android SDK (пакет Android SDK Platform-tools). У командному рядку введіть таку команду:
Пристрій повинен з'явитися у списку.

Малюнок 3: Список підключених пристроїв
Якщо пристрій не відображається в списку, то найбільш вірогідна причина в некоректно встановлених драйверах (в Windows). Залежно від пристрою драйвер можна знайти або в Android SDK, або на сайті виробника.
Перевірка додатки на можливість налагодження
Перед налагодженням Android-додатків спочатку необхідно перевірити, чи є така можливість. Перевірку можна виконати декількома способами.
Перший спосіб - запустити Android Device Monitor. що входить до складу Android SDK (в папці tools). У Windows файл називається monitor.bat. При відкритті Android Device Monitor пристрій відобразиться в розділі Devices.

Малюнок 4: Додаток Android Device Monitor
Якщо який-небудь додаток на пристрої можна налагоджувати, це додаток також відобразиться в списку. Я створив тестову програму, але список порожній, оскільки програму налагоджувати не можна.
Другий спосіб перевірити додаток на можливість налагодження - дослідити файл AndroidManifest.xml з пакета додатка (APK, Android application package). APK є zip-архів, що містить всю інформацію, необхідну для запуску програми на Android-пристрої.
Всякий раз, коли додатки завантажується з Google Play Store, також завантажується і пакет програми. Всі завантажені APK-файли зазвичай зберігаються на пристрої в папці / data / app. Якщо у вас немає прав суперкористувача, ви не зможете отримати список файлів з директорії / data / app. Хоча, якщо ви знаєте ім'я APK-файлу, можете скопіювати його за допомогою утиліти adb. Щоб дізнатися ім'я APK-файлу, введіть наступну команду:
З'явиться командний рядок пристрою. Потім введіть наступну команду:
pm list packages -f
У списку подано пакетів на пристрої.

Малюнок 5: Перелік пакетів на пристрої
Дивлячись на список, знаходимо тестове додаток.

Малюнок 6: Пакет створеного тестового додатка (виділено білим)
Тепер необхідно скопіювати файл пакета. Відкриваємо шелл і вводимо наступну команду:
adb pull /data/app/[.apk file] [location]

Малюнок 7: Копіюємо APK-файл з пристрою в систему
Тепер потрібно відкрити файл пакета і досліджувати вміст AndroidManifest.xml. На жаль, ми не можемо просто так розпакувати архів, оскільки APK-файл закодований в бінарному форматі. Для розкодування найчастіше використовується утиліта apktool. хоча я використовую APK Studio. оскільки у цієї програми доброзичливий графічний інтерфейс. Далі в статті ми розповімо про APK Studio.
У APK Studio клікніть на маленьку зелену іконку, задайте ім'я проекту і вкажіть шлях до APK файлу. Потім вкажіть нехай для збереження проекту.

Малюнок 8: Створення нового проекту в APK Studio
Після відкриття APK виберіть файл AndroidManifest.xml і подивіться параметри тега application. Якщо прапор android: debuggable відсутня (або присутній, але встановлено значення false), значить, додаток налагоджувати не можна.

Малюнок 9: Вміст файлу AndroidManifest.xml
Модифікація файлу AndroidManifest.xml
За допомогою утиліти apktool або APK Studio ми можемо модифікувати файли і упаковувати вміст назад в пакет. Зараз ми змінимо файл AndroidManifest.xml так, щоб додаток можна було налагоджувати. Додаємо всередину тега application рядок android: debuggable = "true".

Малюнок 10: Змінюємо вміст тега application
Після додавання прапора натискаємо на іконку «молоток» і заново збираємо пакет. Пересобран пакет буде знаходитися в директорії build / apk.

Малюнок 11: Повторна збірка пакета завершилася успішно
Після пересборки пакет підписується і його можна заново встановити на пристрої (всі Android-додатки повинні бути підписані). Більшість додатків не перевіряє сертифікат, за допомогою якого відбувається підпис. В іншому випадку необхідно змінити код, який виконує цю перевірку.
Тепер потрібно встановити пересобран пакет. Спочатку видаляємо старе додаток за допомогою наступної команди:
adb pm uninstall [package name]
Потім встановлюємо новий пакет:
adb install [.apk file]
Також можна видалити і встановити пакет однією командою:
adb install -r [.apk file]

Малюнок 12: Встановлення пересобран пакета
Перевірте, щоб переустановленное додаток коректно запускалося на пристрої. Якщо все працює, переходимо назад в Android Device Monitor, де має з'явитися тестове додаток.

Малюнок 13: Тепер пересобран додаток можна налагоджувати
Налаштування середовища розробки (IDE)
Тепер до пересобран додатком можна підчепити відладчик, але спочатку потрібно створити проект в середовищі розробки (в статті використовується IntelliJ IDEA). Створюємо новий проект. В поле Application name вказуємо довільне ім'я. В поле Package name вказуємо ім'я, в точності збігається з ієрархією папок пересобран пакета.

Малюнок 14: Створення нового проекту в IntelliJ IDEA
Зазвичай ім'я APK-файлу збігається зі структурою папок, хоча, якщо ви не впевнені, в APK Studio перевірте ієрархію директорій до папки, де знаходяться файли додатків. У моєму випадку ім'я та структура папок повністю збігаються (com.netspi.egruber.test).

Малюнок 15: Ієрархія директорій тестового додатка
Зніміть прапорець «Create Hello World Activity» і завершите створення проекту (всі інші параметри залишаються за замовчуванням). Новий проект повинен виглядати приблизно так:

Малюнок 16: Ієрархія папок і файлів нового проекту
Після створення проекту потрібно додати вихідний код з APK-файлу для того, щоб відладчик «знав» імена символів, методів, змінних і т. Д. Хороша новина в тому, що Android-додатки можна декомпілювати практично без втрати якості (вихідний код буде збігатися з оригіналом). Після декомпіляцію вихідний текст імпортується в середу розробки (IDE).
Отримання вихідних текстів з пакета додатка
Для початку необхідно перетворити APK в jar-файл. Потім ми за допомогою java-декомпілятори отримаємо вихідний текст програми. Перетворення в jar будемо робити за допомогою утиліти dex2jar. У dex2jar є файл d2j-dex2jar.bat, який використовується для конвертації APK в jar. Синтаксис команди досить простий:
d2j-dex2jar.bat [.apk file]

Малюнок 17: Перетворення APK в jar
Потім відкриваємо або перетягуємо отриманий файл в JD-GUI (це java-декомпілятор).

Малюнок 18: Структура jar-файлу
Jar-файл повинен відобразитися у вигляді ієрархічної структури, всередині якої знаходяться java-файли з Новомосковскбельним вихідним кодом. Заходимо в File> Save All Sources, щоб упакувати все вихідні тексти в zip-архів.

Малюнок 19: Збереження вихідних текстів декомпілювати файлу
Після збереження вихідних текстів розпаковуємо архів в окрему директорію.

Малюнок 20: Розпакований архів
Тепер потрібно імпортувати обидві директорії в створений раніше проект в IDE. У IntelliJ заходимо в папку src і копіюємо туди вміст розпакованого архіву (дві директорії).

Малюнок 21: Обидві папки скопійовані в директорію src
Повертаючись в Intellij, бачимо оновлений проект.

Малюнок 22: У проекті з'явилися вихідні тексти
Якщо ми кликнемо на який-небудь елемент зі списку, то побачимо вихідний текст. Як видно на скріншоті нижче (вихідний текст класу LoginActivity), вихідний код обфусцірован за допомогою ProGuard.

Малюнок 23: Обфусцірованний вихідний текст класу LoginActivity
Тепер, коли в проекті з'явилися вихідні тексти, ми можемо почати встановлювати точки зупинки на методах і змінних. По досягненню точок зупину додаток буде зупинятися. Як приклад я встановив точку зупину на методі (прямо в обфусцірованном коді), що відповідає за обробку інформації, введеної в текстовому полі.

Малюнок 24: Поставлено крапку зупинки на обфусцірованний метод
Як тільки з'явилася точка зупинки, підключаємо відладчик до процесу на пристрої, клікнувши на іконку з екраном в правому верхньому куті (на вашій IDE іконка може відрізнятися).
Малюнок 25: Підключаємо відладчик до процесу
Далі вам буде запропоновано вибрати процес, до якого потрібно підключитися. Це показує лише процеси з прапором android: debuggable = "true".

Малюнок 26: Перелік процесів для підключення відладчика
Після вибору процесу відладчик під'єднатися до пристрою.

Малюнок 27: Отладчик підключений до процесу, запущеного на пристрої
У текстове поле я буду вводити число 42 (якщо пам'ятаєте, на відповідному методі стоїть крапка зупинки).

Малюнок 28: У текстове поле вводимо число 42

Малюнок 29: Спрацювала точка зупинки
На скріншоті нижче видно число, яке раніше ми ввели в текстовому полі.

Малюнок 30: Перелік змінних поточного екземпляра класу



