Любой читатель нашего журнала как минимум что-то слышал о возможности перехвата вызовов в различных операционных системах. А скорее всего, активно этим пользовался — по крайней мере в винде. Если вкратце, ты можешь перехватить вызов какой-то функции и как-нибудь этим распорядиться: использовать параметры по своему усмотрению, выполнить свой код вместо того, который должен был выполниться. Сегодня мы будем делать это в ОС Android!

 

Немного теории


Достаточно каноничным примером использования хуков являются так называемые соксификаторы — фактически они перехватывают функцию подключения к серверу, подсоединяются в этот момент к SOCKS-прокси и вместо оригинального дескриптора сокета возвращают тот дескриптор, который подключен к SOCKS-серверу.

Несколько лет назад появилась прекрасная вещь — Xposed Framework для Android. Что это такое? Это фреймворк, позволяющий перехватывать вызовы Java-методов в Android-приложениях. Он дает большой простор для модификации поведения приложений, установленных на устройство, — от простого калькулятора до SystemUI, отвечающего (да-да, Кэп) за работу системного интерфейса.
Для начала давай посмотрим, как оно работает.

 

Внутреннее устройство Xposed Framework

В Android есть процесс под названием Zygote, он отвечает за формирование среды исполнения для каждого Android-приложения (путем форка самого себя). За его запуск отвечает бинарник app_process, который стартует в момент инициализации Android.

Xposed при установке заменяет app_process своим модифицированным, а также добавляет файл XposedBridge.jar. Модифицированный app_process загружает XposedBridge, который и перехватывает вызовы заданных методов, заменяя их своими.

Как он понимает, что чем заменять? Xposed — вещь модульная. Сам по себе он почти ничего не заменяет. При инициализации он загружает установленные модули и уже из них берет информацию о том, что перехватывать и куда передавать управление. Сами по себе модули — это, по большому счету, обычные APK, только немного дополненные специфичной для Xposed информацией.

Конечно же, есть у него и минусы — такой подход не может не сказаться на производительности и стабильности системы. Доступ к различным частям системы внутри этого фреймворка никак не контролируется — любой модуль может перехватить любой вызов, будь то обычное приложение или системное. Если «хуки» вызываются часто и работают не слишком быстро, то система начнет тормозить и кушать батарейку (хоть это и стандартное для андроида поведение, хе-хе). Если модуль плохо протестирован — в лучшем случае что-то будет некорректно работать или падать. А может выйти и так, что система вообще перестанет грузиться (я пару раз случайно доводил ее до такого состояния в процессе разработки. Помогает только перепрошивка, потому что удалить модуль на этапе загрузки системы тоже нельзя, не имея кастомного рекавери).

Ладно, хватит теории, переходим к практике! Установи Xposed на свой девайс (думаю, с этим ты разберешься сам), и поехали.

 

Hello, world!

Давай начнем с того, что напишем своеобразный «Hello, world» с использованием Xposed Framework.

По сути, модуль Xposed — это обычный Android-проект с дополнительными файлами. Создадим новый проект в Android Studio. Графического интерфейса у нас не будет, поэтому Activity создавать не надо. Первым делом добавим в манифест (внутрь тега <application>) параметры, которые нужны для отображения информации о нашем модуле, а также минимально требуемую версию фреймворка.

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

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

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

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Безопасность превыше всего. 9 простых трюков, которые сделают жизнь линуксоида секьюрнее

Жизнь обычных людей складывается из мелочей. Жизнь линуксоида складывается из множества ма…