Публікуємо програми в Google Play і заробляємо мільйони. Як використовувати функцію підписання програм у Google Play Як підписати apk оригінальним підписом

Отже, ви працювали багато днів (а може й ночей), і ось ваш перший гібридний мобільний додаток готовий. Воно досить стабільне, більшість критичних багів закрито. Залишилися дрібні, але пам'ятаючи, що перфекціонізм - зло, ви приймаєте вольове рішення викласти додаток.

Необхідна умова для цього – наявність підписаного файлу APK. Як підписати apk файл, ви дізнаєтесь із цієї статті.

Невеликий відступ

Коли мій pet project впритул наблизився до релізу, я почав шукати інформацію про те, як швидко і без болю опублікувати програму. Безліч знайдених інструкцій виглядали простими. Я вибрав інструкцію авторів фреймворку Ioniс, на якому і розроблено програму. Не все вийшло з першого разу, є кілька особливостей. Процес підписування описаний у цій статті, важливі моменти особливо виокремлені.

Вихідні дані

Я припускаю, що у вас налаштовано все необхідне для розробки гібридних мобільних додатківза допомогою Apache Cordova. Повинно бути встановлено:
  • Apache Cordova
  • Java Development Kit
  • Android SDK Tools
Як ім'я проекту та програми використовується lcf. Замініть на ім'я свого проекту там, де це потрібно.

Поїхали

Для початку потрібно створити релізний білд вашої програми. Але перед цим переконаємося, що всі зайві плагіни видалені. Наприклад, нам не потрібен плагін, який виводить налагоджувальну інформацію в консоль. Вилучимо його:

$ cordova plugin rm cordova-plugin-console
Для генерації релізного складання під Андроїд використовуємо команду buildз прапором --release:

$ cordova build --release android
Ця команда створить непідписаний APK файл у каталозі:

Platforms/android/build/outputs/apk
Наприклад, platforms/android/build/outputs/apk/ android-release-unsigned.apk. Потім нам знадобиться підписати цей файл та запустити утиліту zipalignдля оптимізації та підготовки файлу для Google Play.

Для підписування файлу потрібний сертифікат. Створимо його за допомогою утиліти keytool, яка включена до JDK:

$ keytool -genkey -v -keystore lcf.keystore -alias lcf -keyalg RSA -keysize 2048 -validity 10000
Важливо

Значення параметра -alias потрібно запам'ятати, а краще записати. У прикладі вище він дорівнює lcf (за першими буквами назви програми Loyal Client Free). Деталі тут наводити не буду, якщо буде цікаво, напишіть у коментарі, я розповім докладніше.

Аліас використовується щоразу при підписуванні * програми. Щоб було простіше запам'ятати, як аліас використовуйте ім'я keystore файлу, наприклад:


-keystore hello-world.keystore -alias hello-world -keystore weather-app.keystore -alias weather-app -keystore todo.keystore -alias todo
* Підписувати програму потрібно при кожному випуску оновлень

Утиліта keytoolставить ряд питань. Усього їх буде 8. Щоб заздалегідь мати уявлення про питання та зразкові відповіді, всі вони наведені далі, під спойлером.

Питання keytool та зразкові відповіді на них

1. Enter keystore password:
Тут необхідно ввести пароль для файлу (щонайменше 6 символів). Введений пароль потрібно записати в надійному місці, він потрібен щоразу під час підписання програми.

2. Re-enter new password:
Повторне введення пароля.

3. What is your first and last name?
: Іван Петров
Ваше ім'я та прізвище. Значення в квадратних дужках- Це значення за замовчуванням.

4. What is the name of your organizational unit?
: IT
Назва підрозділу Вашої компанії. Можна залишити пустим, я вказую IT.

5. What is the name of your organization?
: 2developers
Назва вашої організації. Вкажіть, якщо є.

6. What is the name of your city or locality?
: Москва
Назва міста

7. What is the name of your State or Province?
: MO
Назва області

8. What is the 2-letter country code for this unit?
: RU
Код країни. Я вказую RU.

: y

Підтверджуйте, якщо все правильно або натисніть Enter, щоб ввести ще раз.


Наприкінці з'явиться повідомлення про успішну генерацію ключа. Буде запропоновано задати пароль для приватного ключа (якщо хочете залишити такий самий, як і для сертифіката - натисніть Enter):

Generation 2 048 bit RSA key pair and self-signed certificate (SHA256withRSA) з validity of 10 000 days for: CN=Ivan Petrov, OU=IT, O=2developers, L=Moscow, ST=MO, C=RU Enter key password for (RETURN if same as keystore password):
У поточному каталозі буде створено файл lcf.keystore.

Важливо

Створений файл потрібно зберегти у надійному місці. Якщо ви використовуєте закритий репозиторій, файл можна закомітити разом з вихідними кодами програми. Загалом, сертифікати краще зберігати окремо. У разі втрати сертифіката ви не зможете випускати оновлення програми.

Залишилося два кроки, і ви отримаєте готовий до розповсюдження файлу APK. Переходимо безпосередньо до підписування.

Щоб підписати apk файл, використовуйте утиліту jarsigner, яка також включена до JDK.

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore lcf.keystore android-release-unsigned.apk lcf
Ім'я сертифіката вказується після налаштування -keystore, Аліас - після імені файлу.

Нарешті, для оптимізації apk файлу, скористаємося утилітою zipalign:

