当前位置: 首页 > news >正文

操作系统-添加文件加密系统

一、实验目的和要求

文件系统是操作系统中最直观的部分,因为用户可以通过文件直接地和操作系统交互, 操作系统也必须为用户提供数据计算、数据存储的功能。本实验通过添加一个文件系统,进 一步理解 Linux 中的文件系统原理及其实现。

  • 深入理解操作系统文件系统原理
  • 学习理解 Linux 的 VFS 文件系统管理技术
  • 学习理解 Linux 的 ext2 文件系统实现技术
  • 设计和实现加密文件系统

二、实验内容

添加一个类似于 ext2,但对磁盘上的数据块进行加密的文件系统 myext2。实验主要内
容:

  • 添加一个类似 ext2 的文件系统 myext2
  • 修改 myext2 的 magic number
  • 添加文件系统创建工具
  • 添加加密文件系统操作,包括 read_crypt, write_crypt,使其增加对加密数据的
    读写。

三、操作方法和实验步骤

1. 添加一个类似 ext2 的文件系统 myext2

a) 将linux/fs文件夹下的ext2复制为myext2,并将文件夹中的ext2.h重命名为myext2.h
b) 进入 Linux 内核源码文件夹复制 ext2_fs.h, ext2_atomic.h, ext2_atomic_setbit.h 并重
命名
c) 在 linux/fs/myext2 文件夹中编辑将将原来“EXT2”替换成“MYEXT2”;使用脚本substitute.sh
(注意脚本文件只能执行一遍,实验中为了截图执行了两次脚本文件导致后续编译出了问题,只能回去修改脚本文件再将mymy替换为my)
在这里插入图片描述

f) 用编辑器的替换功能,把/lib/modules/ ( u n a m e − r ) / b u i l d / i n c l u d e / l i n u x / m y e x t 2 f s . h , 和 / l i b / m o d u l e s / (uname -r)/build/include/linux/myext2_fs.h, 和 /lib/modules/ (unamer)/build/include/linux/myext2fs.h,/lib/modules/(uname -r)/build/include/asm-generic/bitops/ 下的 myext2-atomic.h 与
myext2-atomic-setbit.h 文件中的“ext2”、“EXT2”分别替换成“myext2”、“MYEXT2”
在这里插入图片描述

g) 在/lib/modules/KaTeX parse error: Expected 'EOF', got '#' at position 53: …bitops.h 文件中添加:#̲include <asm-g…(uname -r)/build/arch/x86/include/asm/bitops.h 文件中添加:#include
<asm-generic/bitops/myext2-atomic-setbit.h>
i) 在/lib/modules/$(uname -r)/build/include/uapi/linux/magic.h 文件中添加:#define
MYEXT2_SUPER_MAGIC 0xEF53
在这里插入图片描述

j) 修改 myext2/Makefile 文件
在这里插入图片描述

k) 在 myext2 目录下执行命令:#make
在这里插入图片描述

l) 编译好模块后,使用 insmod 命令加载模块,并查看一下 myext2 文件系统是否加载
成功
在这里插入图片描述

m) 输入命令cd先把当前目录设置成主目录,对添加的myext2文件系统测试命令如下:
在这里插入图片描述

1). 创建大小为 1M 的,名字为 myfs 的,内容全为 0 的文件
在这里插入图片描述

2). 将 myfs 格式化成 ext2 文件系统
在这里插入图片描述

3). 将 myfs 通过 loop 设备 mount 到/mnt 目录下,使用参数是-t myext2,并检查当前系
统的 mount 情况。
在这里插入图片描述
在这里插入图片描述

这一步时提示需要root权限,通过su root进入超级用户模式再cd进入主目录。

4).umount刚才挂载的文件系统,再使用mount参数 -t ext2挂载到ext2文件系统,查看结果:
在这里插入图片描述

5). remove myext2模块
在这里插入图片描述

注意先umount再卸载,否则会提示有设备忙,无法成功卸载。

  1. 修改 myext2 的 magic number
    a) 找到 myext2 的 magic number,并将其改为 0x6666
    在这里插入图片描述

b) 重新编译内核,并使用insmod命令安装模块
c) 编译并执行changeMN.c, 看到更换magic number成功的输出:
在这里插入图片描述

d) 进入测试:
在这里插入图片描述
在这里插入图片描述

可以看到成功挂载到了myext2文件系统
e) 尝试挂载到ext2系统,提示mount出错,这是因为两个文件系统magic number不同导致的。
在这里插入图片描述

f) umount 并使用rmmod myext2 卸载模块

2.3 修改文件系统操作
a) 对于 mknod 函数,在 fs/myext2/namei.c 中进行如下修改:
在这里插入图片描述

b) 再用 make 重新编译内核模块,使用命令 insmod 安装编译好的 myext2.ko 内核模块
c) 在 shell 下执行如下测试程序:
在这里插入图片描述

第一行命令:将 fs.new mount 到/mnt 目录下。
第二行命令:进入/mnt 目录。
第三行命令:创建一个名为 myfifo 的命名管道。
程序返回错误号 EPERM 结果给 shell,shell 捕捉到这个错误后打出的出错信息。如果是在图形界面下使用虚拟控制台,printk 打印出来的信息不一定能再终端上显示出来,但是可以通过命令 dmesg | tail 来观察。
在这里插入图片描述

可见实验取得了预期的效果。

  1. 添加文件系统创建工具
    a) 在myext2目录下编写脚本文件 mkfs.myext2
    在这里插入图片描述

第一行 表明是 shell 程序。
第三行 如果有程序用了/dev/loop2 了,就将它释放。
第四行 用 losetup 将第一个参数代表的文件装到/dev/loop2 上
第五行 用 mkfs.ext2 格式化/dev/loop2。也就是用 ext2 文件系统格式格式化我们的文件 系统。
第六行 将文件系统的头 2K 字节的内容取出来,复制到 tmpfs 文件里面。
第七行 调用程序 changeMN 读取 tmpfs,复制到 fs.new,并且将 fs.new 的 magic number 改成 0x6666
第八行 再将 2K 字节的内容写回去。
第九行 把我们的文件系统从 loop2 中卸下来。
第十行 将临时文件删除
测试:

# dd if=/dev/zero of=myfs bs=1M count=1 
# ./mkfs.myext2 myfs  (或 sudo bash mkfs.myext2 myfs ) 
# sudo mount –t myext2  –o loop ./myfs  /mnt 
# mount 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由红框中的内容可见文件系统mount成功。

  1. 修改加密文件系统的 read 和 write 操作
    未加密前:
    在这里插入图片描述

文件中的内容为明文。
方法一:
根据实验指导,编辑myext2_file_read_iter和myext2_file_write_iter函数,修改后的函数如下:
在这里插入图片描述

需要注意的是,因为fs访问的buffer是用户的地址,在我使用的内核版本中中会有保护,禁止内核直接访问用户数据,所以需要用copy_to_user和copy_from_user函数来完成加密和解密过程。
修改后再次编译并安装内核,将之前的myfs挂载到新的myext2模块,打开之前写入的flag,可以看到之前的文字变成了乱码(使用的key为0x9E):
在这里插入图片描述

方法二:

  1. 复制new_sync_write 与 new_sync_read 函数到 file.c 中
    在这里插入图片描述

  2. 对 file_operations 结构体做出如下修改,加入两个函数指针:
    在这里插入图片描述

c) 对new_sync_read_cryp函数和new_sync_read_cryp函数,可以做如下修改
write:
在这里插入图片描述

Read:

实验结果:
重新挂载/mnt到新编译的myext2系统,读到解密后的文flag(乱码),
在这里插入图片描述

用gedit打开flag:
在这里插入图片描述

查看dmesg(因为文件是在无加密时创建的,所以读取时经历了解密,变成了乱码):
在这里插入图片描述

随后新建文件 test.txt 并写入字符串“1234567”,再查看 test.txt 文件内容:cat test.txt,显示为明文,再把把 test.txt 文件复制到主目录下:cp test.txt ~ 。 在主目录下打开 test.txt 文件,结果依然是明文:
在这里插入图片描述

再将magicnumber改回0xEF53:
在这里插入图片描述

接着创建myfs,将其格式化为myext2,先挂载到myext2文件系统,在test.txt中写入123456字符串,此时读出的文件为123456。退出目录并umount /mnt,将其挂载到ext2文件系统并打开test.txt,可以看出此时读出的是密文,因为在之前写入时写入了密文且ext2文件系统没有对其进行解密。

在这里插入图片描述

四、心得体会

本次实验让我对linux中关于文件系统的相关知识和操作有了深入的理解。在实验过程中遇见了许多问题,在前几个模块通过自己的思考都解决了问题,但是在文件加密系统部分卡了很久,后来询问助教才知道是因为实验中我使用的内核版本较高,不允许直接读取用户的数据到内核中,必须使用copy_from_user和copy_to_user函数。在了解到这个知识点以后我又进行了反复的尝试,终于完成了文件加密的两种实现方式。


http://www.taodudu.cc/news/show-6111859.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • Linux 文件的加密解密
  • linux下对文件和文件夹加密
  • 彻底破解加密PDF文件
  • linux密码是什么加密方式,Linux系统的几种加密
  • 头文字D之键盘
  • 关于头文件的一切
  • 我自己的头文件入门
  • 计算机里FC方式,谁知道头文字D里提到的FD,FR,FC,FF指的是什么驱动方式的车?...
  • “头文件“
  • 坐南京13路公交车,体验《头文字D》感觉!
  • 头文字D美图
  • 头文件大全
  • 头文件知多少?
  • 文件头编码
  • 头文件我来啦
  • m=m++到底发生了什么
  • 一路向北(电影《头文字D》主题曲)铃声 一路向北(电影《头文字...
  • 什么是头文件
  • java手机版头文字d_头文字D THE ARCADE
  • C++头文件一览
  • author-头文字注释
  • 文件内容后面有^M
  • 字符 ^M
  • 阜和SAP FICO模块课程
  • 【Python】判断闰年 + Calendar模块
  • css单个边框样式
  • html-css-边框样式
  • 前端css样式如何设置内边框
  • CSS盒子边框(border)样式综合样式
  • css常用样式(文字样式、边框样式、背景样式)