免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2453 | 回复: 3
打印 上一主题 下一主题

[系统] 通过修改vfs文件系统的函数跳转表来截获NFS系统调用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-25 22:31 |只看该作者 |倒序浏览
本帖最后由 liu_19870919 于 2013-04-25 22:33 编辑

大家好,最近的工作需要我重写一下read系统调用。我通过 http://bbs.chinaunix.net/forum.p ... ;page=1#pid14608041 介绍的方法成功的替换了ext3的read系统调用。
代码如下:
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/file.h>

char *aim = "/root/tmp";

MODULE_AUTHOR("petsatan@sohu");
MODULE_DESCRIPTION("Get the kernel function address ");
MODULE_LICENSE("GPL");

typedef ssize_t (*read_t)(struct file *, char *, size_t, loff_t *);
read_t orig_aim_read = NULL;

ssize_t encry_read(struct file *file , char *buf , size_t count , loff_t *ppos)
{       
        printk("Congratulation! Now read file\n");

         ssize_t encryfile;
        encryfile = orig_aim_read(file ,buf ,count ,ppos);
        return encryfile;
}

int switch_read(const char *p , read_t *orig_read , read_t new_read)
{
         struct file *filep;
         filep = filp_open(p , O_RDONLY , 0);
         if(IS_ERR(filep))
        return -1;
         if(orig_read)
        *orig_read = filep->f_dentry->d_inode->i_fop->read;

         struct file_operations *fp =filep->f_dentry->d_inode->i_fop;
         fp->read=new_read;
         filp_close(filep,0);
        return 0;
}

int unswitch_read(const char *p, read_t orig_read)
{
         struct file *filep;
         filep = filp_open(p , O_RDONLY , 0);
         if(IS_ERR(filep))
        return -1;
         struct file_operations *fp = filep->f_dentry->d_inode->i_fop;
         fp->read=orig_read;
         filp_close(filep,0);
        return 0;
}

static int encryfile_init(void)
{
         switch_read(aim , &orig_aim_read , encry_read);
         printk(" <1>read() has switch!\n");
         return 0;
}

static void encryfile_cleanup(void)
{
         unswitch_read(aim, orig_aim_read);
         printk("<2>read() has unswitch! \n");
}

module_init(encryfile_init);
module_exit(encryfile_cleanup);

/root/tmp是本地磁盘的一个文件。

但是当我将/root/tmp改变为nfs文件系统上的文件(比如/mnt/nfs/tmp)的时候,只有操作文件/mnt/nfs/tmp时候,才调用我写的read,操作nfs上的其他文件的时候,并不调用新写的read。请大家帮我分析一下原因好吗?

论坛徽章:
0
2 [报告]
发表于 2013-05-02 14:22 |只看该作者
我的解决办法是将aim 文件设为nfs文件系统根目录下的文件,这样的话对nfs文件系统的调用都将被替换。希望可以帮到后来人。

论坛徽章:
0
3 [报告]
发表于 2013-09-04 14:28 |只看该作者
您好,我现在的工作跟你一样,也用这种方法截获文件操作,但是你怎么把截获的IO的信息记录下来的呢?

论坛徽章:
0
4 [报告]
发表于 2013-10-22 23:13 |只看该作者
回复 3# luocaizhu
hello,我使用了netlink,希望可以帮助到你。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP