![]() |
+7 (495) 229-0436 | ![]() |
shopadmin@itshop.ru | 119334, г. Москва, ул. Бардина, д. 4, корп. 3 | ![]() |
![]() |
![]() |
|
|
Перехват функций ядра Linux с использованием исключений (kprobes своими руками)10.01.2014 14:23
milabs
Перехват функций ядра является базовым методом, позволяющим переопределять (дополнять) различные его механизмы. Исходя из того, что за исключением небольших архитектурно-зависимых частей, ядро Linux почти полностью написано на языке C, можно утверждать, что для осуществления встраивания в большинство из компонентов ядра, достаточно иметь возможность перехвата соответствующих функций ЯВУ, реализующих ту или иную логику. Данная статья является практическим обобщением представленных ранее статей:
Далее будет рассмотрено каким образом использование данных материалов может быть применимо в обеспечении возможности перехвата функций ядра Linux. Кратенько о перехватеЦелью перехвата любой функции является получение управления в момент её вызова. Дальнейшие действия зависят от конкретных задач. В одних случаях, необходимо заменить системную реализацию алгоритма своей, в других - дополнить. При этом бывает важно оставить возможность использования перехватываемой функции в своих целях. Традиционным при осуществлении перехвата стал подход при котором используется концепция "обёрток", позволяющая реализовать пре- и пост-обработку с сохранением возможности доступа к исходному функционалу представляемому перехватываемой функцией. Как известно, основой большинства методов перехвата функций является патчинг - модификация кода ядра таким образом, чтобы обеспечить возможность передачи управления на функцию-перехватчик при вызове целевой функции. При этом, в силу развитой системы команд архитектуры x86, возможно существование множества вариантов изменения потока выполнения (да, Дабы внести разнообразие в тему перехвата функций ядра, в данной статье будет описан механизм перехвата, основанный на обработке исключений, рассматриваемой в одной из предыдущих статей. Кроме этого, особое внимание будет уделено практической составляющей, а именно удобству использования предлагаемого подхода в нашей "повседневной жизни".
Методика осуществления перехватаИтак, методика осуществления перехвата с использованием исключений будет состоять в том, чтобы модифицировать пролог целевой функции таким образом, чтобы его выполнение процессором приводило к исключению, обработка которого являлась бы контролируемой. Другими словами, для каждой целевой функции осуществим модификацию пролога путём записи в её начало команды Например, если до перехвата функция inode_permission имеет вид:
То после модификации в соответствии с предлагаемой методикой, её пролог будет выглядеть следующим образом Именно записанная поверх оригинальных инструкций команда
Функциональные возможности модуля перехватаДля того, чтобы реализация имела более высокую практическую ценность, будем пытаться оформить рассмотренную методику осуществления перехвата в удобный для работы инструмент. Для этого, поставим целью создание программного механизма, позволяющего с минимальными телодвижениями перехватывать функции ядра на основании только лишь их имён и прототипов. Имя будет служить основой для поиска адреса функции (символа), а прототип - характеризовать передаваемые функции аргументы. Далее, дабы было понятно к чему всё это должно привести, я приведу конечный результат, а затем дам пояснение, что к чему. Итак, конечной целью является возможность реализовывать перехваты функций ядра следующим образом:
Как нетрудно видеть, в приведённом примере осуществляется перехват функции inode_permission. При этом, в представленном фрагменте присутствуют макросы:
Первым из аргументов всех макросов является имя перехватываемой функции, служащее идентификатором формируемых и используемых макросами элементов. Макрос Макрос Макросы
Особенности реализации модуля перехватаКаждый, декларируемый с использованием макроса
В приведённой структуре: Ниже приведён сам макрос
Вспомогательные макросы Таким образом, после такой декларации для целевой функции создаётся структура описатель, которая попадает в специальную секцию. Это позволяет далее использовать конструкции типа:
Далее, при загрузке модуля описанным образом происходит перечисление всех зарегистрированных перехватов. Для каждого из них осуществляется поиск адреса соответствующего символа, а также настройка вспомогательных элементов, включая создание и заполнение таблицы исключений. Ниже представлен код основной функции:
Изменения в код ядра вносятся, как это описано в статье, посвящённой модификации защищённых от записи областей ядра с использованием проекций и механизма
К моменту выполнения Что касается возможности вызова оригинальной функции после того, как её пролог был "испорчен", то для этого необходимо сохранять затираемые инструкции в специальном месте - функции-переходнике (
Обращение к исходному функционалу перехватываемой функции осуществляется с помощью макроса, имеющего вид:
ЗаключениеВ заключение стоит отметить, что реализованная методика осуществления перехватов функций ядра с использованием исключений подтверждает возможность практического применения возможности пользовательской обработки исключений в ядре Linux. Представленные в данной статье материалы позволяют понять каким образом осуществляется перехват функций, а приводимый на github код проекта может служить учебным примером тому, кто интересуется данной тематикой. Ссылки по теме |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
О нас |
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.
На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям. Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе. В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.
|
119334, г. Москва, ул. Бардина, д. 4, корп. 3 +7 (495) 229-0436 shopadmin@itshop.ru |
|
© ООО "Interface Ltd." Продаем программное обеспечение с 1990 года |