[讨论]如何挂住delete_module后panic??

发表于:2007-05-26来源:作者:点击数: 标签:
实现一个不然任何用户rmmod驱动,当然有个策略让用户选择,如果策略失效那么就允许它rmmod,如果策略生效就返回权限不允许,代码如下: [code:1:6d2a46bb9c] /*bye4gle,forhookdelete_moduletest*/ /*gcc-O3-Wall-I/usr/src/linux/include-cdmod.c-odmod.o*/

实现一个不然任何用户rmmod驱动,当然有个策略让用户选择,如果策略失效那么就允许它rmmod,如果策略生效就返回权限不允许,代码如下:
[code:1:6d2a46bb9c]
/*by e4gle,for hook delete_module test*/
/*gclearcase/" target="_blank" >cc -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;
}

[/code:1:6d2a46bb9c]
测试:
[code:1:6d2a46bb9c]
如果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的时候返回权限不允许,这是达到了我们驱动的功能了。
[/code:1:6d2a46bb9c]
但是,如果我想让策略失效,让它可以rmmod的时候,也就是交还给系统原有的o_delete_module调用时就panic了,怎么回事?调了半天还是这样,郁闷,大家讨论一下

 e4gle 回复于:2003-07-17 13:17:20
大家测一下我的程序,讨论起来

 e4gle 回复于:2003-07-17 16:30:31
解决了!
当在模块中调用sys_delete_module成功之后,模块所在的
页面被释放,于是当它企图返回到原来模块中的调用点时,就会产生一个页不存在故障。解决的方法就是嵌入一些汇编指令,使它直接返回到system_call的返回点

[code:1:259d28356d]
asmlinkage int my_delete_module(char *name_user){ 
   ...
   asm(
   "movl %ebp,%esp\n\t"
   "popl %ebp\n\t"
   "jmp *o_delete_module");
}
[/code:1:259d28356d]
感谢linuxforum上的jkl!

原文转自:http://www.ltesting.net