$zipalign -v 4 android-release-unsigned.apk LoyalClientFree.apk
Останній параметр - це ім'я файлу, який ви завантажуватимете в Google Play.

Важливо.

Утиліта zipalignце частина Android SDK Tools і може бути знайдена тут:

/path/to/Android/sdk/build-tools/VERSION/zipalign

Висновок

Тепер у вас є готовий для розповсюдження apk файл, який можна завантажити в Google Play. Заповнюйте опис, визначайте рейтинг своєї програми та сміливо натисніть “Опублікувати”.

Завдяки функції підписання програм у Google Play Google може керувати ключем підпису вашої програми, а також захищати цей ключ і використовувати його для підпису ваших APK-файлів, призначених для розповсюдження. Цей спосіб зберігання убезпечить вас на випадок втрати або злому ключа.

Важливо!Щоб зареєструвати набори Android App Bundle (рекомендований формат публікації програм), потрібно зареєструватися в програмі підписання програм у Google Play перед завантаженням набору App Bundle у Play Console.

Реєструватися можуть власники облікових записів та користувачі з глобальними дозволами на керування робочими версіями, які прийняли Умови використання . За раз у програмі підписання програм у Google Play можна зареєструвати лише одну програму.

Принципи роботи

Коли ви використовуєте функцію підписання програм у Google Play, для зберігання ключів використовується та ж інфраструктура, що і для зберігання ключів Google, а їх захист забезпечує спеціальна служба керування ключами. Детальну інформаціюпро технічну інфраструктуру Google можна знайти в документації безпеки в Google Cloud .

Програми для Android підписуються закритим ключем. З кожним ключем пов'язаний відкритий сертифікат, за допомогою якого пристрої та сервіси можуть переконатися в безпеці програм та їх оновлень. На пристрої встановлюються лише оновлення, підпис яких відповідає підпису встановленого додатку. Якщо ви дозволите Google керувати ключем підпису програми, цей процес стане безпечнішим.

Примітка.Використовувати функцію підписання програм у Google Play не обов'язково. Ви можете завантажувати APK-файли та керувати власними ключами, не використовуючи набори App Bundle. Однак якщо ви втратите доступ до сховища ключів або воно буде зламано, то ви не зможете оновити свою програму і вам доведеться опублікувати її знову з іншою назвою пакета.

Опис ключів, об'єктів та інструментів
Умови Опис
Ключ підпису програми

Ключ, який використовується в Google Play для підпису APK-файлів, що доставляються на пристрій користувача. При реєстрації в програмі підписання додатків у Google Play ви можете завантажити існуючий ключ підпису або дозволити Google згенерувати новий.

Ключ завантаження

Згенерувати ключ завантаження можна двома способами:

  • Використовуйте ключ підпису програми.Якщо при реєстрації в програмі ви дозволили Google згенерувати ключ підпису програми, ключем завантаження стане ключ, використаний вами для підпису першого випуску програми.
  • Використовуйте окремий ключ завантаження.Якщо під час реєстрації в програмі ви передали власний ключ підпису програми, для безпеки ви можете створити новий ключ завантаження. Якщо ви не хочете цього робити, використовуйте ключ підпису програми як ключ завантаження для підписання нових випусків.
Сертифікат (. Der або. Pem)

Сертифікат, який містить відкритий ключ та додаткову інформаціюпро його власника. Сертифікат відкритого ключа дозволяє будь-кому дізнатися, хто підписав набір App Bundle або APK-файл. Цим сертифікатом можна ділитися, тому що він не включає закритий ключ.

Щоб зареєструвати ключі у постачальників API, ви можете завантажити відкритий сертифікат для ключа підпису програми на сторінці Підписання додатківу Play Console. Сертифікат відкритого ключа можна ділитися з усіма, оскільки він не включає закритий ключ.

Цифровий відбиток сертифіката

Короткий та унікальний ідентифікатор сертифіката. Відбиток разом із назвою пакета часто запитують постачальники API для надання доступу до послуг.

Цифрові відбитки MD5, SHA-1 та SHA-256 сертифікатів завантаження та підпису програми можна знайти на сторінці Підписання додатківу Play Console. Також можна отримати цифровий відбиток іншого типу. Для цього завантажте оригінальний сертифікат у форматі DER на тій самій сторінці.

Сховище ключів Java (.jks або.keystore) Сховище сертифікатів безпеки та закритих ключів.
Інструмент PEPK

Інструмент експорту закритих ключів зі сховища Java та їх шифрування для передачі в Google Play.

Коли ви надасте Google ключ підпису програми, виберіть експорт і завантаження власного ключа (і при необхідності – його відкритого сертифіката), а потім, дотримуючись інструкцій, завантажте інструмент та скористайтеся ним. Ви також можете завантажити, переглянути та використовувати відкритий вихідний код інструменту PEPK.

Процес підписання додатків

Ви можете завантажити APK-файли, підписані оригінальним ключем підпису програми, до або після підписання програми Google Play.

Якщо ви переходите на набори Android App Bundle, їх можна перевірити у версіях для тестування, а в робочих використовувати існуючі файли APK. Ось як це працює:

  1. Ви підписуєте набір App Bundle або APK-файл і завантажуєте його у Play Console.
  2. Процес підписання програм залежить від того, що ви завантажуєте.
    • Набір App Bundle. Google оптимізує APK-файли з набору App Bundle, а потім підписує їх за допомогою ключа підпису програми.
    • APK-файл підписаний ключем завантаження. Google перевіряє ваш підпис, видаляє його і повторно підписує APK-файли ключем підпису програми.
    • APK-файл, підписаний ключем підпису програми. Google перевіряє підпис.
  3. Google доставляє підписані APK-файли користувачам.

