Приведенный ниже рассказ применим к широкому кругу приложений и такого рода внедрения могут выполняться на разных уровнях. В этой статье делается попытка подчеркнуть очевидные болевые точки и рекомендовать решения.
Эта статья предназначена только для ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ и раскрывает известные уязвимости в Android-приложениях. НЕ пытайтесь использовать это в реальных приложениях.
TL; DR Я переписал байт-код, чтобы разблокировать премиум-функции приложения на моем устройстве, и теперь я покажу вам, как предотвратить это в вашем приложении.
Не загружайте APK-файлы со случайных веб-сайтов, поскольку они могут нести вредоносный байт-код и потенциально украсть данные с вашего устройства.
Платные функции с биллингом
Многие приложения предлагают пользователям совершать покупки внутри приложений — премиум-функции, какие-то виртуальные монеты для игр и т.д. После оплаты с помощью учетной записи Google покупки навсегда сохраняются на сервере Google с уникальным идентификатором. Это позволяет использовать купленные предметы на всех устройствах.
Как взломать google аккаунт самый правильный способ / (google) |2021
Но как, например, насчет Huawei, где сервисы Google Play не работают/недоступны? Huawei предоставляет почти идентичный API покупок в приложениях, хотя пользователь не может переносить свои покупки и подписки между платформами.
Проблема
Иногда приложения пытаются использовать более простые пути и не следуют инструкциям и рекомендациям Google. Это означает, что иногда они отказываются от проверки ранее приобретенных элементов при запуске приложения, тем самым оставляя для любого злоумышленника дверь открытой. Делать что-то на устройстве — всегда плохая идея.
Приведенный ниже рассказ применим к широкому кругу приложений и такого рода внедрения могут выполняться на разных уровнях. В этой статье делается попытка подчеркнуть очевидные болевые точки и рекомендовать решения.
Давайте поговорим о моем варианте: я купил премиум-функцию в Google Play, но само приложение не было доступно в магазине Huawei. Поэтому я скачал APK и установил его вручную, но премиум-функции были недоступны.
Статический анализ кода
Самый первый шаг — декомпилировать APK в код Smali. В ходе анализа я обнаружил, что это приложение X сохраняет логический флаг в Android SharedPreferences после успешной транзакции. Выполнение таких операций на устройствах — недопустимо.
Премиум-функция как флаг в SharedPreferences
Этот логический флаг использовался, чтобы проверить позже в приложении, куплена ли у пользователя расширенная функция.
В результате мы можем найти правильное место для вставки нашего байт-кода, чтобы обойти проверку — навсегда заменить ее флагом TRUE.
Smali
Я не хочу сразу переходить к результату и подробно объяснять, что происходит. Начну издалека. Когда мы компилируем приложение Java, создается байт-код. На платформе Android у нас раньше была виртуальная машина Dalvik, а теперь — Android Runtime (ART). Вместо байт-кода Java он преобразует исходный код в набор инструкций в формате .dex, который можно преобразовать в читаемый человеком код Smali.
Как взломать любую игру на монеты и гемы
Smali очень похож на байт-код Java.
Вот фрагмент начала метода onCreate из MainActivity в Smali:
Его можно перевести в:
где константа flag 128 означает FLAG_KEEP_SCREEN_ON из WindowManager.
Самая первая строка — это сигнатура метода, но что это за .locals, p0, p1, v0?
- v0..v15 — это просто локальные переменные. У методов 16 регистров.
- .locals с числом описывают, сколько свободных переменных имеет этот метод. Это чисто отладочный флаг, установленный декомпилятором, который нам очень помогает при статическом анализе кода.
- p0..p15 — параметры метода, который мы вводим.
Например, onCreate имеет 2 параметра p0 и p1, которые переводятся как «this» и Bundle соответственно -> super.onCreate(Bundle)
Практическое правило: повторно используйте существующие переменные «v», когда это возможно.
Коды операций Dalvik вы можете найти тут.
Внедрение кода
После всех вышеперечисленных шагов мы знаем, что для обхода проверки наличия премиум-функции нам просто нужно ввести код, который устанавливает логическое значение до того, как что-либо загрузится. Наиболее предпочтительное место находится в классе Application или в основной Activity (зависит от приложения). Допустим, мы собираемся внедрить его в MainActivity#onCreate.
Этот фрагмент кода такой же, как
SharedPreferences.Editor editor = sharedPref.edit(); edit.putBoolean(«preferencePremium», true); edit.apply();
Самый простой способ добиться этого — написать реальный код Kotlin/Java, скомпилировать и затем декомпилировать его, чтобы извлечь из него Smali, или напрямую написать байт-код Smali, который я предпочитаю для таких простых задач.
После этого приложение всегда будет запускаться с логическим флагом true.
Тот же метод используют сайты, распространяющие взломанные приложения.
Как предотвратить?
- Перенесите логику в свой бэкенд
- Всегда проверяйте купленный предмет, а затем предоставляйте доступ к приложению
- Делайте частые проверки покупок в Google через свой бэкенд
- Используйте шифрование для локального сохранения данных и желательно использовать ключ шифрования для конкретного устройства
- Используйте SafetyNet для отключения устройств с root-доступом и потенциального использования Xposed Framework
Проверьте, какие приобретенные элементы доступны для текущего пользователя при запуске приложения, а затем продолжайте работу. Не храните на устройстве ничего важного. Если вы собираетесь сохранить разблокированный контент на устройстве, не забудьте часто проверять его действительность и зашифровать его с помощью ключа шифрования для конкретного устройства. В случае злонамеренных действий рекомендуется использовать временный бан.
На этом пока все.
Источник: apptractor.ru
Взлом одного Android приложения
Недавно я усиленно разрабатывал свое приложение под Android, и в процессе защиты платной версии понял, что довольно сложно обезопасить приложение от взлома. Ради спортивного интереса решил попробовать убрать рекламу из одного бесплатного приложения, в котором баннер предлагается скрыть, если заплатить денежку через In-App Purchase.
В этой статье я опишу, как мне удалось убрать рекламу бесплатно и в конце — несколько слов о том, как усложнить задачу взломщикам.
Шаг 1. Получаем «читаемый» код приложения.
Чтобы добыть APK приложения из телефона, нужны root права. Вытягиваем приложение из телефона с помощью adb (пусть, для конспирации, у нас будет приложение greatapp.apk):
adb pull /data/app/greatapp.apk
Хабраюзер overmove подсказал мне, что root необязателен, можно с помощью Astro сделать бэкап любого приложения, и оно будет скопировано в /mnt/sdcard.
Хабраюзер MegaDiablo подсказал мне, что и Astro необязателен. Список установленных приложений и их файлы apk можно узнать через утилиту pm в шелле, а когда уже известно имя файла, его можно стянуть через adb pull /data/app/app.filename.apk .
APK — это ZIP архив, достаем оттуда интересующий нас файл classes.dex со скомпилированным кодом.
Будем использовать ассемблер/дизассемблер smali/baksmali для наших грязных дел.
java -jar baksmali-1.3.2.jar classes.dex
На выходе получаем директорию out с кучей файлов *.smali . Каждый из них соответствует файлу .class . Естественно, все обфусцированно по самое не хочу, выглядит эта директория вот так:
Попытаемся понять, где в этой обфусцированной куче «говорится» о рекламе. Сначала я просто сделал поиск с текстом » AdView » (View, отображающий рекламу из AdMob SDK) по всем файлам. Нашелся сам AdView.smali , R$id.smali и некий d.smali . AdView.smali смотреть не очень интересно, R.$id я как-то сначала проигнорировал, и пошел сразу в таинственный d.smali .
Шаг 2. Пойти по неверному пути.
Вот и метод a() в файле d.smali с первым упоминанием AdView (я решил, скриншотом лучше, а то без форматирования это очень уныло читать):
Метод ничего не возвращает, поэтому я, недолго думая, решил просто вставить поближе к началу return-void . Когда я все собрал и запустил, приложение радостно крэшнулось. Лог из adb logcat :
E/AndroidRuntime(14262): java.lang.RuntimeException: Unable to start activity ComponentInfo: android.view.InflateException: Binary XML file line #22: Error inflating class com.google.ads.AdView
Понятно, что наш AdView в результате манипуляций должным образом не создался. Забудем пока про d.smali .
Шаг 3. Откатываем назад все изменения и смотрим на пропущенный ранее R$id . Вот и строчка с AdView :
# static fields
.field public static final adView:I = 0x7f080006
Похоже, это идентификатор View с рекламой. Поищем, где он используется, сделав поиск по значению 0x7f080006 . Получаем всего два результата: тот же R$id и GreatApp.smali . В GreatApp.smali текст уже гораздо интереснее (комментарии мои):
Видно, что этот идентификатор используется для поиска View (строка 588) и буквально сразу же AdView удаляется с экрана (строка 595). Видимо, удаляется, если пользователь заплатил за отсутствие рекламы? Если посмотреть немного выше, то взгляд цепляется за строчку 558 с «ключевыми словами»:
invoke-static , Lnet/robotmedia/billing/BillingController;->isPurchased(Landroid/content/Context;Ljava/lang/String;)Z
robotmedia — сторонняя (open source) библиотека, призванная упростить работу с in-app billing-ом в андроиде. Почему же она не была полностью обфусцирована? Ну да ладно, повезло.
Видно, что метод isPurchased() возвращает строку, которая с помощью Boolean.valueOf() преобразуется в объект Boolean и, наконец, в обычный boolean через booleanValue() .
И тут самое интересное, в строке 572 мы переходим в некий :cond_32 , если значение результата == false . А иначе начинается уже просмотренный код поиска и удаления AdView .
Шаг 4. Минимальное изменение, собрать и запустить.
Что ж, дело за малым — удаляем эту ключевую строку, собираем приложение и сразу инсталлируем на телефон:
java -jar ..smalismali-1.3.2.jar ..smaliout -o classes.dex
apkbuilder C:develgreatappgreatapp_cracked.apk -u -z C:develgreatappgreatapp_noclasses.apk -f C:develgreatappclasses.dex
jarsigner -verbose -keystore my-release-key.keystore -storepass testtest -keypass testtest greatapp_cracked.apk alias_name
adb install greatapp_cracked.apk
( greatapp_noclasses.apk — это оригинальный APK приложения, из которого удален classes.dex, сертификаты создаются с помощью Android SDK).
И ура, запускаем приложение, никакой рекламы!
- Не осуществлять проверку оплаты или лицензирования в классах Activity и особенно методах onCreate() и ему подобных. Эти «точки входа» запускаются всегда в известное время и не обфусцируются, их всегда можно посмотреть и понять, что происходит с различными элементами UI
- Лучше всего проводить проверку не в основном потоке и в случайные моменты времени
- Проверять CRC файла classes.dex , причем хранить его зашифрованным
- Хранить код проверки лицензии или покупки скомпилированным и зашифрованным как ресурс приложения, динамически его загружать и запускать через reflection
- Отличное видео с Google IO 2011 о том, как защитить приложение от пиратов.
- Небольшая статья с блога Android Developers с краткой подборкой техник защиты приложения от взлома, много повторяет предыдущее видео
- Статья на Хабре о реверс-инжиниринге будильника
- Dalvik VM bytecodes
- http://androidcracking.blogspot.com/, отличный блог, посвященный взлому приложений
Источник: habr.com
Как взламывать программы на андроид
В современных реалиях взлом приложений уже никого не удивляет. Кто-то взламывает игры, чтобы юзать контент бесплатно, а кто-то хочет получить все функцие любимого фоторедактора без совершения покупок. Но как взломать приложение легко и быстро? Поскольку андроид-платформа очень популярна и чуть более уязвима, чем iOS, очень актуальна тема «хак андроид-программ».
Есть два способа пользоваться всеми функциями софта без отплаты контента:
- скачать уже готовый хакнутый софт на сайте;
- взлом платных приложений андроид самостоятельно с помощью программы.
Но у обоих вариантов есть свои сложности. У первого – это высокая вероятность подхватить вирус на устройство, скачивая с неизвестных источников. Поскольку, зачастую в файле нет самого софта, а они используются только как взломщик и «телепорт» для вируса. А у второго – высока сложность выполнения.
Если не найти вариант, который обеспечит безопасный взлом приложений на андроид (а таких очень мало), возможно, придётся переписывать программу на уровне кода. Это более сложный процесс. Стоит также обращать внимание на root права.
К примеру, одно из ярких вариантов для легкого взлома игр – DroidoLom. Этот софт занимается подбором комбинаций ключей при взломе через данные системы. Программа не сканирует ваши данные аккаунтов и более того, не пускает другой хакерский софт. Она также открывает скрытые возможности платных версий.
Отдельно хотим вам рассказать о самых популярных программах, которые используются для хаков на Android. Но некоторые из них с «претензией на приватность». Прежде всего, уточним, что любое вторжение в частную жизнь – это нарушение, и мы в 5mod не приветствуем такие способы.
Лучшие приложения для взлома на андроид и инструкции к использованию:
- DroidBox позволит полностью исследовать любую программу внутри. Оно анализирует софт и упаковывает данные в апк файл, который можно выгрузить и проверить все существующие данные;
- AndroRAT разрешит удаленно контролировать систему и узнать все данные про ОС. Его не нужно дополнительно включать, оно готово к работе сразу после окончания загрузки. Приложение может вытянуть инфу о геолокации, контактах и сообщениях;
- zANTI – очень полезный вариант для проверки сети на возможность хака. Оно искусственно создаёт ситуацию, чтобы определить бреши и слабые места в системе безопасности.
Еще раз напомним об опасности скачивания хакнутого софта с незнакомых сайтов. Загружайте его только если полностью уверены, что скачанное апк не принесёт вашему гаджету вреда. Скачивайте программы на нашем сайте и не беспокойтесь о безопасности вашего смартфона. Все они защищены от вирусов и вредоносного ПО.
Источник: 5mod.ru