[讨论]如何挂住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*/
/*g
clearcase/" target="_blank" >cc -O3 -Wall -I/usr/src/linux/include -c dmod.c -o dmod.o*/
#define MODULE
#define __KERNEL__
#define MODVERSIONS
#define E
XPORT_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 -EA
CCES;
}
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
|