Як зареєструватися в програмі підписання додатків у Google Play

Нові програми

Крок 1. Створіть ключ завантаження

  1. Створіть ключ завантаження, дотримуючись інструкцій .
  2. Підпишіть новий файл APK ключем завантаження.

Крок 2. Підготуйте випуск

  1. , дотримуючись інструкцій.
  2. Вибравши тип версії, налаштуйте параметри підписання програм у розділі "Дозволіть Google захищати ключ підпису програми та керувати ним".
  3. Якщо ви натиснете Продовжитизгенерований ключ стане ключем завантаження, який буде використовуватися для підписання майбутніх випусків. Також ви можете вибрати такі розширені налаштування:
    • Використовувати один ключ для різних програм в обліковому записі розробника (варіант 2).
    • Завантажити ключ підпису існуючої програми (варіант 2, 3 та 4), вибравши найбільш підходящий спосіб експорту та завантаження. Завантаживши ключ підпису програми та його відкритий сертифікат, ви можете або використовувати як його ключ підпису програми.

Примітка.Щоб продовжити, потрібно прийняти Умови використання та зареєструватися в програмі підписання програм.

Крок 3. Зареєструйте ключ підпису програми у постачальників API

Якщо у вашій програмі використовується API, то щоб пройти автентифікацію, вам, швидше за все, знадобиться зареєструвати сертифікат ключа, за допомогою якого Google підписує вашу програму. Щоб знайти сертифікат:

  1. Увійдіть у Play Console.
  2. Виберіть програму.
  3. У меню зліва виберіть Управління релізом > Підписи додатків.
    • Якщо постачальник API потребує іншого типу цифрового відбитка, ви можете завантажити оригінальний сертифікат у форматі DER і перетворити його за допомогою відповідних інструментів.
Опубліковані програми

Крок 1. Зареєструйтесь у програмі підписання програм у Google Play

  1. Увійдіть у Play Console.
  2. Виберіть програму.
  3. У меню зліва виберіть Управління релізом > Підписи додатків.
  4. При необхідності прочитайте Умови використання та натисніть Прийняти.

Крок 2. Надішліть оригінальний ключ до Google і створіть ключ завантаження

  1. Знайдіть оригінальний ключ підпису програми.
  2. Увійдіть у Play Console.
  3. Виберіть програму.
  4. У меню зліва виберіть Управління релізом > Підписи додатків.
  5. Завантажте існуючий ключ підпису програми найбільш підходящим для процесу випуску способом.
  1. та завантажте сертифікат у Google Play.
    • Як ключ завантаження можна також використовувати ключ підпису програми.
  2. Скопіюйте цифрові відбитки (MD5, SHA-1 та SHA-256) сертифіката підписання програм.
    • Для проведення тестування вам може знадобитися зареєструвати у постачальника API сертифікат ключа завантаження за допомогою цифрового відбитка сертифіката та ключа підпису програми.

Крок 4. Підпишіть наступне оновлення своєї програми ключем завантаження

Оновлення програми, що випускаються, потрібно підписувати ключем завантаження.

Як створити ключ завантаження та оновити сховища ключів

Ви можете створити ключ завантаження під час реєстрації в програмі підписання додатків у Google Play або згенерувати його пізніше в розділі Управління релізом > Підписи додатків.

Щоб створити ключ завантаження, виконайте такі дії:

  1. Виконуйте інструкції на сайті для Android-розробників. Зберігайте ключ у безпечному місці.
  2. Експортуйте сертифікат для ключа завантаження у форматі PEM. Замініть такі аргументи зі знаком підкреслення:
    • $keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem
  3. Коли під час випуску з'явиться відповідний запит, завантажте сертифікат, щоб зареєструвати його до Google.

Якщо ви використовуєте ключ завантаження:

  • Ключ завантаження реєструється в Google лише для автентифікації особи творця програми.
  • Ваш підпис видаляється зі всіх завантажених APK-файлів, перш ніж вони потрапляють до користувачів.
Обмеження
  • Ключ завантаження повинен використовувати шифрування RSA, його розмір повинен становити щонайменше 2048 біт.
  • Не підтримуються ключі DSA та EC, а також ключі RSA розміром менше 2048 біт.
Оновлення сховищ ключів

Створивши ключ завантаження, перевірте та за потреби оновіть такі розташування:

  • локальна система;
  • захищений локальний сервер(з різними списками контролю доступу);
  • хмарна система (з різними списками контролю доступу);
  • спеціальні послуги з управління ключами;
  • репозиторії Git.

Як оновити ключ підпису для нових установок програми

У деяких випадках можна запросити оновлення ключа підпису програми. Новий ключ буде використовуватися для підпису нових установок та оновлень програми, а застарілий – для оновлень підписаних ним версій, які вже встановлені користувачами.

Для кожної програми ключ підпису можна оновити лише один раз. У малоймовірному випадку, коли ви використовуєте один ключ підпису для кількох програм, щоб запускати їх в одному процесі, ключ не можна оновити.

