大概是这样的一个要求:编写一个内核模块,可以记录访问痕迹

思路

内核编程,在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
#注意:一定要缩进正确,tab代替空格。

二、编译
使用当前系统内核的头文件和Makefile,编译出一个名为list.ko的内核模块文件。

1
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules


三、插入
使用以下命令将模块加载到内核中:

1
2
su root
insmod list.ko


四、验证测试
dmesg:一旦成功加载了内核模块,使用dmesg命令来查看内核日志,以查看模块的输出信息。

1
dmesg