Согласно статистике, более 80% приложений в Play Market хотя бы раз взламывались. Основные причины: завышенная стоимость услуг, скрытые функции или контент скандального характера. Ниже представлена инструкция для тех, кто хочет потренировать хакерские навыки на играх: открыть заблокированные уровни, получить бесплатные призы и другие «плюшки». Если вы намерены взломать приложение с незаконной коммерческой целью, миллион раз подумайте, так как это уголовно наказуемо (ст. №272 гл.28).
Взлом Android приложений без доступа к Root
С помощью перечисленных приложений можно хакнуть простенькую «игрушку» с минимальной степенью защиты. Идеально подходят в качестве «тренажеров» для тех, кто не знаком с IT, но хочет почувствовать себя профессиональным взломщиком.
CreeHack
Крихак позволяет взломать игры и в следующем приобретать их бесплатно. Единственный минус: прога давно не обновлялась, поэтому, не всем подойдет.
12 х@акерских приложений для Андроид телефона | хакерфон без рут | Dimon Dev
- отключить Google Play и все его сервисы (в настройках магазина);
- отключить интернет;
- запустить Крихак и нажать On;
- зайти в любое платное приложение (если появился значок «Взлом сработал» — значит, процедура удалась).
APK Editor
С помощью эдитора можно редактировать и взламывать APK элементы. Также программа позволяет менять содержимое объектов: локализационные строки, фон, макет, наличие рекламы. В Google Play приложение в открытом доступе, скачать — по этой ссылке .
Взлом Android приложений с доступом к Root
В данном случае уместно использовать более мощные программы.
Freedom
Принцип действия аналогичен Крихаку: взламывает игры и позволяет приобретать их бесплатно. То есть, программа создает фейковую карту для оплаты, которую система воспринимает как реальную.
Пользоваться Freedom очень просто: после запуска программы нажмите кнопку «Start», после чего выберите любую игру и попробуйте её купить. Высветится уведомление с информацией об аккаунте, в ней содержится надпись «Freecard xxx».
Скачать можно по ссылке.
Game Killer
Взламывает «игрушки», основой которых являются счетчики баллов, золота и пр. Как пользоваться:
- установите Гейм Киллер;
- запустите игру для взлома, потом сверните её;
- откройте Гейм Киллер и нажмите на ключик в углу;
- выберите из списка то, что хотите хакнуть;
- введите нужное количество элементов (например, накрутить 1000 монет).
Gamecih
ВСЕ СПОСОБЫ ВЗЛОМА ПРОГРАММ НА АНДРОИД + ССЫЛКИ НА СКАЧИВАНИЕ
Аналог Гейм Киллер, только изменяет показатели игровых валют. Инструкция такая же. Программа доступна по ссылке.
XMOD Games
С помощью этой программы проще побеждать в онлайн турнирах. Особенно популярна среди поклонников Clash of Clans и Boom Bitch. После установки плагина можно настраивать поиск врагов с конкретным количеством ресурсов. Также открывается доступ к активации постоянного онлайн-режима. Скачать можно по ссылке.
Lucky Patcher
Лаки Патчер вырезает рекламу из приложений и ломает их лицензию. С помощью него также можно установить хакнутый Play Market, и смартфон его распознает. «Бонусные» возможности: бесплатные покупки игр, клонирование прог и APK элементов. Принцип работы аналогичный предыдущим программам. Скачать можно по ссылке.
Game Guardian
Суть приложения аналогична Game Killer – взлом игр с числовыми счетчиками. Широкий набор фильтров и функций (например, можно ускорять или замедлять ход событий в игре). Инструкция также ничем не отличается от выше указанных. Ссылка на приложение здесь.
Game Hacker
Очередной взламыватель «игрушек» от китайских разработчиков. С помощью Гейм Хакера можно получать баллы, монетки, призы и другие игровые «трофеи» задаром. Ссылка на приложение здесь.
CheatEngine
Раньше прога работала только на ПК. Теперь появилась версия для смартфонов. С помощью неё можно менять игровые значения и получать доступ к заблокированным уровням, призам, предметам. Скачать можно по ссылке.
Источник: app-android.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
Ломаем софт для Android. Делаем платное приложение бесплатным
Ни один разговор о взломе и модификации приложений не обходится без упоминания дизассемблера, дебаггера, формата исполняемых файлов и вездесущей IDA Pro. Однако в случае с Android все намного проще, и здесь для вскрытия и даже внедрения кода в приложение совсем не обязательно использовать все эти инструменты. Код можно легко декомпилировать обратно в Java и модифицировать, используя пару простых инструментов и текстовый редактор.
Этой статьей мы начинаем цикл, посвященный вскрытию и модификации приложений для Android. Первая часть — вводная, поэтому никакого хардкора: мы разберемся в устройстве пакетов APK, научимся разбирать APK на части, декомпилировать его код, вносить правки и собирать обратно, и в качестве примера взломаем одно популярное приложение из маркета.
Вторая статья будет целиком посвящена внедрению бэкдора/вируса в чужое приложение. Это уже не просто правка нескольких строк, а глубокая модификация. Третья статья — методы обфускации и их обхода. Все больше разработчиков используют нетривиальную обфускацию, чтобы осложнить жизнь реверсерам. Мы распутаем их код и опять же внесем правки в приложение.
WARNING
Это ознакомительная статья, призванная всего лишь показать процесс взлома приложений. Она не призывает тебя заниматься варезом и лишать доходов людей, потративших многие недели на создание приложений. ASAP Launcher — великолепное приложение без навязчивой рекламы, почти вся полезная функциональность доступна бесплатно. Поэтому вместо того, чтобы использовать крякнутую версию, лучше купи полное приложение и поддержи разработчика. Оно обойдется тебе всего в 100 рублей.
Снаряжаемся
Для выполнения описанных в статье действий понадобится ряд инструментов, и главный инструмент — это 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.
Вскрываем подопытного
Теперь нам нужно найти приложение, которое, во-первых, нетрудно расковырять, а во-вторых, которое несет какую-то пользу и достаточно известно. То есть брать простейшую софтину только для того, чтобы было не очень сложно разобраться в ее коде, мы не будем, а вместо этого устремим свой взор на топ Play Store. Практически идеальный кандидат на эту роль — выпущенный два месяца назад ASAP Launcher, удобнейший домашний экран с массой полезных и неординарных функций.
Для начала пройдемся по APK без использования специальных инструментов. Для этого скачаем пакет при помощи сервиса APKPure: открываем страницу приложения в Play Store, копируем URL из адресной строки и вставляем в строку поиска на APKPure. Далее нажимаем кнопку Download APK и ждем окончания загрузки.
Другие статьи в выпуске:
Xakep #212. Секреты даркнета
- Содержание выпуска
- Подписка на «Хакер» -60%
Для удобства переименуем пакет в 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).
Изучаем код
Само собой разумеется, просто разархивировать пакет недостаточно. Чтобы разобраться в работе приложения, необходимо декомпилировать файл 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, а также несколько других.
Основной код приложения содержится в пакете com.citc.asap, именно такое имя носит и само приложение в Google Store и на устройстве. Открываем его и видим больше десятка каталогов и множество исходников Java. Наша задача — сделать приложение «оплаченным», не платя за него. Но как найти нужный файл, реализующий проверку на оплату? Скорее всего, он будет содержать в имени слово billing. Пробегаемся по исходникам в поисках нужного нам файла и натыкаемся на исходник BaseBillingFragment в подкаталоге (пакете) fragments:
Это очень простой класс Java, в котором есть интересный метод:
protected boolean hasPrime()
Все, что он делает, — просто возвращает значение поля mHasPrime, однако интересен он не этим, а своим именем. Дело в том, что платная (точнее, оплаченная) версия ASAP называется Prime, и очевидно, что метод hasPrime как раз и нужен для проверки оплаты приложения. Чтобы подтвердить свою догадку, сохраним декомпилированные исходники (File -> Save all) в каталог и попробуем найти в них вызовы hasPrime():
Совпадений немного, основной «пользователь» hasPrime() — это SettingsFragment, то есть исходник, отвечающий за формирование окна настроек. Учитывая, что Prime-версия отличается от бесплатной именно тем, что в ней разблокированы дополнительные поля настроек, уже сейчас мы можем быть на 90% уверены, что hasPrime() — нужный нам метод. Скорее всего, именно с его помощью приложение выясняет, куплена ли Prime-версия. Осталось только убедиться в этом окончательно, подменив код метода на свой.
Вносим правки
Метод 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. Остается только закинуть его на карту памяти и установить, удалив перед этим оригинальное приложение.
Выводы
Взломать приложение для Android очень и очень просто. Да, я не спорю, нам попался удобный и простой пример для модификации, но опять же повторюсь — это весьма популярное приложение, о котором рассказывали на большинстве сайтов, посвященных Android.
Большинство других приложений вскрыть так же просто, однако есть достаточное количество экземпляров, пропущенных через обфускаторы и различные системы защиты. С ними все несколько сложнее, и таким приложениям будет посвящена третья статья цикла. Во второй статье мы рассмотрим, как тот же самый метод модификации использовать для внедрения собственного кода.
WWW
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
Источник: xakep.ru