当前位置:Linux教程 - Linux - 在Linux可加载内核模块中探秘(7)

在Linux可加载内核模块中探秘(7)



         第二部分:趣味LKM
    第一章:让mkdir失效
    作者:CoolBoy
    经过了枯燥的基础学习之后,下面我们就可以来看点好玩的花样了。这一节我们就讲怎么去捕获系统调用,这相当于我们在DOS平台下去捕获中断。

      谈到捕获系统调用,我们不得不为LKM这种机制感到担心,虽然它的本意只是用于扩展内核功能(特别是针对一些硬件驱动程序),但是,在黑客的手上,LKM也可以用来捕获系统调用,甚至修改它,让它去完成其他特别的任务。下面我们将列出一个实际的LKM程序,一当这个程序加载到内存中以后,整个操作系统就会禁止任何用户在磁盘上创建目录。程序如下:

    #define MODULE
    #define __KERNEL__

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

     extern void* sys_call_table[]; /*声明使用系统本身的系统调用表*/

     int (*orig_mkdir)(const char *path); /*用于保存原始的系统调用*/

     int hacked_mkdir(const char *path)
      {
       return 0; /*我们自己的系统调用将不会有任何动作*/
      }

     int init_module(void) /*初始化程序*/
      {
       orig_mkdir=sys_call_table[SYS_mkdir];
       sys_call_table[SYS_mkdir]=hacked_mkdir;
       return 0;
      }

     void cleanup_module(void) /*关闭程序*/
      {
       sys_call_table[SYS_mkdir]=orig_mkdir; /*恢复原始的系统调用*/
      }

      编译这个LKM程序,然后运行(具体方法见前面第二章《LKM的概念及hello,world程序》)。然后试着在磁盘上建立一个目录,结果你就会发现你创建不了目录了,因为创建目录的系统调用已经被改变,它不会做任何事情,只会给系统返回一个代表“完成”的“0”,呵呵。因为我们没有在这里打印任何信息,所以也不会出现错误提示。当然,再卸载此LKM后,我们又可以创建目录了。

      现在你应该发现,我们仅仅对系统调用表某些条目作了相应的改动,就可以捕获特定的系统调用了。总结一下捕获系统调用这类程序的一般步骤:

    在你的系统调用表中找到相应的条目(/sys/syscall.h)
    将老的系统调用保存起来(把sys_call_table[X]保存在一个函数指针中)
    将系统调用表中的相应条目改变为你的新的系统调用。
      保存老的系统调用的函数指针是非常有用的,因为在新的系统调用中也许仍然会用到老系统调用完成的功能。那么,现在我们面对的问题是:为了做成某件事,我该去捕获哪个调用呢?请继续关注本文。



    发布人:Crystal 来自:Linux专区