免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7280 | 回复: 11

请教文件系统过滤驱动开发的大体步骤 [复制链接]

论坛徽章:
0
发表于 2005-04-29 14:38 |显示全部楼层
工作需要,开发文件系统上层过滤,比如说截获对磁盘的写操作,先
加密再写到磁盘,读的时候要解密再传给操作系统.要实现这样一来功能应该怎么做.有没有些参考资料推荐. windows下面介绍这东西挺多,反倒是linux下面的好像资料不多见.希望不吝赐教.

论坛徽章:
0
发表于 2005-04-29 21:32 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

[quote]原帖由 "viton_xuan" 发表:
工作需要,开发文件系统上层过滤,比如说截获对磁盘的写操作,先
加密再写到磁盘,读的时候要解密再传给操作系统.要实现这样一来功能应该怎么做.有没有些参考资料推荐. windows下面介绍这东西挺多,反倒是linux下面

论坛徽章:
0
发表于 2005-04-29 23:22 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

若不想改,  就截获 它的系统调用

论坛徽章:
0
发表于 2005-04-30 09:43 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤


如何截获?
我只想到修改应用层的动态连接库、系统调用和驱动程序这三种方法,但这些都需要修改原来的东西。有没有简单一些的,不用修改源码的那种?

论坛徽章:
0
发表于 2005-04-30 21:14 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

原帖由 "ltqin" 发表:

如何截获?
我只想到修改应用层的动态连接库、系统调用和驱动程序这三种方法,但这些都需要修改原来的东西。有没有简单一些的,不用修改源码的那种?

你先写好自己的函数, 然后找到(运行时的) sys_call_table, 那里存放着系统调用的指针, 你修改指针, 指向你的函数, 你的函数来调用原来的函数

论坛徽章:
0
发表于 2005-05-01 13:36 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

听君一句话,胜读10天书

论坛徽章:
0
发表于 2005-05-05 00:59 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

意思大概明白,但是“找到(运行时的) sys_call_table”如何实现
有没有什么推荐资料

论坛徽章:
0
发表于 2005-05-05 02:05 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

以前写的一个截获系统调用的模块,这个模块有很好的移植性,适应于2.4和2.6内核。

#include <linux/kernel.h>;
#include <linux/module.h>;
#include <linux/init.h>;
#include <linux/sched.h>;
#include <asm/unistd.h>;

MODULE_LICENSE("GPL";

unsigned long *sys_call_table=NULL;
asmlinkage int (*orig_mkdir)(const char *,int);

struct _idt
{
  unsigned short offset_low,segment_sel;
  unsigned char reserved,flags;
  unsigned short offset_high;
};

unsigned long *getscTable(){
        unsigned char idtr[6],*shell,*sort;
        struct _idt *idt;
        unsigned long system_call,sct;
        unsigned short offset_low,offset_high;
        char *p;
        int i;                                                                                                                              
        /* get the interrupt descriptor table */
                                                                                                                              
        __asm__("sidt %0" : "=m" (idtr));
                                                                                                                              
        /* get the address of system_call */
        idt=(struct _idt*)(*(unsigned long*)&idtr[2]+8*0x80);
        offset_low = idt->;offset_low;
        offset_high = idt->;offset_high;
        system_call=(offset_high<<16)|offset_low;
                                                                                                                              
        shell=(char *)system_call;
        sort="\xff\x14\x85";
                                                                                                                              
        /* get the address of sys_call_table */
   
        for(i=0;i<(100-2);i++)
                if(shell==sort[0]&&shell[i+1]==sort[1]&&shell[i+2]==sort[2])
                        break;                                                                                                                             
        p=&shell;
        p+=3;
        sct=*(unsigned long*)p;
        
        return (unsigned long*)(sct);
}

asmlinkage int hacked_mkdir(const char * pathname, int mode){
        printk("ID %d called sys_mkdir !\n",current->;pid);
        return orig_mkdir(pathname,mode);
}

static int __init find_init(void){
        sys_call_table = getscTable();
        orig_mkdir=(int(*)(const char*,int))sys_call_table[__NR_mkdir];
        sys_call_table[__NR_mkdir]=(unsigned long)hacked_mkdir;
        return 0;
}

static void __exit find_cleanup(void){
        sys_call_table[__NR_mkdir]=(unsigned long)orig_mkdir;
}

module_init(find_init);
module_exit(find_cleanup);

论坛徽章:
0
发表于 2005-05-05 06:46 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

如单单是截获文件系统相关的系统调用,还有一个方法。这种方法与sys_call_table无关,而是作用于vfs文件系统。

Adore-ng rootkit提供了一种方法:可以通过修改vfs的函数跳转表来截获系统调用。
下面是一个截获readdir系统调用的模块例子:

#include <linux/sched.h>;
#include <linux/module.h>;
#include <linux/kernel.h>;
#include <linux/init.h>;
#include <linux/fs.h>;
#include <linux/file.h>;

MODULE_LICENSE("GPL";

char *root_fs="/";

typedef int (*readdir_t)(struct file *,void *,filldir_t);
readdir_t orig_root_readdir=NULL;

int myreaddir(struct file *fp,void *buf,filldir_t filldir)
{
        int r;
        printk("<1>;You got me partner!\n";
        r=orig_root_readdir(fp,buf,filldir);
        return r;
}

int patch_vfs(const char *p,readdir_t *orig_readdir,readdir_t new_readdir)
{
        struct file *filep;
        filep=filp_open(p,O_RDONLY,0);
        if(IS_ERR(filep))
                return -1;
        if(orig_readdir)
                *orig_readdir=filep->;f_op->;readdir;

        filep->;f_op->;readdir=new_readdir;
        filp_close(filep,0);
        return 0;
}

int unpatch_vfs(const char *p,readdir_t orig_readdir)
{
        struct file *filep;
        filep=filp_open(p,O_RDONLY,0);
        if(IS_ERR(filep))
                return -1;
        filep->;f_op->;readdir=orig_readdir;
        filp_close(filep,0);
        return 0;
}

static int patch_init(void)
{
        patch_vfs(root_fs,&orig_root_readdir,myreaddir);         
        printk("<1>;VFS is patched!\n";
        return 0;
}
static void patch_cleanup(void)
{
        unpatch_vfs(root_fs,orig_root_readdir);
        printk("<1>;VFS is unpatched!\n";
}
module_init(patch_init);
module_exit(patch_cleanup);

论坛徽章:
0
发表于 2005-05-05 13:46 |显示全部楼层

请教文件系统过滤驱动开发的大体步骤

原帖由 "richardhesidu" 发表:

shell=(char *)system_call;
       sort="\xff\x14\x85";
                                                                                                                              
       /* get the address of sys_call_table */
   
       for(i=0;i<(100-2);i++)
               if(shell==sort[0]&&shell[i+1]==sort[1]&&shell[i+2]==sort[2])
                       break;               

"\xff\x14\x85"是什么意思?为什么找到它就找到系统调用表的地址?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP