Ломаем софт для Android. Делаем платное приложение бесплатным

Файлы, нужные для установки программ и игр на Android, обладают расширением APK. Такие приложения можно загрузить как в Play Market, где их инсталляция проходит в относительно незаметном для пользователя режиме, так и в любом стороннем сервисе, используя их веб- или скачиваемые версии.

Вы можете выполнить загрузку и вне «Плей Маркета». Отказываться от данной платформы необязательно, но если такое желание имеется – ничто не мешает скачивать ПО откуда угодно. Возможно, в вашей прошивке вовсе не предусмотрены сервисы Google, что актуально для EMUI, работающей на Huawei и Honor. Кроме того, можно просто удалить встроенный «Гугл Плей», используя сторонние средства по типу Lucky Patcher. Здесь же не заостряется внимание на процессе удаления системного софта – текст посвящён загрузке APK, имеющихся во встроенном каталоге, с помощью сторонних сервисов. Вообще еще бывают ситуации, когда пропал Плей Маркет на Андроиде или когда нужно обновить Play Маркет, и об этом тоже можете почитать в наших материалах. Ну а мы ниже рассказываем, как же все таки скачать APK-файл с Play Маркета разными способами.

Снаряжаемся

Для выполнения описанных в статье действий понадобится ряд инструментов, и главный инструмент — это Linux. Да, многие из названных далее программ могут работать и в Windows, но в любых операциях, связанных с Android и его приложениями, лучше не полагаться на детище Билли. В Linux практически все сделать проще, командная строка здесь в разы удобнее (она нам ох как понадобится), а некоторые инструменты просто недоступны для других ОС.

После установки Linux в виртуалку или второй системой сразу устанавливаем средства разработки на Java и виртуальную машину. В Ubuntu это можно сделать с помощью одной команды:

$ sudo apt-get install openjdk-7-jdk

Также нам нужны четыре инструмента для распаковки и декомпиляции приложений:

  • Apktool — швейцарский армейский нож для распаковки и запаковки приложений;
  • Jadx — декомпилятор байт-кода Dalvik в код на Java;
  • Backsmali — дизассемблер кода Dalvik (не пугайся, с настоящим ассемблером он имеет мало общего);
  • Sign — утилита для подписи пакетов.

Для удобства создадим в домашнем каталоге подкаталог Android и скачаем эти инструменты в него:

$ cd ~ $ mkdir ~/Android && cd ~/Android $ wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.2.0.jar $ wget https://github.com/skylot/jadx/releases/download/v0.6.0/jadx-0.6.0.zip $ wget https://github.com/appium/sign/raw/master/dist/sign.jar $ wget https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.1.3.jar $ mkdir jadx && cd jadx $ unzip ../jadx-0.6.0.zip

Добавим в конец файла ~/.bashrc следующие строки:

alias apktool=’java -jar ~/Android/apktool_2.2.0.jar’ alias jadx-gui=’~/Android/jadx/bin/jadx-gui’ alias baksmali=’java -jar ~/Android/baksmali-2.1.3.jar’ alias sign=’java -jar ~/Android/sign.jar’ alias javac=’javac -classpath /home/j1m/Android/android-sdk-linux/platforms/android-23/android.jar’ alias dx=’/home/j1m/Android/android-sdk-linux/build-tools/23.0.3/dx’

Они нужны для того, чтобы вместо длинных и неудобных команд вроде java -jar ~/Android/sign.jar можно было набрать просто sign.

Скидки на приложения

Некоторые приложения, такие как AppSales, следят за программами и играми в Google Play и уведомляют пользователя о текущих скидках. Вы можете добавить в список отслеживания нужное приложение, а затем получить уведомление о начале его распродажи. Конечно, это не совсем бесплатно, но вы получаете шанс приобрести интересующий контент по довольно выгодной цене.

Вскрываем подопытного

Теперь нам нужно найти приложение, которое, во-первых, нетрудно расковырять, а во-вторых, которое несет какую-то пользу и достаточно известно. То есть брать простейшую софтину только для того, чтобы было не очень сложно разобраться в ее коде, мы не будем, а вместо этого устремим свой взор на топ Play Store. Практически идеальный кандидат на эту роль — выпущенный два месяца назад ASAP Launcher, удобнейший домашний экран с массой полезных и неординарных функций.

Для начала пройдемся по APK без использования специальных инструментов. Для этого скачаем пакет при помощи сервиса APKPure: открываем страницу приложения в Play Store, копируем URL из адресной строки и вставляем в строку поиска на APKPure. Далее нажимаем кнопку Download APK и ждем окончания загрузки.


Страница ASAP Launcher на APKPure.com

Другие статьи в выпуске:

Xakep #212. Секреты даркнета

  • Содержание выпуска
  • Подписка на «Хакер»-70%

Для удобства переименуем пакет в asap.apk:

# cd ~/Downloads # mv ASAP\ Launcher_v1.16_apkpure.com.apk asap.apk

Разархивируем с помощью unzip:

# mkdir asap; cd asap # unzip asap.apk

