Призраки ядра или модули-невидимки

Proof-of-concept module или готовая демонстрация


Давайте, в качестве разминки соорудим минимально работающий "невидимый" LKM-модуль для LINUX с ядром версии 2.4 (ядро 2.6 потребует незначительных изменений, о которых мы расскажем ниже), а вот в операционных системах xBSD и NT все сильно по-другому, хотя основополагающий принцип тот же— в процедуре инициализации выделяем память, копируем туда резидентный код, перехватываем один или несколько системных вызовов и возвращаем ошибку, приводящую к выгрузке модуля из памяти. Подробнее о технике написания LKM- и KLD-модулей под xBSD можно прочитать в моей статье "хачим ядро xBSD", опубликованной в "хакере", а "скелет" драйвера под NT описан в статье "жизнь после BSOD", опубликованной там же. Еще рекомендуется прочитать цикл статей Four-F'а на wasm'e, покрывающий собой все основные аспекты разработки драйверов: ttp://www.wasm.ru/article.php?article=drvw2k01.

Но вернемся к LINUX'у. Наш "невидимка" будет перехватывать системный вызов SYS_mkdir (см. рис. 4), возвращая неизменную ошибку вместо передачи управления оригинальному syscall'у, в результате чего создание новых директорий окажется невозможным (во всяком случае до перезагрузки системы). Это сделало для "облегчения" листинга и упрощения его понимания. Примеры реализации полноценных перехватчиков содержатся в статьях "перехват библиотечных функций в linux и bsd" и "шприц для *bsd или функции на игле", так же опубликованных в "хакере".



Содержание раздела