Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #69, АВГУСТ 2006 г.

ядро — на вилы

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #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-модуля

Назад на стр. 069-032-2  Содержание  Вперед на стр. 069-032-4