Да, APK — это обычный архив ZIP, но тем не менее он имеет четкую структуру:

  • META-INF — каталог, содержащий файлы MANIFEST.MF, CERT.MF и CERT.RSA. Первые два — список всех файлов пакета и их контрольных сумм, последний содержит открытый ключ разработчика и созданную с помощью закрытого ключа цифровую подпись файла CERT.MF. Эти данные нужны, чтобы при установке пакета система смогла выяснить, что пакет не был модифицирован и действительно создан его автором. Это важно, так как, поскольку нет возможности подделать цифровую подпись пакета (для этого нужен закрытый ключ), модифицированный пакет придется подписывать другим ключом;
  • res — ресурсы приложения. Здесь находятся иконка (mipmap), переводы строк (values), изображения (drawable), а также описания интерфейса приложения (layout). Все их можно модифицировать, чтобы изменить внешний вид приложения. Правда, файлы XML придется сначала «разжать» — для улучшения производительности они хранятся в бинарном формате;
  • classes.dex — код приложения в форме байт-кода виртуальной машины Dalvik. Обычно приложения содержат только один такой файл, но, используя директиву multiDex, разработчик может заставить среду разработки разбить его на множество более мелких для улучшения производительности или преодоления ограничения на 65 536 методов в одном dex-файле;
  • AndroidManifest.xml — манифест приложения, описывающий его структуру, включая активности, сервисы, обработчики интентов и так далее. Опять же в формате бинарного XML.

Также пакет может содержать другие каталоги, например assets (любые файлы, включенные разработчиком, в данном случае — шрифты и база данных) и lib (нативные библиотеки, созданные с использованием Android NDK).

AppsFree 6.0

AppsFree — предоставляет вам легкий и быстрый способ находить и скачивать платные приложения, игры, обои и наборы значков, доступные бесплатно в течение ограниченного периода времени. Персонализируйте работу с помощью расширенных настроек фильтров, и вы будете видеть только те типы приложений, которые вас интересуют.

Telegram-канал создателя Трешбокса про технологии

Telegram-канал создателя Трешбокса про технологии

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

Обзор возможностей:

  • Современный интуитивный дизайн
  • Постоянно обновляемый список приложений
  • Уведомления, не дающие вам пропустить последние обновления
  • Расширенные опции фильтра
  • Фильтр ключевых слов
  • Черный список разработчиков
  • Темная тема/ночной режим

Особенности приложения:

  • Только последние данные. Список приложений постоянно обновляется, вам не нужно ждать обновления каждый день/неделю.
  • Уведомления. Уведомления можно включить для популярных приложений и отдельных категорий согласно вашим предпочтениям.
  • Опции фильтра. Используйте фильтры для персонализации списка временно бесплатных приложений, выбрав минимальное число загрузок и оценку, или отфильтруйте приложения с рекламой и встроенными покупками.
  • Категории. Вас не интересуют определенные категории приложений (например, игры или обои)? Не проблема, просто отключите их, и приложения из этих категорий не будут появляться в вашем списке.
  • Фильтр ключевых слов. Используйте фильтр ключевых слов, чтобы исключить приложения с определенными ключевыми словами (например, набор значков, обои или циферблат).
  • Черный список разработчиков. Добавляйте разработчиков в свой личный черный список, и вас больше не побеспокоят их приложения. Отличное решение, чтобы избавиться от разработчиков, которые постоянно проводят распродажу наборов значков или обоев, если вас не интересует подобный контент.
  • Ночной режим. Включите ночной режим, чтобы сэкономить заряд батареи при использовании экрана OLED, а также чтобы снизить нагрузку на глаза в условиях слабого освещения.

Предложения? Отзывы? Оставьте нам комментарий или оценку на Google Play или свяжитесь с нами по адресу

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

Изучаем код

Само собой разумеется, просто разархивировать пакет недостаточно. Чтобы разобраться в работе приложения, необходимо декомпилировать файл classes.dex.

Для этого мы воспользуемся jadx-gui. Запускаем, выбираем asap.apk и видим слева список пакетов Java, включенных в APK. В данном случае это пакеты android.support — официальная библиотека Google, реализующая поддержку функций новых версий Android в старых (например, чтобы получить Material Design в Android 4.1), com.google.android.gms — Google Mobile Services, com.nispok.snakbar — реализация GUI-элемента snakbar, а также несколько других.

Пакеты Java

Основной код приложения содержится в пакете com.citc.asap, именно такое имя носит и само приложение в Google Store и на устройстве. Открываем его и видим больше десятка каталогов и множество исходников Java. Наша задача — сделать приложение «оплаченным», не платя за него. Но как найти нужный файл, реализующий проверку на оплату? Скорее всего, он будет содержать в имени слово billing. Пробегаемся по исходникам в поисках нужного нам файла и натыкаемся на исходник BaseBillingFragment в подкаталоге (пакете) fragments:

Это очень простой класс Java, в котором есть интересный метод:

protected boolean hasPrime() { return this.mHasPrime; }

