Chinaunix

标题: 系统调用的拦截 [打印本页]

作者: zhu_9527    时间: 2013-07-02 22:47
标题: 系统调用的拦截
有谁知道如何拦截系统的调用。比如open,write,execve,mkdir,rmdir,ls,等等。我现在拦截了mkdir,rmdir.但是通过加载内核模块拦截了open后,然后rmmod就显示错误,因为rmmod好像用到了open的调用。所以我自己也打不开文件了。所有的操作都不能进行,只有关机重启了。不知道怎么进行???求高手指点。本人在做个系统调用的拦截。菜鸟中的菜鸟,希望高手帮忙。。
作者: Godbach    时间: 2013-07-02 22:59
回复 1# zhu_9527

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

   
作者: zhu_9527    时间: 2013-07-03 08:57
求个链接?高手。
作者: Godbach    时间: 2013-07-03 13:07
回复 3# zhu_9527

这篇文章

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



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

作者: zhu_9527    时间: 2013-07-03 15:38
我能加下你的QQ吗??
作者: Godbach    时间: 2013-07-03 15:56
本帖最后由 Godbach 于 2013-07-03 15:56 编辑

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

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


   
作者: 卖萌犯法    时间: 2013-07-03 16:04
回复 1# zhu_9527

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


作者: zhu_9527    时间: 2013-07-03 16:50
确实没有继承原有的实现。请问怎么实现原有的实现呢?我的hack_open很简单。如下:
int hack_open(const char * path) //自定义一个替换函数,它将用来替换某个系统调用
{
        printk("<0> this is in hack_open\n");
        return 0;
}
作者: zhu_9527    时间: 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和经过密码认证的开放权限??怎么实现呢??
作者: zhu_9527    时间: 2013-07-03 19:08
给自己顶下。。。。。。大神快显灵。。。。。。
作者: Godbach    时间: 2013-07-03 23:23
回复 10# zhu_9527

操作系统大量的操作都要调用 open,不要轻易替换成你自己的。可以把入口改成你自己的函数,但是你的函数内要在调用kernel 原始的。

这样,你就可以在不影响系统的情况下个,做很多调试和分析工作。


   
作者: zhu_9527    时间: 2013-07-04 08:59
回复 12# Godbach

能说具体嗲吗?有代码最好,我不是理解你说的。我也知道open调用会牵涉到许多调用,不像mkdir那样。那网上拦截的open有什么意义呢?对了,那如何拦截某个命令呢?比如ls,strace,cat,或者拒绝访问某个文件等。。???
   
作者: Godbach    时间: 2013-07-04 09:40
回复 13# zhu_9527
代码不是示例中有吗?


   
作者: zhu_9527    时间: 2013-07-04 10:25
#define REPLACE(x) old_##x = my_table[__NR_##x];\
    my_table[__NR_##x] = new_##x
代码中的##x是什么意思??
作者: Godbach    时间: 2013-07-04 10:42
回复 15# zhu_9527

这是 C 语言的基础知识,要发挥自己的主观能动性。

没有什么东西,别人可以手把手的教你的。


   
作者: zhu_9527    时间: 2013-07-12 17:21
高手????




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2