在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专区