R0 CREW

Android malware analysis

Оригинал: resources.infosecinstitute.com

Intro

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

На данный момент OS Android подвергается наиболее пристальному вниманию со стороны вирусописателей и уже превзошла по этому показателю OS Symbian, которая до этого была основной целью разработчиков вредоносного программного обеспечения. Быстрый рост вредоносов нацеленных на Android говорит о том, что платформа становится ключевой целью киберкриминала (Источник).

Почему это происходит? Android является открытой платформой с Java-based приложениями. В отличии от iPhone OS, для разработки приложений под которую, требуется войти «в программу разработки» (developers program) и внести начальную плату, только для того чтобы начать. С Adndroid приложениями все намного проще, нужно просто скачать Android SDK, которое доступно любому желающему, и просто начать. Так же Android разработчику не нужно передавать свое приложения кому-либо для проверки, если он, конечного же, не собирается размещаться его в Android маркете. Все что ему нужно, для распространения своего приложения, это веб-сервер и ссылка на приложение.

Анализ вредоносных образцов

В общем целом существует два метода анализа зловредов, а именно динамический и статический. Во время динамического анализа проверяется поведение приложения, для этого малварь запускают на тестовой системе. В большинстве случаев для этого используют виртуальные машины/устройства или песочницы (sandbox). Сам же анализ заключается в простом запуске приложения и просмотре сетевых и системных логово во время выполнения зловреда. С другой стороны, во время статического анализа нужно разобрать приложение с помощью инструментов реверс инженеринга и используя определенные навыки воссоздать действительный код и алгоритм, который был заложен в программу. Оба метода имеют свои плюсы и минусы. Выбор того или иного зависит исключительно от решения и опыта аналитика. В большинстве случаев динамический анализ предоставит результаты намного быстрее, чем статический, не смотря на то, что некоторые вещи могут быть упущены, хотя и легко определяются во время статического анализа.

Инструменты для анализа зловредов

Для тех кто хочет начать или получить опыт, в реверсинге вредоносов под Android, существует несколько доступных инструментов призванных облегчить данный процесс. Разделим инструменты исходя из метода анализа:

Для динамического анализа доступны следующие инструменты:

  • Droidbox: Песочница (sandbox) для динамического анализа Android приложений. Использует: предварительную статическую проверку, динамический анализ и мониторинг API вызовов.

Сайт: http://code.google.com/p/droidbox/

  • Android SDK: Комплект разработки программного обеспечения для создания приложений под платформу Android. Android SDK включает примеры проектов с исходным кодом, средства разработки, эмулятор и необходимые библиотеки для создания Android приложений. Приложения используют язык Java и запускаются на виртуальной машине Dalvik, которая работает поверх ядра Linux. Используя Android SDK можно создать виртуальное Android устройство практически идентичное по функциональности и возможностям настоящему телефону. Используя это виртуальное устройство мы можем выполнять и наблюдать за вредоносным программным обеспечением внутри безопасной среды.

Сайт: http://developer.android.com/sdk/index.html

  • androidAuditTools: Еще один инструмент для динамического анализа.

Сайт: https://github.com/wuntee/androidAuditTools

Для статического анализа доступны следующие инструменты:

  • Mobile Sandbox: веб-сервис с простым интерфейсом, который осуществляет статический анализ образов малвари.

Сайт: http://www.mobile-sandbox.com

  • IDA pro версии 6.1 и выше. IDA Pro дизассемблер всех времен и народов. Поддерживает байт-код Android начиная с профессиональной версии 6.1 и выше.

Сайт: http://www.hex-rays.com/products/ida/6.1/index.shtml

  • APKInspector: Мощный графический инструмент для анализа Android приложений.

Сайт: http://code.google.com/p/apkinspector/

  • Dex2jar: Инструмент для конвертирования .dex файлов андроида в Java-классы .class

Сайт: http://code.google.com/p/dex2jar/

  • Jd-gui: Представляет отдельную графическую утилиту, которая отображает исходный код Java файлов .class. Вы можете просматривать восстановленный исходный код с помощью JD-GUI для прямого доступа к методам.

Сайт: http://java.decompiler.free.fr/?q=jdgui

  • Androguard: Инструмент для реверсинга и исследования вредоносных приложений под Android.

Сайт: http://code.google.com/p/androguard/

  • JAD: Декомпилятор Java.

Сайт: http://www.varaneckas.com/jad

  • Dexdump: Java декомпилятор .dex файлов.

