当前位置: 技术问答>linux和unix
LKM遇到问题,请问这是为什么?
来源: 互联网 发布时间:2015-01-15
本文导语: 如何将核心转换到用户空间 我们有着许多优势——因为我们是在核心内编程,但同时也有一些不足,系统调用从用户模式取得参数(它通常被如libc之类的wrappers包装着),但我们的LKM是在内核空间运行的。在II部分你可以看到...
如何将核心转换到用户空间
我们有着许多优势——因为我们是在核心内编程,但同时也有一些不足,系统调用从用户模式取得参数(它通常被如libc之类的wrappers包装着),但我们的LKM是在内核空间运行的。在II部分你可以看到检测一个systemcall 的参数是非常重要的——这样才能使它正确运行。那么,我们如何才能使用户模式的参数传递到核心中呢?
解决办法 : 我们做一个转换.
int sys_chdir (const char *path)
想象一下,系统调用了它,而我们在中途将其截获(具体方法将在II描述),我们需要检查用户希望设定的路径,所以我们要得到const char *path的值,如果你想用下面的方式打印出path变量的话:
printk("%sn", path);
在这里你将碰上大问题了……
记住你是在内核空间里,你无法轻易地象平常那样读取用户的内存空间,还好,在Pharck 52 期中, plaguez给了我们一个方法,它用核心模式函数(uses a kernel mode function)(宏)来找回用户内存空间的字节:
#include
get_user(pointer);
这个函数指向我们的 *path 的位置,可以帮助我们从用户模式获取需要的内容到内核空间,可以观察下面由 plaguez提供的,将某strings从用户模式移到内核空间的例子:
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] != '') && (compt != n));
return dest;
}
按照这个理论,下面的代码test.c在内核态读path的时候应该出错才对,但错误并没有发生,得到了想要的效果。(环境:rh7.2)
//test.c
#define MODULE
#define __KERNEL__
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern void* sys_call_table[]; /*sys_call_table is exported, so we can access it*/
int (*orig_mkdir)(const char *path); /*the original systemcall*/
int hacked_mkdir(const char *path)
{
/* char *tmp=path;
char *kpath;
int compt = 0;
do {
kpath[compt++] = __get_user(tmp++, 1);
}while (tmp[compt - 1] != '');
printk(KERN_DEBUG"Hooking is OKnthe user wanna create a dirctory %sn",kpath);
*/
printk(KERN_DEBUG"Hooking is OKnthe user wanna create a dirctory %sn",path);//问题就在这里!!!!!
return 0; /*everything is ok, but he new systemcall does nothing*/
} int init_module(void) /*module setup*/
{
orig_mkdir=sys_call_table[SYS_mkdir];
sys_call_table[SYS_mkdir]=hacked_mkdir;
return 0;
}
void cleanup_module(void) /*module shutdown*/
{
sys_call_table[SYS_mkdir]=orig_mkdir; /*set mkdir syscall to the origal one*/
}
$gcc -o2 -o test.o -c test.c
$insmod test.o
$mkdir temp
$dmesg |tail -n1
the user wana create a dirctory temp
$
|
是可以把字符path给打印出来。
内核是可以访问用户空间的地址的,但是用户进程就不可以访问内核资源(除了通过系统调用)。一个进程有2中状态一个是核心态还有一个是用户态,mkdir是通过系统调用进入内核的,所以可以访问它本身的用户空间的地址。有些进程,是不能访问用户空间的资源,比如有些中断处理程序,因为它没有对应的用户空间。
内核是可以访问用户空间的地址的,但是用户进程就不可以访问内核资源(除了通过系统调用)。一个进程有2中状态一个是核心态还有一个是用户态,mkdir是通过系统调用进入内核的,所以可以访问它本身的用户空间的地址。有些进程,是不能访问用户空间的资源,比如有些中断处理程序,因为它没有对应的用户空间。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。