Все, что он делает, — просто возвращает значение поля mHasPrime, однако интересен он не этим, а своим именем. Дело в том, что платная (точнее, оплаченная) версия ASAP называется Prime, и очевидно, что метод hasPrime как раз и нужен для проверки оплаты приложения. Чтобы подтвердить свою догадку, сохраним декомпилированные исходники (File -> Save all) в каталог и попробуем найти в них вызовы hasPrime():

Совпадений немного, основной «пользователь» hasPrime() — это SettingsFragment, то есть исходник, отвечающий за формирование окна настроек. Учитывая, что Prime-версия отличается от бесплатной именно тем, что в ней разблокированы дополнительные поля настроек, уже сейчас мы можем быть на 90% уверены, что hasPrime() — нужный нам метод. Скорее всего, именно с его помощью приложение выясняет, куплена ли Prime-версия. Осталось только убедиться в этом окончательно, подменив код метода на свой.

Amazon Underground

Amazon Underground является вторым по популярности магазином мобильных приложений после Google Play. Установите приложение на свой смартфон или планшет и получайте платные программы и игры бесплатно каждый день. Также Amazon оповестит вас о доступных скидках.

Конечно, вам потребует аккаунт для этого сервиса, который вы можете быстро зарегистрировать в самом приложении Amazon Underground.

Убедитесь, что на вашем Android-устройства разрешена установка приложений из неизвестных источников. Эта опция находится в настройках безопасности. Скачайте магазин приложений от Amazon по этой ссылке и установите его. Затем необходимо зарегистрировать аккаунт. Именно в разделе “Underground” находятся программы и игры для вашего гаджета.

Вносим правки

Метод hasPrime() очень прост: он возвращает значение поля mHasPrime, которое имеет тип boolean. Нетрудно предположить, что в случае, если приложение оплачено, hasPrime() вернет true, иначе вернет false. Наша задача — сделать так, чтобы метод всегда возвращал true и остальная часть приложения думала, что приложение оплачено, и разблокировала дополнительные опции в окне настроек.

К сожалению, сделать это с помощью прямой правки исходного кода не получится: приложение нельзя скомпилировать обратно. Однако никто не запрещает дизассемблировать код, внести правки и собрать его вновь. И как раз здесь нам понадобится apktool. Дизассемблируем APK:

$ apktool d -r asap.apk

В текущем каталоге появится подкаталог asap. Открываем файл asap/smali/com/citc/asap/fragments/BaseBillingFragment.smali и находим hasPrime(). Декларация метода будет выглядеть так:

.method protected hasPrime()Z .locals 1 .prologue .line 167 iget-boolean v0, p0, Lcom/citc/asap/fragments/BaseBillingFragment;->mHasPrime:Z return v0 .end method

Это и есть дизассемблированный листинг, и, как ты видишь, он на порядок проще, чем дизассемблированный код нативных приложений. В целом здесь все тривиально:

  • .method protected hasPrime()Z — объявляет protected-метод, который возвращает значение типа boolean (Z);
  • .locals 1 — говорит виртуальной машине, что метод использует в своей работе один регистр (в данном случае он будет содержать возвращаемое значение);
  • .prologue и .line 167 — директивы, необходимые для отладки, на ход исполнения не влияют;
  • iget-boolean v0, p0 … — получает значение поля типа boolean и записывает в регистр v0, регистр p0 — это нулевой параметр, он всегда равен имени класса (this);
  • return v0 — возвращает значение регистра v0;
  • .end method — закрывает тело метода.

Теперь мы должны изменить данный метод так, чтобы он возвращал true независимо от значения поля mHasPrime. Мы могли бы сделать это вручную, но проще написать новый метод на Java:

public class Test { public boolean hasPrime() { return true; } }

И пропустить его через компилятор и дизассемблер:

$ javac Test.java $ dx —dex —output=Test.dex Test.class $ baksmali Test.dex

На выходе получаем следующий ассемблерный код:

.method protected hasPrime()Z .registers 1 const v0, 1 return v0 .end method

Ты уже должен сам догадаться, что он объявляет константу v0 со значением 1 и возвращает ее (в Dalvik тип boolean — это int, который может иметь значение 1 — true или 0 — false). Осталось только вставить этот код вместо оригинального и собрать пакет обратно:

$ apktool b asap

Пакет появится в каталоге asap/dist. Переименуем его, чтобы не запутаться:

$ mv asap/dist/asap.apk asap-fake-hasPrime.apk

И подпишем с помощью тестового ключа:

$ sign asap-fake-hasPrime.apk

В результате в текущем каталоге появится файл asap-fake-hasPrime.s.apk. Остается только закинуть его на карту памяти и установить, удалив перед этим оригинальное приложение.


Настройки ASAP Launcher до…


…и после манипуляций

Выводы

Взломать приложение для Android очень и очень просто. Да, я не спорю, нам попался удобный и простой пример для модификации, но опять же повторюсь — это весьма популярное приложение, о котором рассказывали на большинстве сайтов, посвященных Android.

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

Рейтинг
( 2 оценки, среднее 4 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]