Запитувати оновлення ключа підпису програми слід у таких випадках:

  • Вам потрібен криптостійкіший ключ.
  • Ключ підпису програми зламано.

Примітка.Запит на оновлення ключа підпису програми на Play Console не пов'язаний із заміною ключів для Android P і пізніших версій. В даний час така заміна ключів не підтримується Google Play.

Важливі примітки щодо оновлення ключів

Перш ніж вимагати оновлення ключа, важливо зрозуміти, які зміни це спричинить.

  • Якщо ви використовуєте один ключ підпису для кількох програм, щоб використовувати один код або дані, потрібно оновити програми, щоб вони розпізнавали і новий, і застарілий ключі.
  • Якщо програма використовує API, перед її оновленням обов'язково зареєструйте сертифікати для нового та застарілого ключів підпису програми у провайдера API. Сертифікати доступні на сторінці Підписання додатків Play Console.
  • Якщо багато користувачів вашої програми встановлюють оновлення через файлообмінні мережі, вони зможуть встановлювати лише оновлення, підписані тим же ключем, що й встановлений на їх пристрої додаток. Якщо програми не можна оновити, оскільки встановлена ​​версіяпідписана іншим ключем, користувачі можуть видалити та перевстановити його, щоб отримувати оновлення.
Запитайте оновлення ключа для нових установок. Для цього виконайте такі дії:
  1. Увійдіть у Play Console.
  2. Виберіть програму.
  3. У меню зліва виберіть Управління релізом > Підписи додатків.
  4. У картці "Оновіть ключ підпису для нових установок програми" виберіть Запитати оновлення ключа.
  5. Виберіть, що робити з пристроєм.
    • Залежно від вибраного варіанта, можливо, доведеться звернутися до служби підтримки, щоб завершити запит.
  6. Дозвольте Google Play створити новий ключ підпису програми (рекомендовано) або завантажте його.
    • Після оновлення ключа підпису програми, якщо цей ключ збігався з ключем завантаження, ви можете продовжити використовувати старий ключ підпису програми як ключ завантаження або створити новий.
  • Якщо ви також опублікували програму за межами Google Play або збираєтеся зробити це, то можете згенерувати загальний ключ підпису програми і завантажити його в Google під час реєстрації в програмі підписання програм Google Play.
  • Щоб захистити свій обліковий запис, увімкніть двоетапну автентифікаціюдля всіх облікових записів, які мають доступ до Play Console.
  • Після публікації набору App Bundle у тестовій або робочої версіїви можете відкрити браузер App Bundle і завантажити ZIP-архів, що містить всі APK-файли для певного пристрою. Ці APK-файли вже підписані ключем підпису програми. Ви можете встановити їх на пристрій із ZIP-архіву за допомогою утиліти. командного рядка bundletool.
  • Для більшої безпеки згенеруйте новий ключ завантаження, який відрізняється від ключа підпису програми.
  • Якщо ви хочете протестувати APK-файл, підписаний ключем завантаження, зареєструйте ключ у службі або API, які використовують підпис програми для автентифікації (наприклад, API Google Картабо пакет розробника Facebook).
  • Якщо ви використовуєте Google API, можна зареєструвати сертифікат завантаження в Google Cloud Console .

Що робити, якщо ключ втрачено або зламано

Якщо ви втратили доступ до закритого ключа завантаження або він був зламаний, і попросіть власника облікового запису . При зверненні до служби підтримки власник облікового запису повинен прикріпити файл upload_certificate.pem.

Коли команда служби підтримки зареєструє новий ключ завантаження, ви отримаєте електронний лист, а потім зможете оновити сховища ключів та зареєструвати ключ у постачальників API.

Важливо!Скидання ключа завантаження не торкається ключа підпису програми, за допомогою якої Google Play підписує APK-файли перед відправкою користувачам.

Ця інформація виявилася корисною?

Як можна покращити цю статтю?

Іноді деякі програми на Android чимось не влаштовують користувача. Як приклад можна навести настирливу рекламу. А то буває і так – усім хороша програма, та тільки переклад у ній або кривою, або зовсім відсутня. Або, наприклад, програма тріальна, а отримати повну версію можливості немає. Як змінити ситуацію?

Вступ

У цій статті ми поговоримо про те, як розібрати пакет APK з додатком, розглянемо його внутрішню структуру, дизасемблуємо та декомпілюємо байт-код, а також спробуємо внести до додатків кілька змін, які можуть принести нам ту чи іншу вигоду.

Щоб зробити все це самостійно, знадобляться хоча б початкові знання мови Java, на якій пишуться програми для Android, і мови XML, яка використовується в Android повсюдно - від опису самої програми та її прав доступу до зберігання рядків, які будуть виведені на екран. Також знадобиться вміння поводитися зі спеціалізованим консольним софтом.

Отже, що ж є пакет APK, в якому поширюється абсолютно весь софт для Android?

Декомпіляція додатків

У статті ми працювали тільки з дизассембльованим кодом програми, проте якщо у великі програми вносити серйозніші зміни, розібратися в коді smali буде набагато складніше. На щастя, ми можемо декомпілювати код dex Java-код, який буде хоч і не оригінальним і не компилируемым назад, але набагато легшим для читання та розуміння логіки роботи програми. Щоб зробити це, нам знадобляться два інструменти:

  • dex2jar - транслятор байт-коду Dalvik в байт-код JVM, на основі якого ми зможемо отримати код мовою Java;
  • jd-gui - сам декомпілятор, що дозволяє отримати з байт-коду JVM код Java, що читається. Як альтернативу можна використовувати Jad (www.varaneckas.com/jad); хоч він і досить старий, але в деяких випадках генерує код, що більш читається, ніж Jd-gui.

Використовувати їх слід так. Спочатку запускаємо dex2jar, вказуючи як аргумент шлях до apk-пакета:

%dex2jar.sh mail.apk

В результаті в поточному каталозі з'явиться Java-пакет mail.jar, який можна відкрити в jd-gui для перегляду Java-коду.

Пристрій APK-пакетів та їх отримання

Пакет програми Android, по суті, є звичайним ZIP-файлом, для перегляду вмісту та розпакування якого ніяких спеціальних інструментів не потрібно. Достатньо мати архіватор – 7zip для Windows або консольний unzip у Linux. Але це щодо обгортки. А що всередині? Усередині ж у нас у загальному випадку така структура:

  • META-INF/- містить цифровий сертифікат програми, що засвідчує його творця, та контрольні суми файлів пакета;
  • res/ - різні ресурси, які додаток використовує у своїй роботі, наприклад, зображення, декларативний опис інтерфейсу, а також інші дані;
  • AndroidManifest.xml- Опис програми. Сюди входить, наприклад, список необхідних дозволів, необхідна версія Android та необхідна роздільна здатність екрана;
  • classes.dex- компільований байт-код програми для віртуальної машини Dalvik;
  • resources.arsc- теж ресурси, але іншого роду - зокрема рядки (так-так, цей файл можна використовувати для русифікації!).

Перелічені файли та каталоги є якщо не у всіх, то, мабуть, в більшості APK. Однак варто згадати ще кілька не настільки поширених файлів/каталогів:

  • assets- Аналог ресурсів. Основна відмінність - для доступу до ресурсу необхідно знати його ідентифікатор, список asset'ів можна отримувати динамічно, використовуючи метод AssetManager.list() в коді програми;
  • lib– нативні Linux-бібліотеки, написані за допомогою NDK (Native Development Kit).

Цей каталог використовують виробники ігор, розміщуючи туди двигун гри, написаний на C/C++, а також творці високопродуктивних додатків (наприклад, Google Chrome). З пристроєм розібралися. Але як же отримати сам файл пакета програми, що цікавить? Оскільки без рута з пристрою забрати файли APK неможливо (вони лежать у каталозі /data/app), а рутити не завжди доцільно, є як мінімум три способи отримати файл програми на комп'ютер:

  • розширення APK Downloader для Chrome;
  • додаток Real APK Leecher;
  • різні файлообмінники та варезники.

Який із них використовувати - справа смаку; ми вважаємо за краще використовувати окремі програми, тому опишемо використання Real APK Leecher, тим більше що написаний він на Java і, відповідно, працюватиме хоч у вінді, хоч у ніксах.

Після запуску програми необхідно заповнити три поля: Email, Password та Device ID - та вибрати мову. Перші два - e-mail та пароль твого гуглоаккаунта, який ти використовуєш на пристрої. Третій є ідентифікатором пристрою, і його можна отримати, набравши на номеронабирачі код # #8255## а потім знайшовши рядок Device ID. При заповненні треба ввести лише ID без префікса android-.

Після заповнення та збереження нерідко вискакує повідомлення "Error while connecting to server". Воно не має відношення до Google Play, тому сміливо його ігноруй і шукай пакети, які тебе цікавлять.

Перегляд та модифікація

Припустимо, ти знайшов пакет, що тебе цікавить, скачав, розпакував… і при спробі перегляду якого-небудь XML-файлу з подивом виявив, що файл не текстовий. Чим же його декомпілювати та як взагалі працювати з пакетами? Невже потрібно ставити SDK? Ні, SDK ставити не обов'язково. Насправді для всіх кроків розпакування, модифікації та упаковки пакетів APK потрібні наступні інструменти:

  • архіватор ZIPдля розпакування та запакування;
  • smali- асемблер/дизассемблер байт-коду віртуальної машини Dalvik (code.google.com/p/smali);
  • aapt- інструмент для запакування ресурсів (за замовчуванням ресурси зберігаються у бінарному вигляді для оптимізації продуктивності програми). Входить до складу Android SDK, але може бути отриманий окремо;
  • signer- Інструмент для цифрового підпису модифікованого пакета (bit.ly/Rmrv4M).

Використовувати всі ці інструменти можна і окремо, але це незручно, тому краще скористатися високорівневим софтом, побудованим на їх основі. Якщо ти працюєш у Linux або Mac OS X, то є інструмент під назвою apktool . Він дозволяє розпаковувати ресурси в оригінальний вигляд (у тому числі бінарні XML- та arsc-файли), перезбирати пакет із зміненими ресурсами, але не вміє підписувати пакети, так що запускати утиліту signer доведеться вручну. Незважаючи на те, що утиліта написана на Java, її установка досить нестандартна. Спочатку слід отримати сам jar-файл:

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ export PATH=~/bin:$PATH

