当前位置:  技术问答>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是通过系统调用进入内核的,所以可以访问它本身的用户空间的地址。有些进程,是不能访问用户空间的资源,比如有些中断处理程序,因为它没有对应的用户空间。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 编写lkm时的内存分配
  • 100分答谢:谁会Linux下的LKM的编程
  • 用LKM写一个文件系统 挂载到系统中方法
  • 我的lkm程序,insmod时提示内核版本不对,怎样才能成功升级内核?
  • 一个关于LKM的简单问题
  • LKM问题,动态查找sys_call_table相关
  • LKM 中一个例子的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3