Pull to refresh

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

Reading time 5 min
Views 40K
Я 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
Tags:
Hubs:
+27
Comments 18
Comments Comments 18

Articles