Сайт: http://code.google.com/p/dex-decomplier/

  • Smali: smali/baksmali является ассемблером/дизассемблером для файлов .dex используемых виртуальной машиной Dalvik. Основан на синтаксисе Jasmin/dedexer и поддерживает полную функциональность dex-формата (аннотацию, отладочную информацию, строковую информацию, etc)

Сайт: http://code.google.com/p/smali/

В большинстве случае, для анализа вредоносного программного обеспечения, я использую следующие инструменты (которые вам нужно будет у себя воссоздать):

  • VMware. Желательно запущенная под Линуксом. Вы можете использовать любой дистрибутив, с которым вы знакомы. Я использую дистрибутив базирующийся на системе Debian, ввиду простого управления пакетами.
  • Android SDK установленный в системе.

Начнем с установки Android SDK, просто скачайте нужные файлы из http://developer.android.com/sdk/index.html (в моем случае это: android-sdk_r13-linux_x86.tgz) и распакуйте содержимое архива. Место распаковки не имеет никакого значения, просто выберите то место, которое вы запомните.

В пакете есть несколько отсутствующих инструментов, которые будут нужны вам для того чтобы продолжить, поэтому откройте терминал и используйте команду «cd» для перехода в папку, куда вы извлекли файлы, после чего используйте следующую команду:

Рис. 1. Обновление инструментов Android для того, чтобы запустить Android SDK.

Эта команда осуществит процедуру обновления Android SDK и AVD Manager. Выберите все опции и установите их (install), наиболее важными являются Platform-tools, они могут понадобиться вам для эмуляции различных устройств в будущем.

The malware

Одним из самых пресловутых вредоносов, который появился в Android OS, является DroidDream. DroidDream был включен в приложения, которые казались легальными, и которые были размещены в Android Market. Приложения, вероятно, были созданы тремя разными разработчиками под именами: Myournet, Kingmall2010 и we20090202, и хотя Google быстро удалил их, приблизительная оценка установок колеблется в пределах от 50 до 200 тысяч (Источник).

В нашем случае мы рассмотрим один из вариантов этой малвари, названной DroidDreamLight. На момент исследования эта разновидность имела низкий уровень обнаружения антивирусами перечисленными на VirusTotal. Сам образец был найден в Китайском маркете. Для получения копии вредоноса, мы можем воспользоваться блогом contagio, по следующему адресу:

http://contagiominidump.blogspot.com/2011/09/droiddreamlight-new-variant-found-in.html

Все варианты DroidDream скрывают свое присутствие либо создавая не видимую для пользователя службу (service) в системе, либо просят выполнить себя в ручную, после чего размещаются первыми в списке выполнения в AndroidManifest.xml.

APK пакеты, по сути, являются JAR файлами, которые можно без проблем распаковать с помощью большинства архиваторов (прим. пер. например, с помощью WinRar). Распаковка нашего файла, com.button.phone_91595200_0.apk даст нам следующую структуру каталогов:

Рис. 2

Как мы можем видеть, содержимое каталога состоит из следующих элементов:

  • Каталог META-INF, в котором размещены три файла: файл манифеста MANIFEST.MF, сертификат приложения CERT.RSA и файл CERT.SF, в котором перечислены ресурсы с их месторасположением и хэшем RSA-1.
  • Каталог «res» – это каталог, где можно найти все ресурсы используемые приложением.
  • В каталоге «asserts» обычно находятся изображения и иконки для приложения.
  • В корневом каталоге имеется такие файлы как: AndroidManifest.xml (обязательный второй файл манифеста для приложения, описывающий имя, версию, права доступа, связи с библиотеками), classes.dex содержит классы скомпилированные для виртуальной машины Dalvik, resource.arcs содержит бинарное представление ресурсов, после того как они были скомпилированы.

Описание других определений можно посмотреть по следующему адресу:

http://developer.android.com/guide/appendix/glossary.html

Нужно помнить, что некоторые файлы все еще остаются упакованными (compressed), например, AndroidManifest.xml не является текстовым файлом. Для того, чтобы его распаковать, нам нужно воспользоваться AXMLPrinter2.jar (прим. пер. используйте для этих целей «apktool» и будет вам счастье), который можно найти по следующему адресу:

http://code.google.com/p/android4me/

Используя AXMLPrinter2.jar мы можем распаковать манифест и сохранить его в отдельный файл.

Рис. 3

Используйте для этого следующую команду:

java –jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.xml.clean

