- 论坛徽章:
- 1
|
实现一个不然任何用户rmmod驱动,当然有个策略让用户选择,如果策略失效那么就允许它rmmod,如果策略生效就返回权限不允许,代码如下:
- /*by e4gle,for hook delete_module test*/
- /*gcc -O3 -Wall -I/usr/src/linux/include -c dmod.c -o dmod.o*/
- #define MODULE
- #define __KERNEL__
- #define MODVERSIONS
- #define EXPORT_SYMTAB
- #ifdef MODVERSIONS
- #include <linux/modversions.h>;
- #endif
- #include <linux/config.h>;
- #include <linux/module.h>;
- #include <linux/kernel.h>; //printk()
- #include <linux/slab.h>; // kmalloc()
- #include <linux/fs.h>; // everything...
- #include <linux/errno.h>; // error codes
- #include <linux/types.h>; // size_t
- #include <asm/unistd.h>;
- #include <asm/ptrace.h>;
- #include <sys/syscall.h>;
- #include <linux/smp_lock.h>;
- #include <stdio.h>;
- #define MAC 0
- #define GLOBAL_DISABLE 1
- static int policy=GLOBAL_DISABLE;
- extern void *sys_call_table[];
- int (*o_delete_module)(char *name_user);
- asmlinkage int my_delete_module(char *name_user){
- int ret=0;
- if(policy == MAC){
- ret= o_delete_module(name_user);
- return ret;
- }
- return -EACCES;
- }
- int init_module(void)
- {
- o_delete_module=sys_call_table[__NR_delete_module];
- sys_call_table[__NR_delete_module] = my_delete_module;
- return 0;
- }
- void cleanup_module(void)
- {
- sys_call_table[__NR_delete_module] = o_delete_module;
- return;
- }
复制代码
测试:
- 如果policy=MAC,那么运行是正常的:
- [root@redhat73 root]#insmod dmod.o
- [root@redhat73 root]# lsmod 35,2-9 All
- Module Size Used by Tainted: PF
- dmod 852 0 (unused) <-----已经插入了
- pcnet32 15968 1 (autoclean)
- mii 2408 0 (autoclean) [pcnet32]
- ide-cd 30272 0 (autoclean)
- cdrom 32192 0 (autoclean) [ide-cd]
- vmhgfs 37184 4
- usb-uhci 24484 0 (unused)
- usbcore 73152 1 [usb-uhci]
- BusLogic 94592 2
- sd_mod 12864 4
- scsi_mod 108576 2 [BusLogic sd_mod]
- [root@redhat73 root]# rmmod dmod
- dmod: Permission denied
- 我们在rmmod的时候返回权限不允许,这是达到了我们驱动的功能了。
复制代码
但是,如果我想让策略失效,让它可以rmmod的时候,也就是交还给系统原有的o_delete_module调用时就panic了,怎么回事?调了半天还是这样,郁闷,大家讨论一下 |
|