Якщо ж ти працюєш у Windows, то для неї є чудовий інструмент під назвою Virtuous Ten Studio, який також акумулює всі ці інструменти (включаючи сам apktool), але замість CLI-інтерфейсу надає користувачеві інтуїтивно зрозумілий графічний інтерфейс, за допомогою якого можна виконувати операції з розпакування, дизассемблювання та декомпіляції в кілька кліків. Інструмент цей Donation-ware, тобто іноді з'являються віконця з пропозицією отримати ліцензію, але це, зрештою, можна і зазнати. Описувати його не має сенсу, тому що розібратися в інтерфейсі можна за кілька хвилин. А ось apktool, внаслідок його консольної природи, слід обговорити докладніше.


Розглянемо налаштування apktool. Якщо коротко, то є три основні команди: d(decode), b(build) та if(install framework). Якщо з першими двома командами все зрозуміло, що робить третя, умовний оператор? Вона розпаковує вказаний UI-фреймворк, який необхідний у тих випадках, коли ти препаруєш будь-який системний пакет.

Розглянемо найцікавіші опції першої команди:

  • -s- не дизасемблювати файли dex;
  • -r- не розпаковувати ресурси;
  • -b- не вставляти налагоджувальну інформацію в результати дизасемблювання файлу dex;
  • --frame-path- використовувати вказаний UI-фреймворк замість вбудованого в apktool. Тепер розглянемо пару опцій для команди b:
  • -f- форсоване складання без перевірки змін;
  • -a- вказуємо шлях до aapt (засіб для збирання APK-архіву), якщо ти з якоїсь причини хочеш використовувати його з іншого джерела.

Користуватися apktool дуже просто, для цього достатньо вказати одну з команд і шлях до APK, наприклад:

$apktool d mail.apk

Після цього в каталозі mail з'являться всі вилучені та дизассембльовані файли пакета.

Препарування. Відключаємо рекламу

Теорія – це, звичайно, добре, але навіщо вона потрібна, якщо ми не знаємо, що робити з розпакованим пакетом? Спробуємо застосувати теорію з користю собі, саме модифікуємо якусь софтину те щоб вона показувала нам рекламу. Для прикладу нехай це буде Virtual Torch – віртуальний смолоскип. Для нас ця софтина підійде ідеально, тому що вона під зав'язку набита дратівливою рекламою і до того ж досить проста, щоб не загубитися в нетрях коду.


Отже, за допомогою одного з наведених способів завантажуй додаток з маркету . Якщо ти вирішив використовувати Virtuous Ten Studio, просто відкрий APK-файл у додатку та розпакуй його, для чого створи проект (File -> New project), потім у контекстному меню проекту вибери Import File. Якщо ж твій вибір припав на apktool, достатньо виконати одну команду:

$apktool d com.kauf.particle.virtualtorch.apk

Після цього у каталозі com.kauf.particle.virtualtorch з'явиться файлове дерево, схоже на описане у попередньому розділі, але з додатковим каталогом smali замість dex-файлів та файлом apktool.yml. Перший містить дизассембльований код виконуваного dex-файлу програми, другий - службову інформацію, необхідну apktool для складання пакета назад.

Перше місце, куди ми повинні заглянути, це, звичайно ж, AndroidManifest.xml. І тут ми відразу зустрічаємо наступний рядок:

Неважко здогадатися, що вона відповідає за надання додатку повноважень використання інтернет-з'єднання. По суті, якщо ми хочемо просто позбавитися реклами, нам, швидше за все, достатньо буде заборонити додатку інтернет. Спробуємо це зробити. Видаляємо вказаний рядок і пробуємо зібрати софтину за допомогою apktool:

$apktool b com.kauf.particle.virtualtorch

У каталозі com.kauf.particle.virtualtorch/build/ з'явиться результуючий файл APK. Однак встановити його не вийде, оскільки він не має цифрового підпису та контрольних сум файлів (у ньому просто немає каталогу META-INF/). Ми повинні підписати пакет за допомогою утиліти apk-signer. Запустили. Інтерфейс складається з двох вкладок – на першій (Key Generator) створюємо ключі, на другій (APK Signer) підписуємо. Щоб створити наш приватний ключ, заповнюємо такі поля:

  • Target File- Вихідний файл сховища ключів; у ньому зазвичай зберігається одна пара ключів;
  • Passwordі Confirm- пароль для сховища;
  • Alias- ім'я ключа у сховищі;
  • Alias ​​passwordі Confirm- пароль секретного ключа;
  • Validity- Термін дії (у роках). Значення за промовчанням оптимальне.

Інші поля, загалом, необов'язкові - але потрібно заповнити хоча б одне.


WARNING

Щоб підписати програму за допомогою apk-signer, ти маєш встановити Android SDK і вказати повний шлях до нього в налаштуваннях програми.

Вся інформація надана виключно для ознайомлення. Ні редакція, ні автор не несуть відповідальності за будь-яку можливу шкоду, заподіяну матеріалами цієї статті.

Тепер цим ключем можна підписати APK. На вкладці APK Signer вибираємо щойно згенерований файл, вводимо пароль, аліас ключа та пароль до нього, потім знаходимо файл APK і сміливо тиснемо кнопку Sign. Якщо все пройде нормально, пакет буде підписано.

INFO

Так як ми підписали пакет нашим власним ключем, він конфліктуватиме з оригінальним додатком, а це означає, що при спробі оновити софтину через маркет ми отримаємо помилку.

Цифровий підпис необхідний лише сторонньому софту, тому якщо ти займаєшся модифікацією системних додатків, які встановлюються копіюванням в каталог /system/app/, підписувати їх не потрібно.