На данный момент AndroidManifest.xml (прим. пер. имеется ввиду AndroidManifest.xml.clean) является текстовым файлом и мы можем посмотреть его содержимое.

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest
    xmlns:android=”http://schemas.android.com/apk/res/android”
    android:versionCode=”4″
    android:versionName=”1.3″
    package=”com.button.phone”
    >
    <uses-sdk
        android:minSdkVersion=”6″
        >
    </uses-sdk>
    <uses-permission
        android:name=”android.permission.INTERNET”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.CHANGE_WIFI_STATE”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.CHANGE_NETWORK_STATE”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.ACCESS_WIFI_STATE”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.ACCESS_NETWORK_STATE”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.BLUETOOTH”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.BLUETOOTH_ADMIN”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.WRITE_SETTINGS”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.READ_PHONE_STATE”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.ACCESS_FINE_LOCATION”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.GET_ACCOUNTS”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.WRITE_SYNC_SETTINGS”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.READ_SYNC_SETTINGS”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.RECEIVE_BOOT_COMPLETED”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.INTERNET”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.READ_PHONE_STATE”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.RECEIVE_BOOT_COMPLETED”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.ACCESS_NETWORK_STATE”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.READ_CONTACTS”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.READ_SMS”
        >
    </uses-permission>
    <uses-permission
        android:name=”android.permission.GET_ACCOUNTS”
        >
    </uses-permission>
    <application
        android:label=”@7F060001″
        android:icon=”@7F020009″
        >
        <activity
            android:label=”@7F060001″
            android:name=”.Switcher”
            android:launchMode=”1″
            >
            <intent-filter
                >
                <action
                    android:name=”android.intent.action.MAIN”
                    >
                </action>
                <category
                    android:name=”android.intent.category.LAUNCHER”
                    >
                </category>
            </intent-filter>
        </activity>
        <activity
            android:name=”com.google.ads.AdActivity”
            android:configChanges=”0x000000B0″
            >
        </activity>
        <activity
            android:label=”@7F060032″
            android:name=”.Setting”
            >
        </activity>
        <receiver
            android:name=”.Receiver”
            >
            <intent-filter
                >
                <action
                    android:name=”android.intent.action.BOOT_COMPLETED”
                    >
                </action>
            </intent-filter>
        </receiver>
        <receiver
            android:name=”.strategy.core.RebirthReceiver”
            >
            <intent-filter
                >
                <action
                    android:name=”android.intent.action.BOOT_COMPLETED”
                    >
                </action>
                <action
                    android:name=”android.intent.action.PHONE_STATE”
                    >
                </action>
                <category
                    android:name=”android.intent.category.DEFAULT”
                    >
                </category>
            </intent-filter>
        </receiver>
        [COLOR="red"]<service
            android:name=”.strategy.service.CelebrateService”
            >
        </service>[/COLOR]
    </application>
</manifest>

Некоторые вещи, которые мы можем легко определить как подозрительные, требуют прав доступа, которые нужны приложению для работы в следующих областях связанных:

  • SMS-собщениями.
  • Сетью.
  • Манипулированием состоянием телефона или каталогом учетных записей.
  • Запуском службы (service) в фоновом режиме.

То, что мы видим в AndroidManifest.xml часто встречается в файлах зараженных вредоносным программным обеспечением, где помимо описания разрешений для легитимного приложения, также имеется дополнительный пакет службы (service), который размещен в месте невидимом для пользователя.

Получить больше информации о разрешениях можно по следующему адресу:

http://developer.android.com/reference/android/Manifest.permission.html

Прежде чем продолжать процесс реверсинга, давайте взглянем на то, как работает приложение, когда оно запущено на телефоне.

Для этого нам нужно создать виртуальное устройство, используя менеджер управления устройствами из Android SDK. Для его запуска воспользуйтесь следующей командой:

your_path_android_sdk/tools/android

После чего возникнет графический интерфейс, в котором нужно открыть окно для создания нового устройства:

Рис. 4

И заполнить его соответствующей информацией:

Рис. 5

Вполне возможно, что вам придется загружать ваше устройство много раз, поэтому, ввиду того, что как вы наверное знаете, загрузка виртуальной машины может занимать много времени, то лучшим решением этой проблемы, будет включение опции «Snaphot».

Нажатие на кнопку «Create ADV», создаст виртуальную машину. Теперь мы готовы запустить систему. Нажав на кнопку start мы инициализируем этот процесс. Если это первый раз, когда вы загружаете устройство, то процесс запуска системы может занять несколько минут. Когда она запустится вы должны увидеть следующий экран:

