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

Напомню, что с прошлого набега на чужой софт у тебя должны были остаться несколько инструментов, а также алиасы в ~/.bashrc, необходимые для их быстрого запуска. Все это пригодится тебе и сегодня. Кроме того, в этот раз тебе понадобится среда разработки Android Studio. В статье я буду исходить из предположения, что сама Android Studio установлена в каталог ~/Android/android-studio, а SDK, то есть набор компиляторов и инструментов сборки, — в каталог ~/Android/android-sdk-linux.

Что касается софта, который мы будем препарировать, я предлагаю остановиться на WhatsApp — мегапопулярном приложении, которое входит в топ-10 всех магазинов приложений за все времена и, конечно же, нередко становится целью хакеров, внедряющих в него самые разные гадости. Так что статья получится более чем наглядной.

WARNING


Данная статья не является руководством начинающего создателя малвари и не призывает читателя к незаконным действиям. Единственная ее задача — рассказать, как на самом деле работают вирусы, встроенные в хакнутый софт, и предупредить, чем может грозить установка вареза на смартфон. Мы не одобряем вредоносную модификацию легитимного ПО и его распространение in-the-wild и напоминаем, что злонамеренное использование знаний, полученных из этой статьи, может повлечь ответственность, предусмотренную УК РФ.
 

Ищем точку входа

Как и в прошлый раз, идем на apkpure.com, вбиваем в строку поиска адрес WhatsApp в Google Play и скачиваем пакет APK. Для удобства переименовываем его в whatsapp.apk и перемещаем в каталог ~/tmp. Всю дальнейшую работу мы будем вести в нем.

Следующий шаг — найти наилучшее место для внедрения нашего зловредного кода. По объективным причинам такое место — это самое начало кода приложения, и если бы мы имели дело с обычной настольной Java, то это был бы метод main() главного класса приложения. Однако в Android исполнение приложения начинается не с main(). Фактически у здешнего софта вообще нет единой точки входа, оно состоит из множества компонентов, каждый из которых может получить управление при возникновении того или иного события.

Если мы хотим, чтобы наш код запускался при старте приложения с рабочего стола, нам нужно вставить его в класс, получающий управление при возникновении события (если быть точным, это называется «интент») android.intent.action.MAIN категории android.intent.category.LAUNCHER. Чтобы найти этот класс, придется дизассемблировать WhatsApp с помощью apktool и прочитать файл AndroidManifest.xml:

$ apktool d whatsapp.apk
$ less whatsapp/AndroidManifest.xml

Искомый класс носит имя com.whatsapp.Main. Открываем ~/tmp/whatsapp/smali/com/whatsapp/Main.smali и ищем метод OnCreate():

Это и есть искомая точка входа. C этого метода начинается исполнение графического Android-приложения, когда оно получает интент android.intent.action.MAIN, другими словами — когда юзер тапает по иконке приложения пальцем. В этот метод мы будем внедрять наш payload.

 

Пишем payload

Какой же код мы внедрим в WhatsApp? Для начала заставим его вывести на экран сообщение «Hi from malware!». Очень простая в реализации функция, которая позволит быстро проверить, что все работает так, как мы и рассчитывали. Если ты читал прошлую часть, то уже должен догадаться, как это сделать. Но не стоит торопиться, в этот раз мы не будем вставлять в код отдельные куски smali-кода, а вместо этого создадим отдельный класс, методы которого уже и будем вызывать из кода WhatsApp. Такой подход гораздо более удобен и позволяет как угодно расширять функциональность приложения, внося в его оригинальный код минимальные изменения.

Итак, открываем Android Studio, создаем новый проект, в поле Application name пишем Whatsapp, а в поле Company domain — com. Таким образом среда разработки сама разместит наш класс в пакете com.whatsapp, точно так же, как в оригинальном приложении. При выборе типа активности (Add an activity) выбираем Add No Activity. В левой части экрана разворачиваем список app → java → com.whatsapp и с помощью правой кнопки мыши создаем новый класс Payload. Добавляем в него следующие строки:

package com.whatsapp;

import android.content.Context;
import android.widget.Toast;

public class Payload {
  public static void run(Activity activity) {
    Toast.makeText(context, "Hi from malware!", Toast.LENGTH_LONG).show();
  }
}
Простейший payload
Простейший payload

Это и есть наш класс с единственным статическим методом, выводящим на экран сообщение. Теперь класс необходимо скомпилировать и транслировать в байт-код Dalvik. С помощью среды разработки без танцев с бубном это не получится, поэтому сделаем все из командной строки.

Для начала создадим в ~/tmp структуру каталога, аналогичную оригинальному приложению, и скопируем в нее исходный код класса:

$ mkdir -p com/whatsapp
$ cp ~/AndroidstudioProjects/Whatsapp/app/src/main/java/com/whatsapp/Payload.java com/whatsapp

Теперь скомпилируем его и транслируем в код Dalvik:

$ javac -classpath ~/Android/android-sdk-linux/platforms/android-23/android.jar com/whatsapp/*.java
$ ~/Android/android-sdk-linux/build-tools/23.0.3/dx --dex --output=Payload.dex com/whatsapp/*.class

Обрати внимание на android-23 и 23.0.3 в путях: чтобы они существовали, у тебя должен быть установлен SDK для Android 6.0 и соответствующие инструменты сборки (при первом запуске Android Studio предложит установить их сама).

В текущем каталоге (~/tmp) должен появиться файл Payload.dex. Его необходимо дизассемблировать:

$ baksmali Payload.dex

И скопировать в каталог с ранее дизассемблированным кодом WhatsApp:

$ cp out/com/whatsapp/*.smali whatsapp/smali/com/whatsapp

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

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

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

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

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


3 комментария

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

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

Check Also

Конкурс хаков: запускаем процессы с заранее заданным приоритетом

Тема не новая, но, может быть, кому-то пригодится. Как запускать процессы автоматически с …