Я борюсь со своим назначением, которое дает вкус Linux операций перехвата системных вызовов. Я имею в виду присоединение перехвата к вызову sys_rt_sigaction
с использованием подхода модуля ядра. Модуль выглядит следующим образом:
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/unistd.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/syscalls.h>
#include <asm/unistd.h>
void **sys_call_table;
MODULE_AUTHOR("author_name");
MODULE_DESCRIPTION("Linux kernel hook program");
MODULE_LICENSE("GPL");
asmlinkage int (*real_rt_sigaction)(int signum, const struct sigaction *act,
struct sigaction *oldact, size_t sigsetsize);
static int __init buffer_init_module(void);
static void __exit buffer_exit_module(void);
asmlinkage int alter_rt_sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact, size_t sigsetsize) {
printk(KERN_INFO "Syscall function hooked - just what I want");
return 0;
}
int buffer_init_module(void)
{
printk(KERN_INFO
"Device initializing in progress...");
real_rt_sigaction=sys_call_table[__NR_rt_sigaction];
sys_call_table[__NR_rt_sigaction]=alter_rt_sigaction;
return 0;
}
void buffer_exit_module(void)
{
printk(KERN_INFO "Outside the module - exit successfully completed\n");
sys_call_table[__NR_rt_sigaction]=real_rt_sigaction;
}
Makefile для этого:
obj-m += buffer.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Это не создает никаких проблем на первый взгляд, однако программа запускается в бесконечный процесс после запуска sudo insmod buffer.ko
(make
выполнение приводит к довольно плавному построению файла .ko). Локальной ОС является Ubuntu 18.04. Я должен предоставить код, который присоединяет хук к указанной функции c syscall, просто больше ничего. Кажется, я пропускаю некоторые важные вещи в реальной программе, скорее всего, в Makefile , но мне не хватает понимания того, что не так.