Рис. 6

Установка приложения в виртуальной машине происходит довольно просто. Для этого используются инструменты из Android SDK. Все что нужно сделать, это открыть терминал и перейти в каталог с инструментами из SDK пакета. Далее использовать команду adb, которая поможет в установке. Сначала нам нужно убедиться, что сервер взаимодействия (communication server) запущен, выполнив команду:

./adb start-server

А затем команду:

./adb push package.apk

Рис. 7

Как определено в файле AndroidManifest.xml именем приложения является «Switcher», что мы собственно и можем видеть в левом верхнем углу виртуального устройства.

Интересно заметить, что при попытке запуска приложения под виртуальной машиной оно отказывается работать.

Рис. 8

Но давайте посмотрим, что же на самом деле выполняется на системе. Для доступа к командной строке нашего устройства можно использовать команду adb с параметром shell, например, так:

./adb shell

Рис. 9

Сейчас командная строка находится внутри виртуального телефона, с помощью выполнения команды ps мы можем обнаружить, что наш засранец все же выполняется.

Рис. 10

Для того, чтобы узнать больше информации о поведении исследуемой программы, нам нужно будет проанализировать ее бинарный код, расположенный в файле classes.dex. Как было описано выше, есть два метода, с помощью которых можно выполнить анализ и для каждого из них мы имеем различные инструменты. Все эти инструменты дадут хорошие результаты в процессе реверсинга приложения, и это всего лишь вопрос предпочтений, с каким инструментом вы будете чувствовать себя более уверенно.

Для статического анализа мы будем использовать baksmali, копию которого можно взять отсюда:

http://smali.googlecode.com/files/baksmali-1.2.8.jar

baksmali может декомпилировать файл classes.dex в читаемый формат:

Рис. 11

После декомпиляции, содержимое файла classes.dex, будет находиться в директории с именем «out».

Рис. 12

Файлы, которые нас интересуют, размещены в папке «out/com/button/phone/», а если конкретно, то это основной файл «Switcher.smali» и файлы службы «celebrate».

To view the files we can use any type of text editor. Looking at Switcher.smali text file, as expected there is nothing that seems out of order. The program is supposed to look for the connections and manage the state of them. You can use Switcher to toggle off/on your gps/Bluetooth/wifi/audio. An actual picture of what the user will have to see, is the following:

Для просмотра файлов мы можем использовать любой текстовый редактор. Как и ожидалось, просмотрев текс файла Switcher.smali, не было обнаружено ничего подозрительного. Программа предназначена для поиска соединений и управления их состоянием. Вы можете использовать Switcher для переключения off/on вашего GPS/Bluetooth/WiFi/Audio. Реальную картину того, что будет видеть пользователь на своем телефоне, показано ниже:

Рис. 13

Приложение: http://m.anzhi.com/app.php?type=info&softid=46080

Код из Switcher.smali:

# static fields

.field public static handler:Landroid/os/Handler;

# instance fields
.field private airBtn:Landroid/widget/ToggleButton;
.field private airTV:Landroid/widget/TextView;
.field private blueBtn:Landroid/widget/ToggleButton;
.field private blueTV:Landroid/widget/TextView;
.field private connectManager:Landroid/net/ConnectivityManager;
.field private gprsTV:Landroid/widget/TextView;
.field private gpsBtn:Landroid/widget/ToggleButton;
.field private gpsTV:Landroid/widget/TextView;
…

Смотря на код программы, никто не найдет ничего такого, что может представлять угрозу для системы, за исключением того, что когда программа создана, есть второй экземпляр, который вызывает вредоносный сервис (service).

Продолжение листинга (line 1462 of Switcher.smali):

.method public onCreate(Landroid/os/Bundle;)V
.registers 16
.parameter “savedInstanceState”
.prologue

.line 140
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

.line 141
const/high16 v11, 0x7f03
invoke-virtual {p0, v11}, Lcom/button/phone/Switcher;->setContentView(I)V

.line 143
invoke-direct {p0}, Lcom/button/phone/Switcher;->showNotify()V

.line 145
const-string v6, “DDH#X%LT”

.line 146
.local v6, key:Ljava/lang/String;
[COLOR="red"]new-instance v5, Landroid/content/Intent;
const-class v11, Lcom/button/phone/strategy/service/CelebrateService;
invoke-direct {v5, p0, v11}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V[/COLOR]

.line 147
.local v5, i:Landroid/content/Intent;
invoke-virtual {p0, v5}, Lcom/button/phone/Switcher;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;

.line 151
new-instance v11, Lcom/button/phone/NetworkStateReceiver;
…

Как мы можем видеть, в нутрии каталога phone/strategy/ лежит сервис, который выполняется в фоновом режиме, после установки программы. Структура этого каталога представлена ниже:

.
[COLOR="blue"]├── NetworkStateReceiver.smali
├── R$array.smali
├── R$attr.smali
├── R$drawable.smali
├── Receiver.smali
├── R$id.smali
├── R$layout.smali
├── R.smali
├── R$string.smali
├── R$styleable.smali
├── Setting.smali # Actual program files.[/COLOR]
├── strategy
│   ├── constant
│   │   └── [COLOR="red"]Constant.smali             # Constant values of filenames used[/COLOR]
│   ├── core
│   │   ├── ContactSmsHandler.smali    1. Handling SMS messages, reading and saving them
│   │   ├── RebirthReceiver.smali         2. Checking if boot state is completed to run the service
│   │   ├── SmsTask$MyTimerTask.smali    # Files used for SmsTask
│   │   ├── SmsTask.smali             3. Sms gathering using scheduled tasks and DES encryption
│   │   └── SmsTask$Task.smali        # Files used for SmsTask
│   ├── net
│   │   ├── DomParse.smali        # Handing xml files
│   │   ├── HttpHandler$1.smali        # Files used for HttpHandler
│   │   ├── HttpHandler$2.smali
│   │   ├── HttpHandler$3.smali
│   │   ├── HttpHandler.smali        4. Handle http requests, bypassing proxy by reading mobile configuration and uploading files using POST.
│   │   ├── ResponseHandler.smali        5. Handling responses from http requests, package management features
│   │   ├── TransactionService.smali    6. Handle the commands and content coming from the HttpHandler
│   │   ├── Transaction.smali        # Handling exceptions during transaction requests.
│   │   ├── UploadFile.smali        7. Handling the upload of files to remote servers, encrypting and compressing.
│   │   ├── WriteXML$AttrPair.smali     # XML parsing
│   │   └── WriteXML.smali            # Functions used to generate xml format of the contents
│   ├── service
│   │   ├── AppManager.smali        8. Functions to handle package management
│   │   ├── CelebrateService$1.smali    # Files included at CelebrateService
│   │   ├── CelebrateService$2$1$1.smali
│   │   ├── CelebrateService$2$1.smali
│   │   ├── CelebrateService$2.smali
│   │   ├── CelebrateService$3.smali
│   │   ├── CelebrateService.smali        9. The background service
│   │   └── Tools.smali            10. Handling the configuration and updating sense.tcd configuration file.
│   ├── SimpleDDServerActivity.smali    # Service instance
│   └── util
│   ├── Base64$1.smali            # Includes from Base64
│   ├── Base64$InputStream.smali
│   ├── Base64$OutputStream.smali
│   ├── Base64.smali            11. Base64 encoding for http transport
│   ├── DesPlus.smali            12. DES encryption for data
│   └── ZipFile.smali            # Compression
[COLOR="blue"]├── Switcher$1.smali            # Switcher application includes
├── Switcher$2.smali
├── Switcher.smali                # Application
└── Utils.smali[/COLOR]

Приложение после установки в системе, начинает установку службы, которая выполняется после загрузки устройства. Эта служба умеет читать: конфигурацию устройства, SMS-сообщения, адресную книгу и IMEI. Помимо этого она имеет возможность загружать эту информацию в сжатом или зашифрованном формате используя для этого ключ шифрования «DDH#X%LT», который хранится в файле DesPlus. Так же в файле Constant мы можем видеть ссылки на сообщения об ошибках, например:

ПРИМЕЧАНИЕ: В исходном коде приложения доминирует Китайский язык

Line 15 CelebrateService
.field public static final download_failed_zh:Ljava/lang/String; = “\u4e0b\u8f7d\u5931\u8d25″
UTF-8 Encoded version of 下 载失败 translated as “Download failure”

Исходя из языка (используемого внутри исходного кода), интерфейса и того факта, что этот вредонос был вначале размещен в Китайском Android Market, можно с уверенностью предположить, что это приложение разработано Китайскими разработчиками, целью которых было получение доступа к местному рынку.

Отличия в коде между различными вариантами DroidDream – частичны. Основной вызов службы имеет следующий вид:

