模块的应用:让mkdir失效

这一节我
们就讲怎么去捕获系统调用,这相当于我们在DOS平台下去捕获中断。

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

#define MODULE
#define __KERNEL__

#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <asm/fcntl.h>
#include <asm/errno.h>
#include <linux/types.h>
#include <linux/dirent.h>
#include <sys/mman.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/malloc.h>

 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]保存在一个函数指针中)
将系统调用表中的相应条目改变为你的新的系统调用。
  保存老的系统调用的函数指针是非常有用的,因为在新的系统调用中也许仍然
会用到老系统调用完成的功能。那么,现在我们面对的问题是:为了做成某件事,
我该去捕获哪个调用呢?请继续关注本文。

你可能感兴趣的:(mkdir)