免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3031 | 回复: 2
打印 上一主题 下一主题

[讨论]如何挂住delete_module后panic?? [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-16 22:53 |只看该作者 |倒序浏览
实现一个不然任何用户rmmod驱动,当然有个策略让用户选择,如果策略失效那么就允许它rmmod,如果策略生效就返回权限不允许,代码如下:

  1. /*by e4gle,for hook delete_module test*/
  2. /*gcc -O3 -Wall -I/usr/src/linux/include -c dmod.c -o dmod.o*/

  3. #define MODULE
  4. #define __KERNEL__
  5. #define MODVERSIONS
  6. #define EXPORT_SYMTAB
  7. #ifdef MODVERSIONS
  8. #include <linux/modversions.h>;
  9. #endif
  10. #include <linux/config.h>;
  11. #include <linux/module.h>;

  12. #include <linux/kernel.h>;   //printk()
  13. #include <linux/slab.h>;   // kmalloc()
  14. #include <linux/fs.h>;       // everything...
  15. #include <linux/errno.h>;    // error codes
  16. #include <linux/types.h>;    // size_t
  17. #include <asm/unistd.h>;
  18. #include <asm/ptrace.h>;
  19. #include <sys/syscall.h>;
  20. #include <linux/smp_lock.h>;
  21. #include <stdio.h>;

  22. #define MAC 0
  23. #define GLOBAL_DISABLE 1

  24. static int policy=GLOBAL_DISABLE;
  25. extern void *sys_call_table[];

  26. int (*o_delete_module)(char *name_user);

  27. asmlinkage int my_delete_module(char *name_user){
  28.         int ret=0;

  29.         if(policy == MAC){
  30.                 ret= o_delete_module(name_user);
  31.                 return ret;
  32.         }
  33.         return -EACCES;
  34. }

  35. int init_module(void)
  36. {
  37.         o_delete_module=sys_call_table[__NR_delete_module];
  38.         sys_call_table[__NR_delete_module] = my_delete_module;
  39.         return 0;
  40. }

  41. void cleanup_module(void)
  42. {
  43.         sys_call_table[__NR_delete_module] = o_delete_module;
  44.         return;
  45. }

复制代码

测试:

  1. 如果policy=MAC,那么运行是正常的:
  2. [root@redhat73 root]#insmod dmod.o
  3. [root@redhat73 root]# lsmod                                                                                 35,2-9        All
  4. Module                  Size  Used by    Tainted: PF
  5. dmod                     852   0  (unused)  <-----已经插入了
  6. pcnet32                15968   1  (autoclean)
  7. mii                     2408   0  (autoclean) [pcnet32]
  8. ide-cd                 30272   0  (autoclean)
  9. cdrom                  32192   0  (autoclean) [ide-cd]
  10. vmhgfs                 37184   4
  11. usb-uhci               24484   0  (unused)
  12. usbcore                73152   1  [usb-uhci]
  13. BusLogic               94592   2
  14. sd_mod                 12864   4
  15. scsi_mod              108576   2  [BusLogic sd_mod]
  16. [root@redhat73 root]# rmmod dmod
  17. dmod: Permission denied
  18. 我们在rmmod的时候返回权限不允许,这是达到了我们驱动的功能了。
复制代码

但是,如果我想让策略失效,让它可以rmmod的时候,也就是交还给系统原有的o_delete_module调用时就panic了,怎么回事?调了半天还是这样,郁闷,大家讨论一下

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-07-17 13:17 |只看该作者

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

大家测一下我的程序,讨论起来

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2003-07-17 16:30 |只看该作者

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

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


  1. asmlinkage int my_delete_module(char *name_user){
  2.    ...
  3.    asm(
  4.    "movl %ebp,%esp\n\t"
  5.    "popl %ebp\n\t"
  6.    "jmp *o_delete_module");
  7. }
复制代码

感谢linuxforum上的jkl!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP