ядро — на вилы КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #069, стр. 069-032-3 ЛИСТИНГ компиляция нашего LKM-модуля компилятором gcc # gcc -D_LKM -D_KERNEL -I/sys -c syshack.c ЛИСТИНГ Make-файл, собирающий LKM-модули KSRCS=syshack.c KOBJS=syshack.o KMOD=syshack CFLAGS= -D_LKM -D_KERNEL -I/sys За загрузку модуля в память ядра отвечает утилита modload («man 8 modload»). ЛИСТИНГ загрузка LKM-модуля в память ядра утилитой modload (hack – имя модуля в памяти, entry – точка входа в модуль, syshack.o – имя скомпилированного объектного файла) # modload -o hack -eentry syshack.o Module loaded as ID 0 Проверить успешность загрузки модуля можно утилитой «modstat» («man 8 modstat»). ЛИСТИНГ утилита modstat показывает наличие модуля hack в памяти - значит, загрузка прошла успешно # modstat Type Id Off Loadaddr Size Info Rev Module Name SYSCALL 0 210 e0b92000 0002 e0b93008 2 hack Если модуль действительно загружен, то появится строчка с его именем (в данном случае — «hack»), и с этого момента любые попытки создать новый каталог утилитой mkdir будут обречены на провал, вплоть до того времени, пока не выгрузим модуль из памяти утилитой modunload («man 8 modunload»). ЛИСТИНГ выгрузка модуля из памяти утилитой modunload # modunload -n hack Перехват остальных системных вызовов осуществляется аналогично. Таким образом, модуль может скрывать от глаз администратора некоторые процессы или файлы, «стелсируясь» на уровне ядра. А вот в FreeBSD модули реализованы совсем иначе... [KLD-модули FreeBSD.] Ранние версии FreeBSD поддерживали LKM-модули наравне со своими конкурентами, но, начиная с FreeBSD 3.0, интерфейс модулей был изменен на KLD, что расшифровывается как Dynamic Kernel Linker – динамическое связывание ядра. И LKM-модули отошли на задний план (в текущих версиях FreeBSD их поддержка прекращена). В практическом плане это, в первую очередь, означает, что старые исходные тексты необходимо переделывать, а в некоторых случаях — чуть ли не переписывать заново. На этом фоне преимущества нового типа модулей полностью девальвируются. Кстати говоря, штатное руководство («man KLD») лишь заявляет о преимуществах, но не перечисляет их, и за разъяснением приходится обращаться к другим источникам. Если не углубляться в детали, то LKM-модуль – это ELF-файл, загружаемый в адресное пространство ядра, а KLD – это часть самого ядра, которая, в отличие от LKM, может быть загружена в любое время без поддержки прикладного уровня. То есть ядро в процессе старта системы как бы собирает себя из блоков, загружаемых/выгружаемых в любой момент времени. KLD-модули предоставляют намного больше возможностей для разработчиков драйверов, но на нас это никак не распространяется. Перехват системных модулей реализуется так же, как и раньше. Меняется только декларация модуля, макросы и некоторые структуры данных. Примеры готовых модулей можно найти в каталоге /usr/share/examples/kld/ или, опять же, стянуть их из Сети: www.freebsd.org/cgi/cvsweb.cgi/src/share/examples/kld/. «Зрелость» файлов варьируется от нескольких месяцев до 7 (!) лет. ЛИСТИНГ техника перехвата системного вызова под FreeBSD из KLD-модуля |