# virtual methods
.method public onBind(Landroid/content/Intent;)Landroid/os/IBinder;
.registers 3
.parameter “intent”
.prologue

.line 53
const/4 v0, 0×0
return-object v0 @Override     public IBinder onBind(Intent intent) {         return mBinder;     }

Во время создания службы, вещи становятся более интересными:

.method public onCreate()V
.registers 9
.prologue
const/4 v7, 0×0

.line 108
invoke-super {p0}, Landroid/app/Service;->onCreate()V

.line 109
iput-object p0, p0, Lcom/button/phone/strategy/service/CelebrateService;->mCtx:Landroid/content/Context;

.line 118
iget-object v1, p0, Lcom/button/phone/strategy/service/CelebrateService;->mCtx:Landroid/content/Context;
invoke-static {v1}, Lcom/button/phone/strategy/service/Tools;->cpConfigFile(Landroid/content/Context;)V

Служба начинает собирать информацию о системе и создает конфигурационный файл «sense.tcd», этот код расположен в файле Tools:

.method public static cpConfigFile(Landroid/content/Context;)V
.registers 4
.parameter “ctx”
.prologue

.line 374
new-instance v0, Ljava/io/File;
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {p0}, Landroid/content/Context;->getFilesDir()Ljava/io/File;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, “/”
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, “sense.tcd”
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V

.line 375
.local v0, f:Ljava/io/File;
if-eqz v0, :cond_2a
invoke-virtual {v0}, Ljava/io/File;->exists()Z
move-result v1
if-nez v1, :cond_31

.line 376
:cond_2a
const-string v1, “sense.tcd”
const-string v2, “sense.tcd”
invoke-static {p0, v1, v2}, Lcom/button/phone/strategy/service/Tools;->getRawResource(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Z

.line 378
:cond_31
return-void
.end method

Если кто интересуется, то из файла Tools можно получить больше информации о возможностях и функциях малвари, например, служба может выполнять следующие действия:

  • createInboxSms: создает SMS-сообщение;
  • createNewSu – монтирует файловую систему как для чтения, так и для записи, чтобы скопировать пакет используя команду cat;
  • filterXMLStringValue – для парсинга конфигурационных XML-файлов, которые созданы для загрузки контента;
  • getApnProxy – для получения информации о соединениях;
  • getCellId – для получения информации о системе;
  • getConfig – для получения приватной информации из конфигурационного файла «sense.tcd»;
  • getCurrentApn – для получения текущей APN (Access Point Name, Имя точки доступа);
  • getDDPackageName – для получения загруженных пакетов из внутреннего конфигурационного файла;
  • getFeedProxys – приложение в этой точке вызывает функцию getVector для чтения «sense.tcd», для того чтобы найти IP-адрес для транзакций;
  • getFormatTime – для получения формата времени (time format);
  • getIMEI – для чтения IMEI-телефона;
  • getIMSI – для чтения IMSI;
  • getLAC – для чтения LAC (Location Area Code) телефона;
  • getMilliSecondByHourAndMins – для получения точного времени;
  • getNextFeedbackTime – считывает конфигурацию, чтобы получить время для следующей синхронизации данных;
  • getNextSmsTaskTime – получает время для запланированной SMS задачи, согласно внутренней конфигурации;
  • getRandomIndex – возвращает случайное число, для использования в шифровании;
  • getRawResource – общая функция для чтения/записи содержимого;
  • getRootFileName – получает RName5 записи из внутреннего конфигурационного файла;
  • getSMSC – для получения списков sms контактов;
  • getStringByCalendar – для получения даты и месяца;
  • getTaskProxys – для получения адреса серверов из «sense.tcd», которые используются для управления задачами;
  • getUID – для получения user id;
  • getUploadProxys – возвращает адреса серверов, которые используются для загрузки содержимого устройства;
  • getUploadUrl – создает URL формат, который используется для отправки данных. Имеет примерно следующий вид:

http://SERVERIP/p??PhoneType=TYPE&Version=VERSION &PhoneImei=IMEI &PhoneImsi=IMSI”

  • getVector – парсит конфигурационный файл;
  • installPackage – устанавливает пакеты из /system/app;
  • isPackageInstalled – проверяет существование пактов в системе;
  • rootFileExist – проверяет существование фейкового su в папке /system/bin;
  • runRootCommand – для выполнения команды в системе;
  • saveConfig – используется для создания senset.tcd зашифрованного алгоритмом шифрования DES.
  • saveDDPackageName – сохраняет список внутренних пакетов.
  • saveFeedProxys – обновляет список серверов.
  • saveNextFeedbackTime – используется для сохранения времени следующего сеанса связи.
  • saveNextSmsTaskTime, saveRootFileName, saveTaskProxys, saveUploadProxys, saveVector – используются для сохранения конфигурационных данных в sense.tcd
  • sendSms – для создания sms-сообщений
  • uninstallPackage – calling pm uninstall, для удаления пакета.

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

Служба, через равные промежутки времени, которые установлены в конфигурационном файле и которые обновляются через командные сервера, устанавливает расписание (schedule) для сбора SMS-контактов и информации об учетной записи. На данный момент, малвари, необходимо взаимодействовать с пользователем и производить начальную установку пакета. Я верю, что не далеко то время, когда мы увидим вредоносов имеющих p2p-возможности, которые будут взаимодействовать с другими устройствами в сети, делая мобильный ботнет мощным инструментом. Большинство из нас привыкли к мысли о существовании компьютерных вирусов. Вредоносное программное обеспечение пытается воровать контент, корпоративные файлы, информацию о банковских аккаунтах и персональные данные. Вредоносное программное обеспечение на мобильных телефонах сможет выполнять все эти функции, а также прослушивать наши частные беседы, которые до сих про считаются приватными, и читать наши SMS-сообщения.

Ниже представлена общая информация о рассмотренном вредоносе, а так же некоторые части кода выбранные из его исходных файлов.

Имена файлов, которые используются зловредом и могут быть найдены в устройстве:

CALLLOG_FILENAME:Ljava/lang/String; = “calllog8″ # Saved call log with duration
CALLLOG_ZIP_FILENAME:Ljava/lang/String; = “calllog_zip7″ # Save name catalog list
CONTACT_FILENAME:Ljava/lang/String; = “contact7″ # Save name for the contacts
CONTACT_ZIP_FILENAME:Ljava/lang/String; = “contact_zip4″ # Save name for the compressed catalogue
DD_CONFIG_DDPACKAGENAME:Ljava/lang/String; = “DDPackageName2″ # Configuration parameter, saved in sense.tcd
DD_CONFIG_FEEDPROXY:Ljava/lang/String; = “Feed3Proxy9″ # External server
DD_CONFIG_NAME:Ljava/lang/String; = “sense.tcd” # Configuration filename, encrypted with DES encryption
DD_CONFIG_NEXTFEEDBACKTIME:Ljava/lang/String; = “Next3Feedback8″ # Scheduled time for next communication
DD_CONFIG_NEXTTASKTIME:Ljava/lang/String; = “NextTask3″ # Scheduled time for next task
DD_CONFIG_ROOTNAME:Ljava/lang/String; = “RName5″
DD_CONFIG_TASKPROXY:Ljava/lang/String; = “Task3Proxy5″ # External server
DD_CONFIG_UPLOADPROXY:Ljava/lang/String; = “UploadProxy7″ # External server for content upload
DOWNLOAD_FILENAME:Ljava/lang/String; = “filename4″ # Packages
DOWNLOAD_URL:Ljava/lang/String; = “url4″ # URL for packages
Edition:Ljava/lang/String; = “3.2.1″ # Version
GOA_FILENAME:Ljava/lang/String; = “goa4″ # Google account information
GOA_ZIP_FILENAME:Ljava/lang/String; = “goa_zip5″ # Compressed account information
NOTIFY_DESCRIPTION:Ljava/lang/String; = “Description4″ # Package description
NOTIFY_PACKAGE:Ljava/lang/String; = “PackageName4″
SMSTASK:Ljava/lang/String; = “SMSTask2:” # SMS Task
SMSTASK_CONFIG_FILENAME:Ljava/lang/String; = “tsk9.dat” # Contents gathered from SMS gathering task

Некоторые части кода, выбранные из исходных файлов:

  1. Сбор SMS-данных в запланированное время (по расписанию):
.method public start()V
.registers 3
.prologue

.line 216
new-instance v0, Ljava/lang/Thread;
iget-object v1, p0, Lcom/button/phone/strategy/core/SmsTask;->smsTask:Lcom/button/phone/strategy/core/SmsTask;
invoke-direct {v0, v1}, Ljava/lang/Thread;-><init>(Ljava/lang/Runnable;)V
  1. Проверка состояния загрузки и запуск службы:
:cond_1a
iget-object v0, p0, Lcom/button/phone/strategy/core/RebirthReceiver;->mCtx:Landroid/content/Context;
new-instance v1, Landroid/content/Intent;
iget-object v2, p0, Lcom/button/phone/strategy/core/RebirthReceiver;->mCtx:Landroid/content/Context;
const-class v3, Lcom/button/phone/strategy/service/CelebrateService;
invoke-direct {v1, v2, v3}, Landroid/content/Intent;><init>(Landroid/content/Context;Ljava/lang/Class;)V
invoke-virtual {v0, v1}, Landroid/content/Context;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;
  1. Обработка SMS.
  2. Displaying the method uploadFile from httphandler:
.method public uploadFile([BLjava/net/URL;)I
.registers 5
.parameter “requestBytes”
.parameter “url”
.prologue

.line 162
invoke-virtual {p0, p2}, Lcom/button/phone/strategy/net/HttpHandler;->setUrl(Ljava/net/URL;)V

.line 163
invoke-virtual {p0, p1}, Lcom/button/phone/strategy/net/HttpHandler;->setRequestbytes([B)V

.line 164
const-string v1, “POST”
invoke-virtual {p0, v1}, Lcom/button/phone/strategy/net/HttpHandler;->setRequestMethos(Ljava/lang/String;)V

.line 165
const-string v1, “application/octet-stream”
invoke-virtual {p0, v1}, Lcom/button/phone/strategy/net/HttpHandler;->setContent_type(Ljava/lang/String;)V

.line 166
invoke-direct {p0}, Lcom/button/phone/strategy/net/HttpHandler;->connect()I
  1. Обработка запросов для обновления и управления пакетами:
.line 126
iget-object v9, p0, Lcom/button/phone/strategy/net/ResponseHandler;->downloadContent:Landroid/content/ContentValues;
const-string v10, “Description4″
invoke-virtual {v9, v10, v1}, Landroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/String;)V

.line 127
iget-object v9, p0, Lcom/button/phone/strategy/net/ResponseHandler;->downloadContent:Landroid/content/ContentValues;
const-string v10, “PackageName4″
invoke-virtual {v9, v10, v4}, Landroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/String;)V
  1. Обработка команд и зашифрованного контента приходящего от httphandler:
.method public handlerRawData([B)Ljava/lang/String;
.registers 7
.parameter “response”
.prologue

.line 229
const-string v1, “”

.line 231
.local v1, xml:Ljava/lang/String;
:try_start_2
new-instance v2, Ljava/lang/String;
const-string v3, “DES”
invoke-static {p1, v3}, Lcom/button/phone/strategy/util/DesPlus;->decrypt([BLjava/lang/String;)[B
move-result-object v3
const-string v4, “utf-8″
  1. Обработка таких файлов как SMS-каталоги, адресная книга, установленные пакеты:
.line 140
.local v1, calllogPath:Ljava/lang/String;
const-string v3, “calllog8″
invoke-virtual {p1, v3}, Lcom/button/phone/strategy/core/ContactSmsHandler;->creatCallLogFile(Ljava/lang/String;)Z
  1. Handling package management from packages that are pushed to the system
.method private downloadApp(Ljava/lang/String;Ljava/lang/String;)Z
.registers 11
.parameter “url”
.parameter “fileName”
  1. Фоновая служба работающая в устройстве ()
# direct methods
.method public constructor <init>()V
.registers 2
.prologue

.line 33
invoke-direct {p0}, Landroid/app/Service;-><init>()V

.line 56
new-instance v0, Lcom/button/phone/strategy/service/CelebrateService$1;
invoke-direct {v0, p0}, Lcom/button/phone/strategy/service/CelebrateService$1;-><init>(Lcom/button/phone/strategy/service/CelebrateService;)V
iput-object v0, p0, Lcom/button/phone/strategy/service/CelebrateService;->handler:Landroid/os/Handler;
  1. Чтение/запись в конфигурационный файл «sense.tcd»
.method public static getIMEI(Landroid/content/Context;)Ljava/lang/String;
.registers 3
.parameter “context”
.prologue
.line 169
const-string v1, “phone”
  1. Кодирование в Base64
  2. DES шифрование с заданным ключом
.field public static final PASSWORD_CRYPT_KEY:Ljava/lang/String; = “DDH#X%LT”

© Translated by Prosper-H from r0 Crew

Prosper-H, я уже не успеваю “Спасибо” ставить. Столько переводов! =)

Та я бы рад и больше, но траблы постоянно возникают какие-то…