Я 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" />
Отслеживая это событие, от сразу выполняет себя после сразу после загрузки.
Также вирус отслеживает:
- Подключение/отключение от сети:
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
- Присланные 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 с значением:
<string name="app_name">Loading</string>
Самое интересное было в папке 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 (очень часто распространяемую через AdBlock в приложениях).
По нажатию кнопки далее срабатывает сценарий JS, который делает редирект на payed.html
Еще в white.html есть скрытый див: с захардкоденной ссылкой:
<strong>Ваша ссылка:</strong> <br clear="all"><b>http://yerc1.net/?u=64504</b>.</p>
На странице payed.html ссылка другая:
<p><strong>Ваша ссылка:</strong> <br clear="all"><b>http://filesesa.net/?u=90-656jc5y9ny1yc2fb0d</b>.</p>
Страница sendcontacts.html просто содержит редирект на payed.html
Самая интересная страница это test.html.
Там активно используется JS c jQuery.
Алгоритм такой:
- Сначала показывается иконка и надпись: «Подождите идет установка.»
- Дальше с помощью JS вычисляется случайный timeout
timeout = Math.floor((Math.random()*100)+1) + Math.floor((Math.random()*100)+1);
Юзеру при этом показывается фейковый progressbar - По окончанию ожидания вычисляется условие:
(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: http://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/
Автор: cyberorg