Skip to content

Instantly share code, notes, and snippets.

@jiangzc
Created June 29, 2020 13:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jiangzc/ed799b99a19b9d00945dfd23cd9e564a to your computer and use it in GitHub Desktop.
Save jiangzc/ed799b99a19b9d00945dfd23cd9e564a to your computer and use it in GitHub Desktop.
hide files and folders
/*
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