- 3.1: ‟Обратная разработка”
- 3.2: ‟Компоненты Android приложения”
- 3.3: ‟Анализ вызовов API”
- 3.4: ‟Анализ прав”
- 3.5: ‟Анализ кода”
Утилита / Инструмент | Пример вызова | Действие |
---|---|---|
strings | strings <путь> |
Выводит строковые данные |
nm | Выводит таблицу символов исполняемого файла | |
keytool [🔗] | keytool -printcert -v -file *.RSA > certificate.txt |
Встроена в JDK; Выводит информацию о сертификатах |
SmaliSCA [🔗] | smalisca> sc -c class_name -p <паттерн> -r 10 |
Выводит информацию о Smali файлах |
Maldrolyzer [🔗] | python maldrolyzer.py <путь> |
Извлекает любопытные данные (телефонные номера, ...) |
APKiD [🔗] | apkid <путь> |
Идентифицирует компиляторы, упаковщики и обфускаторы, использованные при создании APK |
dex2jar [🔗] | sh d2j-dex2jar.sh "<путь>" |
Превращает .dex / .apk файлы в код на Java |
jadx [🔗] | sh d2j-dex2jar.sh "<путь>" |
Превращает .dex / .apk файлы в код на Java |
JD-GUI | - | Предоставляет графический интерфейс для просмотра исходного кода |
Bytecode Viewer [🔗] | - | Предоставляет графический интерфейс для декомпиляции приложений, просмотра ресурсов APK и байт-кода |
APKTool [🔗] | apktool d <название>.apk |
Распаковывает и запаковывает обратно APK |
Androguard [🔗] | androguard analyze <путь> |
Декомпилирует, дизассемблирует, выводит фингерпринты сертификатов, графы вызовов, ... |
Angr [🔗] | Python: import angr |
Декомпилирует, дизассемблирует, анализирует поток выполнения, поддерживает символическое исполнение, ... |
APKLab [🔗] | - | Расширение для VS Code, совмещает в себе несколько инструментов; Распаковывает, декомпилирует, переподписывает, ... |
FlowDroid [🔗] | Выполняет taint-анализ приложения с учётом компонентов, контекста и флоу данных | |
radare2 [🔗] | r2 <путь>; /rafind2 -ZS <запрос> AndroidManifest.xml; /rabin2 -I <путь> |
Фреймворк для обратной разработки |
-
Декомпиляция APK онлайн: decompiler.com
-
Распаковка APK с помощью APKTool [ ]:
apktool d <название>.apk
-
Превращение файлов в исходный код на Java с помощью dex2jar [ ]:
-
Превращение файлов в исходный код на Java + просмотр реконструированного кода с помощью jadx [ ]
Составляющие распакованного Android приложения [🔗]:
- 📄 AndroidManifest.xml
[🔗]: – метаданные: имя пакета, запрашиваемые права, определения компонентов (Действий, Сервисов, Широковещательного приемника, Контент-провайдера), минимальная / максимальная поддерживаемые версии SDK, связанные библиотеки, ...;
- 📄 Build.gradle
: – автоматически генерируемый файл, который содержит: версию SDK для отладки и компиляции приложения compileSdkVersion
, версию SDK для запуска приложения targetSdkVersion
, versionCode
, versionName
, ...;
- 📄 classes.dex
: – байт-код Dalvik, представляющий скомпилированный Java / Kotlin код;
- 📁 META-INF
: – тут располагается сертификат;
- 📁 lib
: – нативные библиотеки, разделённые на подкатегории в зависимости от архитектуры CPU;
- 📁 assets
: – разные файлы, нужные приложению: дополнительные нативные библиотеки, .dex
файлы, ...; иногда используются во вредоносном ПО для сокрытия дополнительного кода;
- 📁 res/drawable
: – растровые файлы;
- 📁 res/layout
: – детали о пользовательском интерфейсе;
- 📁 res/values
: – содержит значения, таких как цветовые значения / строки / числа;
-
Специфичные для приложений ресурсы:
-
Класс
ContentResolver
[🔗]:- Позволяет производить действия над контент-провайдерами, направляет CRUD (create/read/update/delete) операции к подходящим контент-провайдерам
delete()
,insert()
, ...query()
– может быть использован для сбора чувствительной информации от контент-провайдеров других приложений, если они не защищены;- 🔗 Подробнее про риски
ContentResolver
-
Класс
Context
[🔗]:- Предоставляет информацию о классах и ресурсах
startService()
– может быть использован для фонового запуска сервиса без взаимодействия с пользователем;getFilesDir()
,openFileOutput()
, ... – могут быть использованы для действий над файлами;getApplicationInfo()
– может быть использован для получения информации о приложении (возможна ли отладка, установлен ли во внешнем хранилище, ...)
-
Класс
Intent
[🔗]:- Позволяет взаимодействовать с аппаратным обеспечением телефона, запускать сервисы и активности
setDataAndType()
– может быть использован для настройки URI и типа MIME у намерений;setFlags()
,addFlags()
– могут быть использованы для установки / добавления флагов к намерениям для указания способа их обработки (прим: для выдачи компоненту приоритет переднего плана);
-
-
Ресурсы фреймворков:
-
Класс
ActivityManager
[🔗]:- Позволяет взаимодействовать с другими активностями, запущенными на устройстве
getRunningServices()
– может быть использован для выявления запущенных сервисов (прим: антивирусов);getMemoryInfo()
– может быть использован для проверки объёма свободной памяти и того, насколько система близка к пределу, когда начнёт принудительно завершать процессы для освобождения памяти;restartPackage()
– может быть использован для завершения сервисов других приложений;
-
Класс
PackageManager
[🔗]:- Предоставляет информацию о пакетах, установленных на устройство
getInstalledPackages()
– может быть использован для выявления запущенных сервисов (прим: антивирусов);
-
Классы
Telephony/SmsManager
[🔗] /Telephony/gsm/SmsManager
[🔗]:- Методы класса могут быть использованы для взаимодействия с SMS
sendTextMessage()
– может быть использован для отправки SMS с заражённого устройства для траты денег пользователя;
// Примеры вредоносов: SpyEye, OpFake, Gemini
-
Класс
TelephonyManager
[[🔗]- Методы класса могут быть использованы для доступа к информации о сервисах телефонии на устройстве для составления "профиля пользователя"
getSubscriberId()
,getSimSerialNumber()
,getLine1Number()
,getNetworkOperator()
,getCellLocation()
,getDeviceId()
,getNetworkType()
, ...
// Примеры вредоносов: Ginmaster, Exodus
-
-
Ресурсы, относящиеся к DVM (Dalvik Virtual Machine):
-
Класс
DexClassLoader
[🔗]:- Позволяет загружать классы из внешних
.jar
/.apk
, которые содержатclasses.dex
loadClass()
– может быть использован для выполнения кода, который не является частью приложения, чтобы обойти механизмы обнаружения;
- Позволяет загружать классы из внешних
-
Класс
Runtime
[🔗]:- Позволяет приложениям взаимодействовать со средой, в которой они запущены
Runtime.getRuntime.exec()
– может быть использован для выполнения Linux команд / shell-скриптов внутри новых нативных процессов за пределами нормального жизненного цикла исполнения программы для обхода механизмов обнаружения;
-
Класс
System
[🔗]- Предоставляет системные средства, такие как стандартные потоки данных: Input / Output / Error
loadLibrary()
– может быть использован для динамической загрузки нативных библиотек для запуска нативного кода и эксплуатации уязвимостей системы;
-
-
Системные ресурсы:
-
Классы
ConnectivityManager
[🔗] /NetworkInfo
[🔗] /WifiManager
[🔗]:- Предоставляют функциональность, связанную с сетью, такую как запрос информации о подключениях (прим: Wi-Fi, GPRS, UMTS) / сетевых интерфейсах
- Методы класса могут быть использованы для установки сетевого соединения / взаимодействия с удалёнными серверами атакующих
- ConnectivityManager:
getNetworkInfo()
, ... - NetworkInfo:
NetworkInfo()
,getExtraInfo()
,getTypeName()
,isConnected()
,getState()
, ... - WifiManager:
setWifiEnabled()
,getWifiState()
, ...
-
Классы
HttpURLConnection
[🔗] /Sockets
[🔗]:- Методы класса используются для установки соединений с удалёнными серверами / получения и отправки данных по сети
setRequestMethod()
,getInputStream()
,getOutputStream()
, ... – могут быть использованы для установки соединения и передачи данных от приложения удалённому серверу атакующих;
-
Пакет классов
android.OS
[🔗]:- Предоставляет API для управления процессами / потоками исполнения
sendMessage()
– добавляет сообщения в очереди сообщений потоков исполнения;obtainMessage()
– получает сообщения из очередей сообщений;myPid()
&killProcess()
– могут быть использованы для принудительного завершения запущенных процессов на основе их идентификаторов;// Ядро накладывает ограничения на возможность приложений принудительно завершать процессы: только приложения / пакеты с общим UID могут принудительно завершить друг друга
// Это ограничение можно обойти, если устройство root'нуто
-
Пакет классов
java.IO
[🔗]:- Предоставляет доступ к чтению / записи в потоки данных, файлы, буферы внутренней памяти, ...
- IO.DataOutputStream:
writeBytes()
– записывает данные и загружает файлы через соединение с URL; - IO.DataInputStream:
readLines()
,available()
– считывает и скачивает вредоносную полезную нагрузку из соединения с URL; - IO.FileOutputStream:
write()
– записывает вредоносный контент, скачанный с удалённого сервера, в локальные файлы; - IO.File:
delete()
,mkdir()
,exists()
,ListFiles()
– для управления файлами;
-
-
Утилиты:
-
Классы
String
[🔗] /StringBuilder
[🔗] /StringBuffer
[🔗]:- Предоставляют интерфейс для создания и манипуляции строками
substring()
,indexOf()
,getBytes()
,valueOf()
,replaceAll()
,Append()
, ... – могут быть использованы для обфускации вредоносного кода, составления полезной нагрузки, обхода статических методов обнаружения путём динамического создания URL'ов / параметров / опасных команд;
-
Класс
Timer
[🔗]:- Предоставляет возможность планирования единоразовых / повторяющихся запусков задач
schedule()
,cancel()
– могут быть использованы для того, чтобы "спрятать" вредоносную функциональность от динамического анализа, отложив запуск вредоносного кода до определённой даты / события;
-
Класс
Crypto
[🔗]:- Предоставляет интерфейс для проведения криптографических операций (шифрование, дешифрование, совместная выработка ключа)
- Методы класса могут быть использованы для обфускации вредоносного кода + обхода статических методов обнаружения путём шифрования полезной нагрузки, телефонных номеров, ссылок, ...
- Crypto.Cipher:
getInstance()
,doFinal()
– трансформируют ввод в зашифрованный / расшифрованный формат; Crypto.spec.DESKeySpec()
– позволяет указать DES ключ;
-
Класс
ZipInputStream
[🔗]:- Методы класса могут быть использованы для распаковки вредоносных архивов / считывания данных из сжатых файлов, скачанных во время выполнения приложения или изначально прикреплённых к приложению
read()
,close()
,getNextEntry()
,closeEntry()
, ...
-
Класс
w3c.dom
[🔗]:- Предоставляет официальные интерфейсы w3c Java для DOM
getDocumentElement()
,getElementByTagName()
,getAttribute()
– могут быть использованы для парсинга XML файлов (прим: для обработки локальных конфигурационных файлов, ...)
-
Уровень права | Право | Использование | Вредоносное использование | Примеры вредоносов | |
---|---|---|---|---|---|
🟢 | Normal | ACCESS_NETWORK_STATE |
Получение информации о сетях | Сбор / Отслеживание информации о сетях | DEFENSOR, Dplug, MouaBad |
🟢 | Normal | ACCESS_WIFI_STATE |
Получение информации о сетях Wi-Fi | Сбор / Отслеживание информации о сетях Wi-Fi | SOVA, ActionSpy, Dplug |
🟢 | Normal | CHANGE_WIFI_STATE |
Изменение состояния подключения к Wi-Fi | Установка соединения с вредоносным сервером | ActionSpy, Dplug |
🟢 | Normal | INTERNET |
Открытие сетевых сокетов | Установка соединения с вредоносным сервером | DEFENSOR, FlixOnline, FluBot, Dplug |
🟢 | Normal | KILL_BACKGROUND_PROCESSES |
Вызов ActivityManager.killBackgroundProcesses() , который моментально убивает все фоновые процессы, ассоциированные с конкретным пакетом |
Принудительное завершение фоновых процессов антивируса | FluBot, Daam, Dplug |
🟢 | Normal | RECEIVE_BOOT_COMPLETED |
Получение Intent.ACTION_BOOT_COMPLETED , который транслируется по завершении запуска системы |
Запуск вредоносной активности сразу по завершении запуска системы | Cerberus, Xbot, ActionSpy, Simplelocker, Exobot |
🟢 | Normal | SET_WALLPAPER |
Изменение обоев | Загрузка вредоносного контента на устройство; Множественная перезагрузка устройства | MouaBad |
🟢 | Normal | WAKE_LOCK |
Использование блокировки пробуждения (PowerManager WakeLocks) для того, чтобы не усыпал процессор / не гас экран | Беспрерывное выполнение вредоносной фоновой активности | Cerberus, Simplelocker, DEFENSOR |
🟢 | Normal | WRITE_SMS |
Право устарело; Эмуляция получение SMS / Изменение локальных SMS | SMS-фишинг | FluBot, GodFather |
🔵 | Signature | BIND_NOTIFICATION_LISTENER_SERVICE |
Запрашивается NotificationListenerService для получения новых уведомлений |
Сбор / Отслеживание информации из уведомлений | SOVA, MasterFred |
🔵 | Signature | BROADCAST_PACKAGE_REMOVED |
Бродкаст уведомления об удалении пакета приложения | Принудительное завершение других запущенных приложений (антивирусов) | |
🔵 | Signature | DELETE_PACKAGES |
Удаление пакетов | Удаление приложений (антивирусов) | SecuriDropper, Dplug |
🔵 | Signature | INSTALL_PACKAGES |
Установка пакетов | Установка вредоносных пакетов | SOVA, Dplug |
🔵 | Signature | MOUNT_UNMOUNT_FILESYSTEMS |
Монтирование / размонтирование файловых систем для съемного хранилища | Доступ к SD картам устройства для чтения / записи данных с / на устройство | MouaBad, ActionSpy |
🔵 | Signature | WRITE_APN_SETTINGS |
Запись настроек APN + Чтение конфиденциальных полей существующих настроек APN (имя пользователя, пароль) | Сбор чувствительной информации об устройстве | MouaBad, Dplug |
🔴 | Dangerous | ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION |
Получение приблизительного (сетевой провайдер) / точного (GPS) местоположения | Отслеживание местоположения пользователя | SOVA, ActionSpy |
🔴 | Dangerous | CALL_PHONE |
Инициация телефонного звонка без подтверждения пользователем вызова | Инициация звонков для траты денег | Cerberus, GodFather, FluBot |
🔴 | Dangerous | CAMERA |
Получение доступа к камере | Съёмка фотографий и видео с камеры пользователя | |
🔴 | Dangerous | GET_ACCOUNTS |
Получение списка аккаунтов | Получение списка аккаунтов в соцсетях | SOVA |
🔴 | Dangerous | PROCESS_OUTGOING_CALLS |
Право устарело; Просмотр набранного номера во время исходящего звонка + Перенаправление исходящего вызова на другой номер + Завершение исходящего звонка | Отслеживание телефонных номеров | SpyNote |
🔴 | Dangerous | READ_CALENDAR |
Чтение записей в календаре | Сбор / Отслеживание событий пользователя | |
🔴 | Dangerous | READ_CONTACTS |
Чтение контактов пользователя | Инфицирование других устройств на основе контактной информации | SOVA, Cerberus, Anubis |
🔴 | Dangerous | READ_PHONE_STATE |
Read-only доступ к состоянию телефона (информация о сотовой сети, статус текущих звонков, список зарегистрированных на устройстве телефонных учётных записей PhoneAccount) | Отслеживание активности пользователя | Cerberus, GodFather |
🔴 | Dangerous | READ_SMS |
Чтение SMS | Чтение SMS для сбора чувствительной информации о пользователе | SOVA, Cerberus |
🔴 | Dangerous | RECEIVE_SMS |
Получение SMS | Получение SMS для последующей отправки их на удалённые сервера атакующих | Cerberus, Dplug, BlackRock |
🔴 | Dangerous | RECORD_AUDIO |
Запись аудиозаписи | Подслушивание за пользователем | Daam, GodFather, SOVA, Anubis, SpyNote |
🔴 | Dangerous | SEND_SMS |
Отправка SMS | Отправка SMS на платные номера | SOVA, Cerberus, Asacub |
🔴 | Dangerous | WRITE_EXTERNAL_STORAGE |
Запись во внешнее хранилище | Чтение / Манипуляция локальными файлами | SOVA, GodFather, SpyNote |
Частые точки входа:
Вредоносный код часто располагается близко к точкам входа, чтобы быстрее исполниться;
-
[ EXPORTED ACTIVITIES ]
Экспортируемые активности (включая главную активность приложения)- Отмечены в манифесте атрибутом
android:exported=true
- 🔗 Подробнее про риски
android:exported
- Отмечены в манифесте атрибутом
-
[ BROADCAST RECEIVERS ]
Широковещательные приёмники (обработчики сообщений, посылаемых системой / другими приложениями)- Manifest-registered receivers: Отмечены в манифесте тегом
<receiver>
; - Context-registered receivers: Регистрируются программно во время исполнения приложения;
- Android API 26+: не могут быть использованы для того, чтобы будить приложения
- Могут работать только во время выполнения приложения
- Manifest-registered receivers: Отмечены в манифесте тегом
-
[ SERVICES ]
Сервисы (определяются приложением для запуска длительных фоновых операций)- Отмечены в манифесте тегом
<service>
- Отмечены в манифесте тегом
-
[ SUBCLASSES ]
Подклассы классаandroid.app.Application
- Отмечены в манифесте тегом
<application>
- Отмечены в манифесте тегом
Составляющие Intent (Намерения):
- Имя компонента: – имя компонента приложения, которому будет передано намерение;
- Explicit intent: если имя компонента указано
- Implicit intent: если имя компонента не указано → тогда система сама выбирает компонент на основе другой информации намерения
- Действие: – определение задачи, которая должна выполняться компонентом (просмотр, выбор, ...);
- Данные: – определение типа данных, зависит от указанного действия;
- Категория: – строка с дополнительным указанием типа компонента, который должен обработать намерение;
- Дополнительное: – дополнительная информация для передачи компонентам для выполнения нужного действия;
- Флаги: – метаданные намерения, сообщают системе как запустить активность + как работать с активностью после запуска;
Вредоносное использование намерений [🔗]:
- android.app.action.DEVICE_ADMIN_ENABLED
: проверка, активированы ли привилегии администратора;
- android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
: запуск вредоносного приложения, расположенного на SD карте;
- android.intent.action.ACTION_POWER_CONNECTED
: проврека, заряжается ли устройство, для запуска обновления вредоносного ПО;
- android.intent.action.BATTERY_LOW
/ BATTERY_OKAY
: проверка уровня зарядки для запуска соответствующей активности;
- android.intent.action.BOOT_COMPLETED
: запуск вредоносных активностей по завершении запуска системы;
- android.intent.action.INPUT_METHOD_CHANGED
: проверка изменился ли способ ввода;
- android.intent.action.PACKAGE_INSTALL
/ PACKAGE_ADDED
: проверка, установлен / добавлен ли вредоносный пакет;
- android.intent.action.PHONE_STATE
: проверка входящих звонков;
- android.intent.action.QUICKBOOT_POWERON
: запуск вредоносных сервисов, когда запущена система;
- android.intent.action.SCREEN_ON
/ SCREEN_OFF
: проверка, включен / выключен ли экран;
- android.intent.action.SIG_STR
: проверка силы сигнала;
- android.intent.action.USER_PRESENT
: проверка, присутствует ли пользователь (разблокировано ли устройство);
- android.provider.Telephony.SMS_RECEIVED
: проверка, получило ли устройство новое SMS для отправки на вредоносный сервер;
🔗 Официальные подробности про атаку Intent Redirection
🔗 Разбор атаки Intent Redirection с исходным кодом на Medium
🔗 Разбор атаки Intent Redirection с исходным кодом от Snyk
❓) Смысл:
- Компоненты Android приложения (активности, сервисы, широковещательные приёмники, контент-провайдеры) – приватные и доступны только другим компонентам этого приложения;
- Если компоненты Android приложения объявлены как публичные – они становятся доступны компонентам других приложений;
→ Вредоносное перенаправление намерения возможно когда аткующий может частично / полноценно контролировать содержимое намерения, которое используется для запуска компонента в контексте уязвимого приложения, через своё вредоносное приложение.
→ Если публичный компонент содержит функциональность, связанную с перенаправлением вложенных намерений, и недостаточно санитизирует вложенные намерения – приложение уязвимо;
❗️) Влияние:
Атакующий получает доступ к взаимодействию с компонентами уязвимого приложения, включая приватные компоненты, которые могут содержать чувствительные данные, а также со внутренней функциональностью уязвимого приложения.
🔢) Шаги:
- Уязвимое приложение допускает получение намерений из недоверенных источников и недостаточно санитизирует вложенные намерения;
- Во вредоносном приложении реализована функциональность, отправляющая намерение уязвимому приложению;
// Вложенное намерение: основное запустит легитимную активность, вложенное – приватную
[ Пример проведения атаки от Snyk 🔗 ]
🔗 Разбор атаки Intent Parameter Injection с исходным кодом от Snyk
❓) Смысл:
Пользователю разрешается указывать произвольные параметры для намерений (в дополнение к оригинальным) с помощью метода putExtra()
. Если дополнительные параметры недостаточно санитизируются, атакующий может получить доступ к приватным компонентам уязвимого приложения через своё вредоносное приложение.
❗️) Влияние:
Атакующий получает доступ к взаимодействию с компонентами уязвимого приложения, включая приватные компоненты, которые могут содержать чувствительные данные, а также со внутренней функциональностью уязвимого приложения.
🔢) Шаги:
- Уязвимое приложение допускает получение намерений из недоверенных источников и использует дополнительные параметры из внешних намерений, но недостаточно их санитизирует;
- Во вредоносном приложении реализована функциональность, отправляющая намерение уязвимому приложению, которое содержит вредоносные дополнительные параметры;
[ Пример проведения атаки от Snyk 🔗 ]
🔗 Официальные подробности про атаку Implicit Intent Hijacking
❓) Смысл:
Если уязвимое приложение не указывает полное имя класса компонента / пакета при запуске намерения, то атакующий может зарегистрировать фильтр намерений и перехватывать намерения, адресованные легитимному приложению, с помощью вредоносного приложения.
❗️) Влияние:
Атакующий может перехватывать + читать / редактировать содержимое намерения, что может привести к утечке чувствительной информации или к запуску компонентов, контролирующихся атакующим.
🔗 Подробнее про байт-код и коды операций Dalvik
// Приложение компилируется → генерируются коды операций Dalvik
// → ART транслирует коды операций в набор инструкций процессора
Предложенный код для извлечения кодов операций:
for FILE in ./*.apk;
do
apktool d -f $FILE
done
for DIR in $(ls -d */);
do
mkdir ${DIR}smali/opcodes
FILES=$(find ${DIR}smali -type f -name "*.smali")
for FILE in $FILES;
do
grep -v '[0*.#:}{\"]' $FILE | sed '/^$/d' | sed 's/ //g' | cut -d ',' -f 1 | sort -u >> ./${DIR}smali/opcodes/opcodes0.txt
done
done
for DIR in $(ls -d */);
do
sed 's/v[0-9]//' ./${DIR}smali/opcodes/opcodes0.txt > ./${DIR}smali/opcodes/opcodes1.txt
sed 's/p[0-9]//' ./${DIR}smali/opcodes/opcodes1.txt > ./${DIR}smali/opcodes/opcodes2.txt
sed 's/[0-9]$//' ./${DIR}smali/opcodes/opcodes2.txt > ./${DIR}smali/opcodes/opcodes3.txt
done
-
Отражение (Reflection): – техника против анализа, заключающаяся в использовании API "отражения", которое используется для динамического поиска, создания экземпляров, вызова классов / методов во время выполнения программы → может быть использовано для сокрытия вредоносного кода;
Необходимо искать использование API отражения! =
import java.lang.reflect
Также могут быть использованы:dalvik.system.DexClassLoader
/dalvik.system.DexFile
/ClassLoader
API / ...- Часто при легитимном использовании API отражения задействуются константные значения;
- Часто при вредоносном использовании API отражения задействуются неконстантные значения / объединяющиеся во время выполнения / зашифрованные / обфусцированные;
-
Код не на Java: – техника против анализа, заключающаяся в написании части / всего кода на других, более новых / редких языках программирования, что усложняет анализ в связи с недостатком подходящих инструментов;
-
Выявление использования JavaScript кода:
- Поиск JS скриптов в объектах WebView:
addJavascriptInterface
- Поиск JS скриптов в объектах WebView:
-
Выявление использования нативного ARM кода:
- Нативный код часто может быть найден в папке
lib
внутри APK - Ключевые слова в Java для взаимодействия с нативным кодом:
native
/System.loadLibrary
- Нативный код часто может быть найден в папке
-
-
Шифрование & Кодирование: – техника против анализа, заключающаяся в шифровании / кодировании значений;
Необходимо искать использование пакетов
javax.crypto
/java.util.Base64
/android.util.Base64
/ ...
- [ 📙 ] Мануал: Список инструментов для тестирования мобильных приложений от OWASP 🔗
- [ 📘 ] Документация: Официальная документация о ресурсах Android приложения 🔗
- [ 📘 ] Документация: Официальная документация о манифесте Android приложения 🔗
- [ 📘 ] Документация: Официальная документация о правах Android приложения 🔗
- [ 📄 ] Статья: ‟Малварь для Android за полчаса. Отслеживаем местоположение, читаем SMS, пишем аудио и делаем фото” от Евгения Зобнина в ][akep 🔗
- [ 📄 ] Статья: ‟What Is Android Intent Redirection Vulnerability and How to Prevent It” от Masoud Fallahpour в Medium 🔗
- [ 📄 ] Статья: ‟Exploring intent-based Android security vulnerabilities on Google Play” от Snyk 🔗