免费注册 查看新帖 |

Chinaunix

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

[内核模块] 截获文件操作,通过修改vfs文件系统的函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-20 15:52 |只看该作者 |倒序浏览
通过修改vfs文件系统的函数,截获文件操作,参考http://www.java123.net/detail/view-402565.html,但是fp->read地址是只读的,不能被修改 fp->read=new_read,什么方法可以解决呢?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-08-21 07:51 |只看该作者
回复 1# luocaizhu
通过修改vfs文件系统的函数,截获文件操作,参考http://www.java123.net/detail/view-402565.html,但是fp->read地址是只读的,不能被修改 fp->read=new_read,什么方法可以解决呢?


readonly的地址默认是不可写的。你可以通过修改cr0寄存器的值,禁止写保护。代码看起来如下:


unsigned long orig_cr0 = read_cr0();
write_cr0(orig_cr0 & (~0x10000));

/* Change read address */

write_cr0(orig_cr0);


   

论坛徽章:
0
3 [报告]
发表于 2013-08-21 14:26 |只看该作者
您好,谢谢,我的环境是X86_64,这上面怎么清零CR0呢,write_cr0(orig_cr0 & (~0x10000));需要怎么修改呢?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-08-21 15:21 |只看该作者
回复 3# luocaizhu
我的环境是X86_64,这上面怎么清零CR0呢,write_cr0(orig_cr0 & (~0x10000));需要怎么修改呢?


直接把我的代码搬上就能用。 write_cr0和read_cr0函数在内核代码里面有

   

论坛徽章:
0
5 [报告]
发表于 2013-08-21 15:25 |只看该作者
恩,write_cr0和read_cr0函数包含内核那个头文件呢?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
6 [报告]
发表于 2013-08-21 15:58 |只看该作者
回复 5# luocaizhu
恩,write_cr0和read_cr0函数包含内核那个头文件呢?


我这边一个使用了write_cr0代码的所有头文件,自己找吧

#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/unistd.h>
#include <asm/fcntl.h>
#include <asm/errno.h>
#include <linux/types.h>
#include <linux/dirent.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/syscalls.h>
#include <linux/sched.h>
#include <linux/dirent.h>
#include <linux/unistd.h>
#include <linux/file.h>
#include <linux/fdtable.h>
#include <linux/path.h>
#include <linux/dcache.h>
   

论坛徽章:
0
7 [报告]
发表于 2013-08-21 16:05 |只看该作者
问题解决了,非常感谢
其他有类似问题的同学可,参考代码http://memset.wordpress.com/2010 ... kernel-2-6-systems/

论坛徽章:
0
8 [报告]
发表于 2013-08-22 10:24 |只看该作者
我加载模块成功,但是好像没有进入到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;
}
这个函数里面,里面的打印信息“Congratulation! Now read file”没有打印出来,这个函数在加载模块的时候应该就调用吧?!

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
9 [报告]
发表于 2013-08-22 10:38 |只看该作者
回复 8# luocaizhu
这个函数里面,里面的打印信息“Congratulation! Now read file”没有打印出来,这个函数在加载模块的时候应该就调用吧?!


1. 你提供的代码连接没法打开,只提供这个函数,难道想让大家猜你的实现?

2. 因为不了解你的水平,所以不清楚你的没有打印是什么意思? 没有输出到控制台还是dmesg也看不到?
   

论坛徽章:
0
10 [报告]
发表于 2013-08-26 15:38 |只看该作者
在截获文件操作这个模块,如何获取文件的操作模式?file->f_mode的返回值为什么是int,如何转换为“read”,“write”?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP