通过对inode的修改对文件操作进行扩充

简介:

在open、read、write的参数中,mode的接口提供的比较方便,通过对fs/namei.c中vfs_create()中添加判断,解除对高位的事后修改就能传入到文件的i_mode。然而i_mode各个位基本已被使用完毕,使用新的组合的mode可能会将这一类文件变为“古怪的文件”,虽然能用open()、read()、write()进行操作,但是不能用vi等工具打开,原因可能是没有针对这种mode添加进一步的其他操作,用起来并不像S_IFREG这种普通文件这么方便。

  经指点和启发,使用这三个函数的flag位进行扩充是可行的,以下是实现方法。本文以2.6.13的内核为例。

  /include/asm-i386/fcntl.h中添加一个新的flag,为open()进行i_node的flag的填充提供判断依据,如#define O_SECRET 04。

  /include/linux/fs.h中Inode flags添加一个新的flag,这个是inode中保存的flag,为read和write提供判断的依据,如#define S_SECRET 1024。

  这里需要说明一下,创建inode时使用了i_op->create。之前读到这里时感觉线索已经断了,这个create的定义在哪里呢?一篇文章对其进行了解释,文件系统的挂载会自动用相应的操作替换这个i_op。点击访问原文

i_op的替换过程(以ext2为例)

  重新梳理一下flag的传递过程。open() --> sys_open() --> filp_open() --> open_namei() (此时填充到nd中) --> vfs_create() --> i_op->create (对应namei.c中ext3_create()),在这里对新定义的flag进行处理。判断逻辑:if ((nd->intent.open.flags & 1024) == 1024)  ...; 此时要将namei.c中添加#include <linux/namei.h>。

  之后对sys_write()进行扩充。

复制代码
if (file) {
        loff_t pos = file_pos_read(file);
        if ((file->f_dentry->d_inode->i_flags) & 1024) //新增异或加密功能
        {
            //printk("I'm in write...\n");
            test4_secret(buf,count);
            //printk("%s\n",buf);
            ret = vfs_write(file, buf, count, &pos);
        } else
            ret = vfs_write(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
复制代码

 

  加密函数如下,有一些bug没有修正,可能造成缓冲区溢出:

复制代码
int test4_secret(const char *buf, size_t count) {
    char key ='a';
    char *ptr;
    ptr = buf;
    while (count) {
        *ptr = *ptr ^ key;
        ptr ++;
        count --;
    }
    return 0;
}
复制代码

  sys_read()可以做类似处理,但这会造成整个写——读“透明”,无法判断是否成功加密。如果仅作验证,只修改sys_write()就行了。

测试程序





本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/archive/2012/06/04/2530249.html,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
存储
文件操作(下)(想要了解如何操作文件,那么看这一片就足够了!)
文件操作(下)(想要了解如何操作文件,那么看这一片就足够了!)
文件操作(下)(想要了解如何操作文件,那么看这一片就足够了!)
|
7月前
|
存储 编译器 Windows
文件操作(上)(想要了解如何操作文件,那么看这一片就足够了!)
文件操作(上)(想要了解如何操作文件,那么看这一片就足够了!)
|
7月前
|
C++ 安全
提高安全性,优雅实现拷贝与交换:C++中的Copy-and-Swap惯用法
拷贝并交换(Copy-and-Swap)是C++中实现赋值操作符和异常安全拷贝构造函数的技巧,涉及使用拷贝构造函数创建临时对象,然后交换数据以确保安全。C++11之前的通用方法,在C++11后可利用移动语义和右值引用优化。示例代码展示了如何运用此方法。
|
存储 安全 Linux
【看表情包学Linux】磁盘基础知识 | CHS 寻址 | 逻辑扇区 LBA | 索引节点 inode | 伪删除 inode bitmap 1→0
【看表情包学Linux】磁盘基础知识 | CHS 寻址 | 逻辑扇区 LBA | 索引节点 inode | 伪删除 inode bitmap 1→0
204 0
|
Unix
文件lseek操作产生空洞文件的方法
文件lseek操作产生空洞文件的方法
144 0
|
存储 缓存 算法
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
225 1
|
存储 Linux 索引
Linux文件系统inode的作用
前面学习了磁盘管理中的磁盘分区,以及逻辑卷,交换分区的创建,这篇文章将介绍一下我们在分区以及格式化时候用到的ext4文件系统,本盘文章的学习内容包括了解索引(index)和块(block)的作用。
145 0
|
存储 Linux 编译器
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
277 0
|
存储 Linux Windows
理解文件系统/inode的概念/磁盘/软硬链接
本文目标:⭐理解文件系统中inode的概念⭐认识软硬链接,对比区别。讲解了文件系统,加深了对文件的理解,与此同时对于磁盘的理解也有很大的帮助!
理解文件系统/inode的概念/磁盘/软硬链接
|
存储 关系型数据库 MySQL
Xdes&Inode&Seg Header(6) 独立表空间结构(三十二)
Xdes&Inode&Seg Header(6) 独立表空间结构(三十二)