Содержание статьи
- Инструменты
- Почитать
- Выполнение shell-кода с помощью JIT-компилятора
- К каким доменам чаще всего подключаются смартфоны
- Разработчику
- 10 самых популярных вопросов о Kotlin
- Список доступных для использования системных API
- Что такое Slices в Android P и как их использовать?
- Как работать с WorkManager
- Инструменты
- Библиотеки
Инструменты
- House — основанный на Frida инструмент для динамического анализа приложений под Android. Позволяет быстро сгенерировать скрипт и внедрить его в приложение;
- node-applesign — модуль Node.js и утилита командной строки для подписи приложений iOS (файлов IPA);
- frida-ipa-dump — скрипт для извлечения расшифрованных iOS-приложений с устройства;
- iOS writeups — огромное количество документов и книг, посвященных безопасности iOS.
Почитать
Выполнение shell-кода с помощью JIT-компилятора
Back To The Future | Going Back In Time To Abuse Android’s JIT — презентация, посвященная внедрению shell-кода в Android путем эксплуатации уязвимости в виртуальной машине Dalvik. Как мы все знаем, приложения для Android написаны на Java (или Kotlin) и скомпилированы в так называемый байт-код, исполняет который, в отличие от машинных инструкций, не процессор напрямую, а виртуальная машина.
В Android эта виртуальная машина изначально носила имя Dalvik, но была достаточно медлительной из-за того, что интерпретировала байт-код последовательно. С выходом версии Android 2.1 разработчики это поправили, внедрив в Dalvik так называемый JIT-компилятор (в версии Android 5.0 он был заменен на AOT-компилятор, но в 7.0 вернулся). Он транслирует в машинные инструкции целые куски байт-кода, так что виртуальной машине не приходится делать это последовательно, расходуя драгоценное время.
Оказалось, однако, что JIT-компилятор уязвим к подмене кода. То есть скомпилированные им фрагменты машинных инструкций можно подменить, заставив виртуальную машину выполнить совершенно другой код.
Виртуальная машина хранит ссылки на участки памяти со скомпилированными машинными инструкциями в структурах JitEntry, которые организованы в таблицу JitTable. Используя рефлексию и классы libcore.io.Posix
(содержит методы mmap
и munmap
для манипуляции памятью), а также классы libcore.io.Memory
и libcore.io.MemoryBlock
, в память можно загрузить shell-код, а затем подменить адрес в JitEntry, чтобы вместо актуального машинного кода он ссылался на shell-код.
Механизм выполнения shell-кода отличается в разных версиях Android, но возможен и в 4.4.4, и в 7.1. А вот в Android P, скорее всего, начнутся проблемы, так как она запрещает вызов закрытых от сторонних приложений API. Также авторы исследования не упомянули, работает ли этот метод в отношении других приложений и системы в целом или только текущего процесса. Ведь Android запускает каждое приложение в собственной виртуальной машине, и память одной виртуальной машины не пересекается с другой.
К каким доменам чаще всего подключаются смартфоны
1984 called — очень короткая, но занятная статья о том, какие веб-сайты и сервисы следят за пользователями Android. Автор написал блокировщик рекламы для смартфонов Samsung, который перенаправляет DNS-запросы устройства на специальные DNS-серверы. Вместо IP-адресов рекламных и трекинговых сетей эти серверы возвращают 127.0.0.1, чем блокируют рекламу и трекеры.
Спустя несколько месяцев работы серверы накопили статистику заблокированных адресов. И первые три места с большим отрывом занимают следующие адреса:
- graph.facebook.com
- mobile.pipe.aria.microsoft.com
- www.googleadservices.com
Facebook, как всегда, впереди.
Разработчику
10 самых популярных вопросов о Kotlin
Top 10 Kotlin Stack Overflow questions — десять (на самом деле девять) наиболее часто задаваемых вопросов о Kotlin на Stack Overflow и ответы на них. Приводим очень краткую выжимку (лучше все-таки почитать оригинал).
1. Чем отличаются Array и IntArray?
Первый создает массив высокоуровневого типа Integer, второй — примитивного типа int. IntArray более высокопроизводительный и рекомендуется к использованию в любых ситуациях.
2. Чем отличается Iterable и Sequence?
Iterable — это стандартный интерфейс Java. Реализующие его классы (List и Set, например) обрабатывают всю коллекцию целиком, что может плохо сказаться на производительности. Например, следующий код выполнит две операции (filter и map) над всеми элементами списка, перед тем как взять первые пять элементов (take):
val people: List<Person> = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Sequence, с другой стороны, обрабатывает коллекции в ленивом режиме. Такой подход позволяет более эффективно обрабатывать коллекции в несколько проходов (как в этом примере) и выполнять процессинг только необходимого количества элементов:
val people: List<Person> = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
В отличие от предыдущего, этот код будет обрабатывать каждый элемент списка отдельно, до тех пор пока не наберется пять элементов.
Что использовать? В случае небольших коллекций Iterable показывает лучшую производительность. Но если ты имеешь дело с очень большой коллекцией, тогда лучше задуматься о применении Sequence. Если же тебе нужна генерируемая на лету бесконечная коллекция, то Sequence (с его функцией generateSequence()) — твой единственный выход. Подробная статья об этом.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»