热门关键字:  PHP  Cisco  seo  网络广告 虚拟主机 中文域名
当前位置 :| 主页>服务器>Linux服务器>

Linux系统可卸载内核模块完全指南(中)

来源:Silversand.net 作者:IHH 时间:2005-11-09 点击:

这就是所有你需要的。当然,你必须加一些代码来隐藏这个模块,这个应该没有问题。在使得这个模块不可以被卸载以后,一个hacker只可以改变记录文件了。但是你也可以把你的记录文件存到一个不可被接触的文件中去(看2.1来获得相关的技巧).当然,你也可以拦截sys_init_module(...)来显示每一个模块。这不过是一个品位问题。

3.1.2 一个密码保护的create_module(...)的例子

这一节我们会讨论如何给一个模块的加载加入密码校验。我们需要两件事情来完成这项任务:

一个检查模块加载的方法(容易)

一个校验的方法(相当的难)

第一点是十分容易实现的。只需要拦截sys_create_module(...),然后检查一些变量,内核就会知道这次加载是否合法了。

但是如何进行校验呢?我必须承认我没有花多少时间在这个问题上。因此这个方案并不是太好。但是这是一篇LKM的文章,因此,使用你的头脑去想一些更好的办法。我的方法是,拦截stat(...)系统调用。当你敲任何命令时,系统需要搜索他,stat就会被调用。

因此,在敲命令的同时敲一个密码,LKM会在拦截下的stat系统调用中检查他.[我知道这很不安全;甚至一个Linuxstarter都可以击败这种机制.但是(再一次的)这并不是这里的重点....].看看我的实现(我从plaguez的一个类似的LKM中直接抢过来了很多现存的代码....)

#define MODULE

#define __KERNEL__

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

extern void* sys_call_table[];

/*如果lock_mod=1 就是允许加载一个模块*/

int lock_mod=0;

int __NR_myexecve;

/*拦截create_module(...)和stat(...)系统调用*/

int (*orig_create_module)(char*, unsigned long);

int (*orig_stat) (const char *, struct old_stat*);

char *strncpy_fromfs(char *dest, const char *src, int n)

{

char *tmp = src;

int compt = 0;

do {

dest[compt++] = __get_user(tmp++, 1);

}

while ((dest[compt - 1] != '\0') && (compt != n));

return dest;

}

int hacked_stat(const char *filename, struct old_stat *buf)

{

char *name;

int ret;

char *password = "password";

/*yeah,一个很好的密码*/

name  = (char *) kmalloc(255, GFP_KERNEL);

(void) strncpy_fromfs(name, filename, 255);

/*有密码么?*/

if (strstr(name, password)!=NULL)

{

/*一次仅允许加载一个模块*/

lock_mod=1;

kfree(name);

return 0;

}

else

{

kfree(name);

ret = orig_stat(filename, buf);

}

return ret;

}

int hacked_create_module(char *name, unsigned long size)

{

char *kernel_name;

char hide[]="ourtool";

int ret;

if (lock_mod==1)

{

lock_mod=0;

ret=orig_create_module(name, size);

return ret;

}

else

{

printk("<1>MOD-POL : Permission denied !\n");

return 0;

}

return ret;

}

int init_module(void)

/*初始化模块*/

{

__NR_myexecve = 200;

while (__NR_myexecve != 0 && sys_call_table[__NR_myexecve] != 0)

__NR_myexecve--;

sys_call_table[__NR_myexecve]=sys_call_table[SYS_execve];

orig_stat=sys_call_table[SYS_prev_stat];

sys_call_table[SYS_prev_stat]=hacked_stat;

orig_create_module=sys_call_table[SYS_create_module];

sys_call_table[SYS_create_module]=hacked_create_module;

printk("<1>MOD-POL LOADED...\n");

return 0;

}

void cleanup_module(void)

/*卸载模块*/

{

sys_call_table[SYS_prev_stat]=orig_stat;

sys_call_table[SYS_create_module]=orig_create_module;

}



最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
赞助商连接