Ни один разговор о взломе и модификации приложений не обходится без упоминания дизассемблера, дебаггера, формата исполняемых файлов и вездесущей 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 и ждем окончания загрузки.

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

Для удобства переименуем пакет в 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.

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


6 комментариев

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …