免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4015 | 回复: 16

[内核模块] 系统调用的拦截 [复制链接]

论坛徽章:
0
发表于 2013-07-02 22:47 |显示全部楼层
有谁知道如何拦截系统的调用。比如open,write,execve,mkdir,rmdir,ls,等等。我现在拦截了mkdir,rmdir.但是通过加载内核模块拦截了open后,然后rmmod就显示错误,因为rmmod好像用到了open的调用。所以我自己也打不开文件了。所有的操作都不能进行,只有关机重启了。不知道怎么进行???求高手指点。本人在做个系统调用的拦截。菜鸟中的菜鸟,希望高手帮忙。。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2013-07-02 22:59 |显示全部楼层
回复 1# zhu_9527

我之前总结过一次拦截系统调用的文章,LZ 看到没有。可以去置顶精华帖里面找一下。

   

论坛徽章:
0
发表于 2013-07-03 08:57 |显示全部楼层
求个链接?高手。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2013-07-03 13:07 |显示全部楼层
回复 3# zhu_9527

这篇文章

http://bbs.chinaunix.net/thread-1946913-1-1.html



   

论坛徽章:
0
发表于 2013-07-03 14:56 |显示全部楼层
我把你的代码直接编译的有错误。链接里的是完整的代码吗??还有我想问你下,拦截open系统调用后,我自己还能操作吗?因为我跟踪了open的执行情况,strace open发现它首先调用execve,还有read,write等,我自己写了一个劫持mkdir可以,但是像open,write,read,我insmod后就死机,像windows的蓝屏一样。这是什么情况?

论坛徽章:
0
发表于 2013-07-03 15:38 |显示全部楼层
我能加下你的QQ吗??

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2013-07-03 15:56 |显示全部楼层
本帖最后由 Godbach 于 2013-07-03 15:56 编辑

回复 5# zhu_9527
使用别人的 kernel module 在自己的环境中编译有错误是很常见的问题。

你要确定一下你的 kernel 版本是否和实例中的一致,然后再看具体错误是什么。


   

论坛徽章:
0
发表于 2013-07-03 16:04 |显示全部楼层
回复 1# zhu_9527

1.你的新系统调用中是否继承了原有实现,如果原实现未被继承,肯定会出现错误,毕竟还有大量的用户应用程序需要使用这些系统调用。
2.你的新系统调用实现部分都做了些什么,是否本身就有错误的代码,从而导致内核崩溃。

论坛徽章:
0
发表于 2013-07-03 16:50 |显示全部楼层
确实没有继承原有的实现。请问怎么实现原有的实现呢?我的hack_open很简单。如下:
int hack_open(const char * path) //自定义一个替换函数,它将用来替换某个系统调用
{
        printk("<0> this is in hack_open\n");
        return 0;
}

论坛徽章:
0
发表于 2013-07-03 17:08 |显示全部楼层
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <asm/unistd.h>

  4. MODULE_LICENSE("GPL");

  5. // addr of sys_call_talbe = 0xc15b6020,这个值是在/boot目录下,System.map或是以System.map打头的文件中找到的。
  6. void ** sys_call_table = (void **)0xc15b6020;

  7. int (*orig_open)(const char *path); //定义一个函数指针,用于保存挟制以前的初始值

  8. int hack_open(const char * path) //自定义一个替换函数,它将用来替换某个系统调用
  9. {
  10.         printk("<0> this is in hack_open\n");
  11.         return 0;
  12. }
  13. unsigned int clear_cr0(void) // 将WP清0,并返回清0前的值
  14. {
  15.         unsigned int cr0 = 0;
  16.         unsigned int ret;
  17.         asm volatile("movl %%cr0, %%eax"
  18.                 :"=a"(cr0)
  19.                 );
  20.         ret = cr0;
  21.         cr0 &= 0xfffeffff;
  22.         asm volatile("movl %%eax, %%cr0"
  23.                 :
  24.                 :"a"(cr0)
  25.                 );
  26.                 return ret;
  27. }
  28. void setback_cr0(unsigned int val) // 将cr0设为val
  29. {
  30.         asm volatile("movl %%eax, %%cr0"
  31.                 :
  32.                 :"a"(val)
  33.                 );
  34. }
  35. static int __init begin(void)
  36. {
  37.         unsigned int cr0;
  38.         orig_open = sys_call_table[__NR_open]; //保存open原来的的地址
  39.         printk("<0> sys_call_table[__NR_open] = %x\n",  (unsigned int)sys_call_table[__NR_open]);

  40.         cr0 = clear_cr0();
  41.         sys_call_table[__NR_open] = hack_open; //挟持
  42.         setback_cr0(cr0);
  43.    
  44.         printk("<0> sys_call_table[__NR_open] = %x\n", (unsigned int)sys_call_table[__NR_open]);
  45.   
  46.         return 0;
  47. }
  48. static void __exit end(void)
  49. {
  50.         int cr0;
  51.         cr0 = clear_cr0();
  52.         sys_call_table[__NR_open] = orig_open; //恢复open系统调用
  53.         setback_cr0(cr0);  
  54. }
  55. module_init(begin);
  56. module_exit(end);
复制代码
贴上源代码,求大神指点。。。或者说open只对root和经过密码认证的开放权限??怎么实现呢??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP