1, 概要思想:
为了达到监控进程读写的目的,必须要在加载驱动模块时用我自己的函数
代替真正的系统调用,让系统在调用 read 和 write 系统调用时,先经过我自己写
的函数,然后才能到达真正的系统调用,这也叫做“加塞子”。这样在经过我自
己写的函数时我可以做很多事情,比如说记录读写的信息量,对我感兴趣的读
写内容进行监控,或者干脆让它去做一些诸如毁灭系统之类的事情。同时,根
据要求,我要写一个有关这个模块的系统调用,用来证明我的模块是可以正常
工作的。
2,数据结构
通过定义两个数据结构来记录进程读写,分别为:
typedef struct read_record
{
int pid;
char pname[16];
int count;
int flag;
int tag;
} r_record;//用于记录发生读操作的进程
typedef struct write_record
{
int pid;
char pname[16];
int count;
int flag;
int tag;
}w_record;//用于记录发生写操作的进程
引入这两个数据结构的目的是为了方便地记录进程的读写,考虑到内核栈
空间有限,不能就每一个进程使用一个记录,所以我在模块中就只记录从模块
加载以后最先发生读写操作的十个进程。
下面介绍各变量的意义:
pid : 发生读写操作的进程号
pname : 发生读写操作的进程名字
count : 进程读写的数据量
flag: 辅助性的标志,用于表示这个记录是否已经使用过了
tag : 用于标志进程在读写过程中是否有对敏感信息,如 password 进行操作,
1 表示有进行。
定义了一个数据结构用来方便进行系统调用
struct proc_RW_info {
unsigned long total_read_bytes;
unsigned long total_write_bytes;
int rtag;
int wtag;
评论1