大概是这样的一个要求:编写一个内核模块,可以记录访问痕迹
。
思路
内核编程,在my_module.c中编写下列代码,实现允许定义一个受保护文件列表的功能,然后“嵌入”内核中,重新编译即可。
具体实现
一、编写代码:
list.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/list.h> #include <linux/string.h> MODULE_LICENSE("GPL");
static char *protected_files[] = {"/etc/passwd", "/etc/shadow", NULL}; static int is_protected_file(const char *filename) { int i = 0; while (protected_files[i] != NULL) { if (strcmp(filename, protected_files[i]) == 0) { return 1; } i++; } return 0; } static int my_open(struct inode *inode, struct file *file) { if (is_protected_file(file->f_path.dentry->d_iname)) { printk(KERN_INFO "Access to protected file %s denied\n", file->f_path.dentry->d_iname); return -EACCES; } return 0; } static struct file_operations my_fops = { .open = my_open, }; static int __init my_init(void) { register_chrdev(240, "protected_files", &my_fops); printk(KERN_INFO "Protected files module loaded\n"); return 0; }
static void __exit my_exit(void) { unregister_chrdev(240, "protected_files"); printk(KERN_INFO "Protected files module unloaded\n"); } module_init(my_init); module_exit(my_exit);
|
Makefile:
1 2 3 4 5 6 7 8 9
| obj-m += list.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules
clean: $(MAKE) -C $(KDIR) M=$(PWD) clean
|
二、编译
使用当前系统内核的头文件和Makefile,编译出一个名为list.ko的内核模块文件。
1
| make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
|
三、插入
使用以下命令将模块加载到内核中:
四、验证测试
dmesg:一旦成功加载了内核模块,使用dmesg命令来查看内核日志,以查看模块的输出信息。