Reverse-engineering одного вируса для Android

Я Java-программист и не так давно начал изучать Java для Android. Сегодня на мой планшет попало весьма любопытное уведомление «Надо обновить Flash Player», если бы не профессиональный интерес к платформе Android, то скорее всего я бы пропустил его и продолжил отдыхать, однако сегодня холодный воскресный вечер и я решил решил посмотреть что у вируса «под капотом».
Кстати, парни хорошо подгадали момент выпуска своего «FlashPlayer»: буквально за час до этого я обновлял нормальный FlashPlayer от Adobe на стационарнике.
Если Вам интересно — прошу под кат. Под катом есть несколько скриншотов.


Итак, я скачал APK на планшет, Lockout сразу ругнулся, что это троян и предложил сразу удалить файл от греха подальше. Отказавшись от удаления, я передал apk-шник на стационарник через FTP Server для дальнейшего исследования.

Первое что надо было сделать — распаковать архив с помощью apktool (все ссылки на использованные программы в конце статьи).



Прежде всего я обратил внимание на Android Manifest.

Там был весь (ну или почти весь) набор функций устройства. Кроме стандартных (для вирусных программ) разрешений типа:

<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />



Там были такие вещи:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
На хрена ему доступ к будильнику я так и не понял.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Отслеживая это событие, от сразу выполняет себя после сразу после загрузки.

Также вирус отслеживает:
  1. Подключение/отключение от сети:
    <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

  2. Присланные SMS'ки
    <intent-filter android:priority="999">
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />



И регистрирует сервис:
<service android:name="dsrhki.yjgfqjejkjh.gbjutaxgp">
<intent-filter>
<action android:name="dsrhki.yjgfqjejkjh.gbjutaxgpStart76" />


Если устанавливать приложение на устройство, то установка выглядит так:



После манифеста я глянул на ресурсы: там не было ничего интересного: стандартная иконка flash player'a размером 72 на 70 для всех плотностей и strings.xml с значением:
Loading


Самое интересное было в папке assets.


