模块的应用:让mkdir失效

it2022-05-09  20

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

转载于:https://www.cnblogs.com/sdphome/archive/2011/10/25/2224594.html


最新回复(0)