Після цього скидаємо пакет на смартфон, встановлюємо та запускаємо. Вуаля, реклама зникла! Замість неї, однак, з'явилося повідомлення, що ми не маємо інтернету або відсутні відповідні дозволи. За ідеєю, цього могло б і вистачити, але повідомлення виглядає дратівливо, та й, якщо чесно, нам просто пощастило з тупим додатком. Нормально написана софтина, швидше за все, уточнить свої повноваження або перевірить наявність інтернет-з'єднання і інакше просто відмовиться запускатися. Як бути у цьому випадку? Звісно, ​​правити код.

Зазвичай автори додатків створюють спеціальні класи для виведення реклами та викликають методи цих класів під час запуску програми або однієї з його активностей (спрощено кажучи, екранів програми). Спробуймо знайти ці класи. Ідемо до каталогу smali, далі com (в org лежить тільки відкрита графічна бібліотека cocos2d), далі kauf (саме туди, тому що це ім'я розробника і там лежить весь його код) – і ось він, каталог marketing. Усередині знаходимо купу файлів із розширенням smali. Це класи, і найбільш примітний їх клас Ad.smali, за назвою якого неважко здогадатися, що він виводить рекламу.

Ми могли б змінити логіку його роботи, але набагато простіше буде тупо прибрати виклики будь-яких його методів із самого застосування. Тому виходимо з каталогу marketing і йдемо в сусідній каталог particle, а потім у virtualtorch. На особливу увагу тут заслуговує файл MainActivity.smali. Це стандартний для Android клас, який створюється Android SDK і встановлюється як точка входу в програму (аналог функції main в Сі). Відкриваємо файл для редагування.

Усередині знаходиться код smali (місцевий асемблер). Він досить заплутаний і важкий для читання через свою низькорівневу природу, тому ми не будемо його вивчати, а просто знайдемо всі згадки класу Ad в коді і закоментуємо їх. Вбиваємо рядок «Ad» у пошуку та потрапляємо на рядок 25:

Field private ad:Lcom/kauf/marketing/Ad;

Тут створюється поле ad для зберігання об'єкта класу Ad. Коментуємо за допомогою налаштування знака ### перед рядком. Продовжуємо пошук. Рядок 423:

New-instance v3, Lcom/kauf/marketing/Ad;

Тут відбувається створення об'єкта. Коментуємо. Продовжуємо пошук та знаходимо у рядках 433, 435, 466, 468, 738, 740, 800 та 802 звернення до методів класу Ad. Коментуємо. Наче все. Зберігаємо. Тепер пакет необхідно зібрати назад та перевірити його працездатність та наявність реклами. Для чистоти експерименту повертаємо віддалений з AndroidManifest.xml рядок, збираємо пакет, підписуємо та встановлюємо.

Наш піддослідний кролик. Видна реклама

Оп-па! Реклама зникла лише під час роботи програми, але залишилася у головному меню, яке ми бачимо, коли запускаємо софтину. Так, зачекайте, але ж точка входу - це клас MainActivity, а реклама зникла під час роботи програми, але залишилася в головному меню, отже, точка входу інша? Щоб виявити дійсну точку входу, знову відкриваємо файл AndroidManifest.xml. І так, у ньому є такі рядки:

Вони говорять нам (і, що важливіше, андроїду) про те, що активність з ім'ям Start має бути запущена у відповідь на генерацію інтенту (події) android.intent.action.MAIN із категорії android.intent.category.LAUNCHER. Ця подія генерується при тапі на іконку програми в ланчері, тому вона визначає точку входу, а саме клас Start. Швидше за все, програміст спочатку написав програму без головного меню, точкою входу до якого був стандартний клас MainActivity, а потім додав нове вікно (активність), що містить меню та описане в класі Start, і вручну зробив його точкою входу.

Відкриваємо файл Start.smali і знову шукаємо рядок Ad, знаходимо в рядках 153 і 155 згадування класу FirstAd. Він теж є у вихідниках і, судячи з назви, таки відповідає за показ оголошень на головному екрані. Дивимося далі, йде створення екземпляра класу FirstAd та інтенту, що за контекстом має відношення до цього екземпляра, а далі мітка cond_10, умовний перехід на яку здійснюється якраз перед створенням екземпляра класу:

If-ne p1, v0, :cond_10 .line 74 new-instance v0, Landroid/content/Intent; ... :cond_10

Швидше за все, програма якимось випадковим чином обчислює, чи потрібно показувати рекламу на головному екрані, і якщо ні, перескакує відразу на cond_10. Ок, спростимо їй завдання та замінимо умовний перехід на безумовний:

#if-ne p1, v0, :cond_10 goto:cond_10

Більше згадок FirstAd у коді немає, тому закриваємо файл і знову збираємо наш віртуальний факел за допомогою apktool. Копіюємо на смартфон, встановлюємо, запускаємо. Вуаля, вся реклама зникла, із чим нас усіх і вітаємо.

Підсумки

Ця стаття лише коротке введення в методи розкриття та модифікації Android-додатків. За кадром залишилося багато питань, таких як зняття захисту, розбір обфусцированного коду, переклад та заміна ресурсів програми, а також модифікація програм, написаних з використанням Android NDK. Однак, маючи базові знання, розібратися в цьому - лише питання часу.

Post Views: 5 618

Android Studioнадає широкі можливості як розробки додатків, так підвищення автоматизації і комфортності при програмуванні.

Якщо ви використовуєте систему збирання Gradleдля створення своїх програм, то ви можете також налаштувати кілька параметрів для створення підписів до ваших програм.

Швидше за все, вам не хочеться публікувати свої ключі для підпису, паролі та імена користувачів у публічному (або навіть приватному) репозиторії. Тому можна визначити ключ, пароль та ім'я користувача як властивості в окремому файлі.

Перед тим, як розпочати підписання програми, вам необхідно у файлі gradle.properties створити нову властивість. Назвемо його Keys.repoі, як значення, вкажемо шлях до папки, де згодом будуть знаходитися сховище ключів та файл з властивостями (наприклад, C:/Users/UserName/.signing).

Keys.repo=C:/Users/UserName/.signing

Потім потрібно створити цю папку або, якщо ви вказали існуючу, відкрити її. У ній необхідно створити файл YourProjectName.properties, всередині якого будуть прописані як властивості шлях до сховища ключів, псевдонім ключа та пароль у наступному вигляді.

RELEASE_STORE_FILE=/YourProjectName/KeyStoreName.jks RELEASE_STORE_PASS=****** RELEASE_ALIAS=KeyAlias ​​RELEASE_KEY_PASS=******

Як створити сховище ключів?

Якщо у вас немає сховища ключів, його можна легко створити допомогою Android Studio. Для цього потрібно вибрати в меню пункт Build -> Generate Signed APK.

У вікні, що з'явилося, потрібно натиснути Create new...В результаті відкриється вікно, в якому ви можете вказати, де буде розташовуватися сховище ключів (для даного уроку краще відразу вибрати шлях, який ви вказали YourProjectName.propertiesу властивості RELEASE_STORE_FILE), а також дані про ключ.

Потім потрібно створити папку YourProjectNameі перенести туди потрібний файлсховища ключів.

Тепер можна розпочати безпосередньо підписання. Для цього у вашому проекті потрібно відкрити файл build.gradle(розташований у папці app). Усередині нього в блоці androidпотрібно додати наступний код.

SigningConfigs ( debug ( /* тут ніяких змін немає */ ) release ( if (project.hasProperty("Keys.repo")) ( def projectPropsFile = file(project.property("Keys.repo") + "/YourProjectName.properties ") if (projectPropsFile.exists()) ( Properties props = new Properties() props.load(new FileInputStream(projectPropsFile)) storeFile file(file(project.property("Keys.repo") + props["RELEASE_STORE_FILE"]) )) storePassword props["RELEASE_STORE_PASS"] keyAlias ​​props["RELEASE_ALIAS"] keyPassword props["RELEASE_KEY_PASS"] ) ) else ( println "=================== =================================="println" - Please configure release-compilation environment - e.g. in ~/. signing directory" println "============================================= ==========" ) ) )

Які бувають схеми отримання підпису?

Існують дві схеми отримання підпису APK: v1 JARі v2 Full APK.

У першому випадку підписується JAR-файл, що є традиційним способомпідписання. Підпис v1 не захищає деякі частини APK, такі як метадані ZIP. Верифікатор APK повинен обробляти безліч ненадійних (ще не перевірених) структур даних, а потім відкидати дані, які не підписані, що надає великий простір для атаки. Крім того, верифікатор APK повинен розпакувати всі стислі записи, що витрачає багато часу та пам'яті. Щоб вирішити ці проблеми, було розроблено другу схему v2 Full APK.

Схема v2 була представлена ​​в Android 7.0 Nougat (API 25)і працює, починаючи з версії Android Studio 2.2і Android Gradle plugin 2.2. Ця схема забезпечує більш швидке встановлення програми та гарний захист від несанкціонованих змін в APK. Вміст APK хешується та підписується, потім отриманий блок підпису APKвставляється в APK.

Під час перевірки схема v2 розглядає APK як blob та виконує перевірку підпису по всьому файлу. Будь-яка модифікація APK, включаючи модифікації метаданих ZIP, робить підпис недійсним. Ця форма перевірки значно швидша і дозволяє виявити більше несанкціонованих модифікацій.

Новий формат назад сумісний, тому APK, підписані новою схемою, можуть бути встановлені на більш ранніх пристроях (які просто ігноруватимуть новий підпис), якщо ці APK також підписані схемою v1.

За умовчанням під час підписання використовуються обидві схеми, щоб програми могли бути встановлені будь-яких пристроях. Однак, якщо є така необхідність, можна вимкнути підпис v1 або v2. Для цього у наведеному вище коді в блоці releaseдостатньо дописати такі рядки.

V1SigningEnabled false

V2SigningEnabled false

Важливо також враховувати, що підписувати схемою v1 потрібно перед підписанням схемою v2, оскільки APK не пройде перевірку за схемою v2, якщо він буде підписаний додатковими сертифікатами після підписання схемою v2.

Після того, як код додано, вкажіть цей код у блоці buildTypesвсередині release. Наприклад:

BuildTypes ( release ( minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" signingConfig signingConfigs.release ) )

Тепер можна сміливо у пункті меню Buildвибирати Build APK, попередньо змінивши тип складання з debugна release. Як видно, цей спосіб зручний тим, що він автоматичний, його достатньо налаштувати лише раз і ваші сховища ключів можуть бути в безпеці.


Top