В папке files были 6 фотографий парней, 4 фото девушек, файл tabor.css (с какими-то стилями) и явно не текстовый файл a.txt (unix-овая утилита file не особо помогла определить что это, немногословно сказав a.txt: data

В папках css,images и js находились вспомогательные вещи для отрисовки html-страничек.

Страничка white.html выглядит так:



Видимо авторы сделали расчет на совсем тупых юзеров (иконка flash player, а предлагают грузить Opera Mini 6.5 (очень часто распространяемую через AdMob в приложениях).

По нажатию кнопки далее срабатывает сценарий JS, который делает редирект на payed.html

Еще в white.html есть скрытый див: с захардкоденной ссылкой:

Ваша ссылка:
yerc1.net/?u=64504.


На странице payed.html ссылка другая:

Ваша ссылка:
filesesa.net/?u=90-656jc5y9ny1yc2fb0d.


Страница sendcontacts.html просто содержит редирект на payed.html

Самая интересная страница это test.html.

Там активно используется JS c jQuery.

Алгоритм такой:

  1. Сначала показывается иконка и надпись: «Подождите идет установка.»
  2. Дальше с помощью JS вычисляется случайный timeout
    timeout = Math.floor((Math.random()*100)+1) + Math.floor((Math.random()*100)+1);
    Юзеру при этом показывается фейковый progressbar
  3. По окончанию ожидания вычисляется условие:
    (androidInfo.match(/operator3/) == 'operator3' || androidInfo.match(/operator13/) == 'operator13' )

    Если operator13, то выводится сообщение:
    $('#paymentinfo').html('Услуга платная, 29900руб. без налогов');

    Неплохая цена для бесплатного приложения…

    Если operator = 3, то сообщение такое: «Услуга платная, не более 354р с НДС.»

    Если не то и не другое, то показывается ссылка на offerta.html


offerta.html содержит соглашение между сервисом flashplayer-ru.net и Абонентом.

Полный текст можно прочитать на infomobiles.net/oferta.php

Приведу самые примечательные моменты:

  • Программный продукт является инсталляционным модулем («приложением»), обеспечивающим доступ к сервисам интернет-ресурса flashplayer-ru.net
  • В процессе регистрации… производится отправка до трёх сообщений электросвязи на цифровые идентификаторы, имеющие premium-тарификацию
  • Вы даете сведений о технических параметрах используемой Вами абонентской станции с целью дальнейшего предоставления совместимых приложений или ссылок на совместимые приложения.
  • Стоимость составляет 1062 рублей
  • … необходимо обратиться в Службу поддержки Абонентов по почте: me.s.mobile@gmail.com.


И после всех этих Правил есть кнопка далее, нажатие по которой перекинет жертву на payed.html, где ее ждет ссылка на filesesa.net

По whois узнаем, что домен flashplayer-ru.net был создан 22.06.2012, а filesesa.net — 4 сентября. Остальное все совпадает

Domain Name: FILESESA.NET
Registrar: INTERNET.BS CORP.
Whois Server: whois.internet.bs
Referral URL: www.internet.bs
Name Server: NS3.SUPERIDNS.NET
Name Server: NS4.SUPERIDNS.NET
Status: ok
Updated Date: 04-sep-2012
Creation Date: 04-sep-2012
Expiration Date: 04-sep-2013


Дальше я зашел на сайт регистратора (bs — это Багамские Острова) и пообщался с девушкой-техсуппортом, которая посоветовала отправить сообщение в abuse на электропочту abuse@internet.bs.

Написав в abuse, я продолжил копать. В распакованном архиве были еще файлы smali. Но погуглив на тему реверсинга из .smali в .java, я решил вернуться к исходному архиву APK. Распаковав apk-шку простым 7-zip'ом я обнаружил там classes.dex.

Дальше в дело вступил dex2jar



А затем и JD-GUI, который дал мне код:


Похоже на то, что код сильно обфусцирован. Я пока не до конца разобрался с тем как именно вызываются веб-страницы, но запустив вирус на эмуляторе, я могу сказать, что он запускается сразу после ребута и сразу падает.

Полученный код я выложил на сайт нашей лаборатории: virtalabs.net/apkHack/flash-player.src.zip

Сам APK можно найти там же: virtalabs.net/apkHack/flash_player_installer.apk

А распакованная папка здесь: virtalabs.net/apkHack/FlashPlayer

Сейчас жду реакции от регистратора. Так как сайты сделаны на русском языке для СНГшной аудитории (что видно по пользовательскому соглашению, как минимум), стоит ли отправлять рез-ты реверсинга в отдел К?

Надеюсь эта статья вызовет интерес в android-сообществе и кого-нибудь убережет от установки такого типа вирусов.

И как я обещал ссылки на использованные программы:

APKtool — code.google.com/p/android-apktool

Dex2Jar — code.google.com/p/dex2jar

JD-Gui — java.decompiler.free.fr/?q=jdgui

У JD-Gui есть версия под Eclipse IDE (http://java.decompiler.free.fr/?q=jdeclipse ) — но у меня не получилось её установить из-за проблем с сайтом JD.

Также огромную пользу мне принесла статья Кена Киндера (Ken Kinder): kkinder.com/2011/11/27/so-you-want-to-reverse-engineer-an-android-app-apk
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 18
  • –6
    virus for android, copyright © dr.web?
    • 0
      В 99,9% случаев помогает галочка — устанавливать приложения только с маркета. За исследование отдельный зачет.
      • 0
        Спасибо за разбор.
        Я так понимаю, что лучше не ставить приложения НЕ из google play?
        • +2
          Да, как было отмечено выше это поможет пользователю почти во всех случаях. Но разработчику (или другу разработчика) иногда приходится снимать галочку, чтобы поставить свое приложение, еще не доросшее до уровня Google Play, на живое устройство.
        • +1
          А имя операторов, которые такие премиум номера согласовывает можно озвучить?
          • 0
            Сами короткие номера здесь: infomobiles.net/oferta.php

            Кто согласовывает номера и кто получает прибыль от этого я не знаю, да и вряд ли это можно узнать без юридического основания на получение такого рода инфы.

            Хотя скорее всего ОпСоСы тоже «в доле».
            • +1
              не скорее всего, а точно:
              ОпСоСы получают от 40 до 60 процентов украденных мошенниками денег, ведь кроме них доступа к балансу вашего счёта для списания денег не имеет никто
          • +2
            Доступ к будильнику нужен для того, чтобы иметь возможность запустить в фоне сервис трояна после рестарта системы.
            • +1
              RECEIVE_BOOT_COMPLETED же.
              • –1
                Да, не правильно выразился в предыдущем комменте. При помощи будильника можно периодически возобновлять работу сервиса.
              • +1
                Или разбудить в воскресенье в 6 утра с просьбой оплатить Flash Player.
                • 0
                  Если не трудно, расскажите как именно используется будильник для запуска сервиса в фоне, даже если будильник выключен.
                  Сильно подозреваю, что SET ALARM позволяет ставить будильник незаметно от пользователя (чтобы будильник было не видно в списке). Или я ошибаюсь?

                  Просто интересен механизм, ради знаний конечно. Использовать во вред я это не буду.
                  • 0
                    Будильник можно использовать для выполнения периодических действий на устройстве. Я, например, периодически аплоадил изменения, внесенные пользователем в моем приложении, на сервер. Таким образом была возможность в фоне синхронизировать девайс с сервером.

                    Как использовать этот механизм хорошо описано в этом ответе.
                    • +2
                      Вы путаете AlarmClock — будильник и AlarmManager — для запланированного запуска чего либо.

                      SET_ALARM использует именно будильник, но не планировщик.
                      С виду сейчас оно ничего не делает, видимо поигрались ничего не получилось забыли убрать из списка.
                • 0
                  Отделу К сейчас Чичваркины интересны, а не за правдой гоняться.
                  • 0
                    Тогда куда посоветуете обратиться. Формально же состава преступления нет пока не установишь приложение и не используешь его.
                    Однако на SDK оно падает и не реализует вредоносный функционал, а живое устройство у меня одно и мне его жалко использовать для этого
                  • +2
                    29900 руб — это, скорее всего, для Беларуси…
                    • 0
                      ну если человек умудрился стать жертвой вируса на андроид — этот человек идиот. такие должны страдать. больше вирусов!

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