Created
June 29, 2020 13:17
-
-
Save jiangzc/ed799b99a19b9d00945dfd23cd9e564a to your computer and use it in GitHub Desktop.
hide files and folders
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Extent_Tree | |
file:///home/jzc/Desktop/e2fsprogs-1.45.6/doc/aa.html | |
https://bean-li.github.io/EXT4-packet-meta-blocks/ | |
https://www.cnblogs.com/alantu2018/p/8461272.html | |
https://ext4.wiki.kernel.org/index.php/Ext4_Metadata_Checksums | |
https://metebalci.com/blog/a-minimum-complete-tutorial-of-linux-ext4-file-system/ | |
https://wiki.archlinux.org/index.php/ext4 | |
*/ | |
/* | |
我最近深入学习 ext4文件系统和 libext2fs 函数库,发明了一种基于EXT4文件系统的加密方案。 | |
ext4自带的加密是对整个文件系统加密,我说的加密是对某个文件或文件夹加密,两者不是一回事。 | |
首先要关闭文件系统的 metadata_csum 校验功能,然后调用 ext4_file_open 和相关函数直接读写目录项,备份并加密“目录——文件inode的对应关系”,删除原先关系。从 inode bitmap 和 data bitmap 上看,文件依然存在,inode依然存在,不用担心隐藏的文件被覆盖,只不过是文件的入口点消失了。加密也就是对文件的入口点加密,恢复是对文件的入口点还原。 | |
我刚刚测试了一下原理,效果非常好。 | |
设n为文件大小,对单个文件加密的时间复杂度为 O(1),空间复杂度也为 O(1) 。 | |
设n为文件个数,对多个文件加密的时间复杂度为 O(n),空间复杂度也为 O(1) 。 | |
理论上来说,因为没有修改文件的索引(inode)和内容(data block),所以操作系统内核对魔改后的文件系统有良好的兼容性,甚至可以对被其他程序占用、正在读写的文件加密。 | |
*/ | |
#include <stdio.h> | |
#include <error.h> | |
#include <string.h> | |
#include <ext2fs/ext2fs.h> | |
// 注意各种flag "filetype" feature flag | |
int main() | |
{ | |
ext2_filsys fs = NULL; | |
int ret = 0; | |
ret = ext2fs_open("/dev/loop9", EXT2_FLAG_RW, 0, 0, unix_io_manager, &fs); | |
printf("%d %s\n", ret, strerror(ret)); | |
ext2_file_t file; | |
ret = ext2fs_file_open(fs, 2, EXT2_FILE_WRITE, &file); | |
printf("%d %s\n", ret, strerror(ret)); | |
unsigned long long filesize = 0; | |
ret = ext2fs_file_get_lsize(file, &filesize); | |
printf("%d %d %s\n", ret, filesize, strerror(ret)); | |
struct ext2_inode fileinode; | |
ret = ext2fs_read_inode(fs, 2, &fileinode); | |
printf("%d %d %s\n", ret, fileinode.i_blocks, strerror(ret)); | |
void *buff = malloc(10000); | |
unsigned int dirsize; | |
ret = ext2fs_file_read(file, buff, 10000, &dirsize); | |
printf("%d %d \n", ret, dirsize); | |
struct ext2_dir_entry_2 *dp = buff; | |
while ((void*)dp < buff + dirsize) | |
{ | |
printf("%d %d %d %s\n", dp->inode, dp->rec_len, dp->name_len, dp->name); | |
if (strcmp("bib.so", dp->name) == 0) | |
{ | |
dp->inode = 12; | |
} | |
dp = (void*)dp + dp->rec_len; | |
} | |
ret = ext2fs_file_lseek(file, 0, EXT2_SEEK_SET, NULL); | |
printf("%d %s\n", ret, strerror(ret)); | |
unsigned int written; | |
ret = ext2fs_file_write(file, buff, dirsize, &written); | |
printf("%d %d \n", ret, written); | |
ext2fs_file_flush(file); | |
ext2fs_file_close(file); | |
ext2fs_close(fs); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment