ядро — на вилы КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #069, стр. 069-032-4 /* модуль, перехватывающий mkdir, и работающий под FreeBSD */ /* based on: */ /* syscall.c by Assar Westerlund and hacked_mkdir.c by Joseph Kong */ #include <sys/types.h> #include <sys/param.h> #include <sys/proc.h> #include <sys/module.h> #include <sys/sysent.h> #include <sys/kernel.h> #include <sys/sysproto.h> #include <sys/systm.h> #include <sys/syscall.h> /* функция-«заглушка», устанавливаемая на место mkdir */ static int hack (struct proc *p, void *arg) { printf ("rock you!\x7\n"); return 0; } /* элемент структуры sysent, описывающий наш системный вызов */ static struct sysent hack_sysent = { 1, /* sy_narg */ hack /* sy_call */ }; /* процедура начальной загрузки модуля */ static int load (struct module *module, int cmd, void *arg) { int error = 0; switch (cmd) { case MOD_LOAD: /* загрузка модуля */ printf ("syshack loadedd\n"); /* устанавливаем вместо mkdir свою «заглушку» */ sysent[SYS_mkdir]=hack_sysent; break; case MOD_UNLOAD: /* выгрузка модуля */ printf ("syshack unloadedd\n"); /* снимаем свою «заглушку», возвращая на место mkdir */ sysent[SYS_mkdir].sy_call=(sy_call_t*)mkdir; break; default: error = EINVAL; break; } return error; } /* структура, описывающая основные параметры модуля */ static moduledata_t syscall_mod = { "Intercept", load, NULL }; /* сердце программы — макрос DECLARE_MODULE, декларирующий модуль */ DECLARE_MODULE(syscall, syscall_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE); Базовая процедура load практически никак не изменилась (поменялись лишь определения cmd-кодов), а вот в декларации модуля произошли большие перемены. Функция с макросом DISPATCH исчезла, а вместе с ней исчезла и необходимость указывать точку входа в модуль при его загрузке в память ядра. Новый макрос DECLARE_MODULE не только задает точку входа в модуль вместе с его типом, но так же определяет порядок загрузки! Вообще-то, этот макрос — не единственный, и с не меньшим успехом мы могли бы воспользоваться DEV_MODULE или SYSCALL_MODULE («man 9 DEV_MODULE» и «man 9 SYSCALL_MODULE»), но это уже дело вкуса, споры о котором рискуют превратиться в священные войны. А ведь прежде, чем воевать, модуль еще откомпилировать надо! В общем случае, сборка осуществляется следующим make-файлом, причем строки KO и KLMOD не являются обязательными: ЛИСТИНГ SRCS = syshack.c KMOD = syshack KO = ${KMOD}.ko KLDMOD = t .include <bsd.kmod.mk> Если компиляция прерывается сообщением «can't find kernel source tree», это значит, что у тебя не установлены исходные тексты ядра, или bsd.kmod.mk-файл не может их найти. Установить недостающие компоненты можно в любой момент, запустив утилиту /stand/sysinstall и отметив пункт «Kernel Developer – Full binaries and doc, kernel source only». Выходит, что, чтобы откомпилировать KLD-модуль, необходимо иметь сырцы ядра! Вот такая она, FreeBSD! Ни NetBSD, ни OpenBSD ничего подобного не требуют (что вполне логично: LKM-модули, в отличие от KLD, не являются частью ядра). |