這一節我
們就講怎麼去捕獲系統調用,這相當於我們在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]儲存在一個函數指標中)
將系統調用表中的相應條目改變為你的新的系統調用。
儲存老的系統調用的函數指標是非常有用的,因為在新的系統調用中也許仍然
會用到老系統調用完成的功能。那麼,現在我們面對的問題是:為了做成某件事,
我該去捕獲哪個調用呢?請繼續關注本文。