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

ядро — на вилы

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

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

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