免费注册 查看新帖 |

Chinaunix

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

截获读u盘的系统调用问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-05 09:41 |只看该作者 |倒序浏览
10可用积分
环境Redhat9.0 kernel2.4.20-8 VM虚拟机
源码如下:
#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 = "/mnt/usb/a"; ---------->这里一定a要是一个文件,是不是缺乏通用性 ???

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 *fp , char *buf , size_t count , loff_t *ppos)
{
ssize_t encryfile;

printk("<0> Congratulation! \n");
encryfile = orig_aim_read(fp ,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_op->read;
printk("read operation address:------- %p ------\n", filep->f_op->read);

filep->f_op->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;
filep->f_op->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);

输出如下:
Dec 4 21:19:36 localhost kernel: --------cc95fc68--------
Dec 4 21:19:36 localhost kernel: read() has switch!
Dec 4 21:19:47 localhost kernel: Congratulation! Get the function address !

看程序中标出的  :
      现在的问题是一定要 vi /mnt/usb/a 才会执行 printk("<0> Congratulation! \n")
那是不是对/mnt/usb/中其他文件的读写没有截获到呢? 那怎么才能截获到呢?

是不是因为对ext3系统的读写是通过 generic_file_read操作的,而此函数是被导出的,是固定的地址 所以在ext3文件系统操作正常,而usb的操作对应的函数没有被导出?

最佳答案

查看完整内容

file->f_op是在open时,从inode->i_fop赋值的; 而inode->i_fop,是在ext3_read_inode时, 从ext3_file_operations赋值的。 file只代表一个打开文件,改写它只影响该文件。 如果更改file->dentry->inode->i_fop,就不会这样了。

论坛徽章:
0
2 [报告]
发表于 2007-12-05 09:41 |只看该作者
file->f_op是在open时,从inode->i_fop赋值的; 而inode->i_fop,是在ext3_read_inode时, 从ext3_file_operations赋值的。

file只代表一个打开文件,改写它只影响该文件。  如果更改file->dentry->inode->i_fop,就不会这样了。

论坛徽章:
0
3 [报告]
发表于 2007-12-05 13:17 |只看该作者
非常感谢  我试试 。
我知道大师2年前对这个就有研究了。

论坛徽章:
0
4 [报告]
发表于 2007-12-05 13:57 |只看该作者

果然老鸟!!!! 确实如此,但是还有个问题?

/mnt/usb中一定要有个文件a 才可以 ,缺乏通用性 如果没有文件a ,那我这个模块就截获不到了啊?有什么解决办法?

[ 本帖最后由 petsatan 于 2007-12-5 14:05 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-12-05 14:01 |只看该作者

回复 #4 petsatan 的帖子

靠!! 我不知道!!別管我叫什麼夠日的「大師」,惡心誰呢!!

论坛徽章:
0
6 [报告]
发表于 2007-12-05 14:06 |只看该作者

呵呵

是不是打开a  就创建了一个读写的上下文 这时file_operations中read指针才不为空?

论坛徽章:
0
7 [报告]
发表于 2007-12-05 14:22 |只看该作者

回复 #6 petsatan 的帖子

是這樣的。 open一個文件時,其file被申請,並且用相關的值賦給它。  實在不行就在open時制定CREAT,然後exit時unlink它。 - 這實在不是個好主意,不過我沒有更好的思路了。

论坛徽章:
0
8 [报告]
发表于 2007-12-05 14:31 |只看该作者

非常感谢!!! 痛哭流涕啊!

您啊再帮我想想  这么做实在 有点拿不出去啊  要给人看的啊。

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
9 [报告]
发表于 2007-12-05 23:34 |只看该作者
fs有个连表吧,看能否去直接替换它的ops

论坛徽章:
0
10 [报告]
发表于 2007-12-06 09:45 |只看该作者

非常感谢 --- 流氓无产者

好象是有个 叫 filesystem_type的吧?

是这个吗?

您的意思是从链表中找到对应的文件系统,直接替换其中的ops指针?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP