Содержание статьи
Почитать
Как обойти защиту на доступ к скрытым методам
Developers: It’s super easy to bypass Android’s hidden API restrictions — детальный рассказ, как обойти защиту на доступ к скрытым методам в Android 9 и выше.
Как и любая другая ОС, Android предоставляет разработчикам доступ к обширному API, который позволяет вызывать те или иные функции ОС. Этот API включает в себя ряд скрытых, но иногда очень полезных функций, например возможность развернуть строку состояния. Вызвать эти функции напрямую не получится, так как их просто нет в SDK. Но можно использовать модифицированный SDK (сложно) или рефлексию (очень просто).
Рефлексия позволяет дотянуться до любых методов и полей классов, что, конечно же, можно использовать для не совсем легальной деятельности. Поэтому, начиная с Android 9, Google создала черный список методов и полей, недоступных для вызова с помощью рефлексии. Если приложение попробует их вызвать, то либо будет принудительно остановлено, либо получит предупреждение (в случае с методами из серого списка).
Но есть в этой защите одна проблема — она основана на проверке имени вызывающего процесса. А это значит, что, если мы не будем вызывать метод напрямую, а попросим саму систему сделать это за нас, проверка даст добро (не может же она запрещать саму себя).
Итак, стандартный способ вызова скрытого метода с помощью рефлексии (не работает, приложение завершается):
val someHiddenClass = Class.forName("android.some.hidden.Class")
val someHiddenMethod = someHiddenClass.getMethod("someHiddenMethod", String::class.java)
someHiddenMethod.invoke(null, "some important string")
Новый способ вызова скрытого метода с помощью двойной рефлексии (работает, потому что вызывает метод не наше приложение, а сама система):
val forName = Class::class.java.getMethod("forName", String::class.java)
val getMethod = Class::class.java.getMethod("getMethod", String::class.java, arrayOf<Class<*>>()::class.java)
val someHiddenClass = forName.invoke(null, "android.some.hidden.Class") as Class<*>
val someHiddenMethod = getMethod.invoke(someHiddenClass, "someHiddenMethod", String::class.java)
someHiddenMethod.invoke(null, "some important string")
Но и это еще не все: с помощью этого трюка мы можем вызывать очень интересный скрытый метод setHiddenApiExemptions
, который позволяет (бам!) добавить нужные нам методы в исключения и вызывать их с помощью простой рефлексии.
Следующий код прикажет системе добавить в исключения вообще все скрытые методы:
val forName = Class::class.java.getDeclaredMethod("forName", String::class.java)
val getDeclaredMethod = Class::class.java.getDeclaredMethod("getDeclaredMethod", String::class.java, arrayOf<Class<*>>()::class.java)
val vmRuntimeClass = forName.invoke(null, "dalvik.system.VMRuntime") as Class<*>
val getRuntime = getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null) as Method
val setHiddenApiExemptions = getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", arrayOf(arrayOf<String>()::class.java)) as Method
val vmRuntime = getRuntime.invoke(null)
setHiddenApiExemptions.invoke(vmRuntime, arrayOf("L"))
Стоит отметить, что Google в курсе этой проблемы. Они отклонили баг-репорт о возможности вызова скрытых методов под предлогом, что это защита от дураков, а не security-фича.
Как обнаружить Magisk
Detecting Magisk Hide — статья о том, как обнаружить присутствие Magisk (и, как следствие, прав root) на устройстве.
Magisk — известный, а в последнее время единственный инструмент systemless-рутинга устройств. Он позволяет получить права root без изменения системного раздела, а также применить различные системные твики. Одна из широко используемых возможностей Magisk — функция Magisk Hide, которая позволяет полностью скрыть сам Magisk и наличие прав root на устройстве от выбранных приложений.
Принцип работы Magisk основан на подключении поверх файловой системы системного раздела другой файловой системы (оверлея), содержащей бинарный файл su (необходимый для получения прав root) и нужные для его работы компоненты. Подключение происходит на ранних этапах загрузки, но, если активирован Magisk Hide, он отключает оверлей для выбранных приложений. Другими словами, обычные приложения будут видеть содержимое оверлея, а те, что указаны в настройках Magisk Hide, — нет. С их точки зрения смартфон будет не рутован.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»