Chinaunix首页 | 论坛 | 博客
  • 博客访问: 582078
  • 博文数量: 146
  • 博客积分: 5251
  • 博客等级: 大校
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-10 15:58
文章分类
文章存档

2010年(12)

2008年(129)

2007年(5)

我的朋友

分类: LINUX

2008-02-01 11:57:01

linux系统调用替换的简单实现

/*==================================
LKM study 
gcc -c open_sys.c
insmod open_sys.o
kernel verion 2.4.7.10 redhat7.2 
===================================*/


#define MODULE
#define __KERNEL__

#ifdef MODVERSIONS
#include 
#endif

#include 
#include 
#include

/* you can read entity.S*/
#define  __NR_open   5
#define  __NR_getuid 201 


int uid;  
asmlinkage int (*original_call)(const char *, int, int);

asmlinkage int (*getuid_call)();
asmlinkage int our_sys_open(const char *filename, 
                            int flags, 
                            int mode)
{
  char ch;
  if (uid == getuid_call()) {  
  printk("Opened file by %d: ", uid); 
    do {
           get_user(ch, filename+i);

           printk("%c", ch);
    } while (ch != 0);
    printk("\n");
  }
return original_call(filename, flags, mode);
}




extern void *sys_call_table[];

asmlinkage int sys_newsyscall(int n){
    printk("newsyscall: %d\n", n);
        return 0;
}

int init_module(){
  
 original_call = sys_call_table[__NR_open];
  
 sys_call_table[__NR_open] = our_sys_open;

 printk("Spying on UID:%d\n", uid);
 getuid_call = sys_call_table[__NR_getuid];

  

        return 0;
}

int cleanup_module(){
       
    if (sys_call_table[__NR_open] != our_sys_open) {
    printk("Aha,kernel hacking ");
       }

       sys_call_table[__NR_open] = original_call;
        return 0;
}
阅读(768) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~