我通过hook系统调用,实现应用层度“读加密文件时的自动解密”和“写文件时的自动加密”
hook了 openat、read、write、fstat等函数
测试读,暂时没问题,能解密
测试写,有问题!
printk输出如下:
上图是我应用层点保存时触发的输出。看样子,点保存后,程序调用openat函数重新打开文件,fd是10; 然后lseek了一次,不过这个事件在本次测试里没什么意义; 程序然后close了这个fd。这里就有问题了,为啥要close呢? 我为了避免影响无关文件,所以openat时记录了加密文件的fd,close时会把这个fd从链表里清理掉。它close,我就得清理掉,然后下边write时就不对了, wirte调用的hook版本认为参数里的fd代表非加密文件,所以没有给文件加文件头,也没有走加密数据分支,保存的文件于是就变成明文了。
我不明白,应用层wirte文件之前,为啥要把fd close掉?close之后的write函数使用的fd是怎么来的?
[已解决]内核里与读写文件有关的问题
- wxf
- 帖子: 52
- 注册时间: 2008-05-28 8:50
[已解决]内核里与读写文件有关的问题
上次由 wxf 在 2024-02-20 12:51,总共编辑 2 次。
- astolia
- 论坛版主
- 帖子: 6486
- 注册时间: 2008-09-18 13:11
- wxf
- 帖子: 52
- 注册时间: 2008-05-28 8:50
Re: 【求助】内核里与读写文件有关的问题
我又加了些输出语句,发现openat函数里边判断文件是不是加密时出错了。dss_is_crypt_file这个函数不符合预期
代码: 全选
static bool dss_is_crypt_file(const char* filename)
{
struct file* file = filp_open(filename, O_RDONLY, 0);
if (IS_ERR(file))
{
printk("%s, %d, filp_open failed, filename:[%s]\n", __FUNCTION__, __LINE__, filename);
return false;
}
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
loff_t pos = 0;
char buf[9] = { 0 };
loff_t ret = vfs_read(file, buf, 8, &pos);
//file->f_pos = pos;
set_fs(old_fs);
filp_close(file,0);
printk("%s, %d, filename:[%s], first eight chars :%s, read count:%lld, pos:%lld\n", __FUNCTION__, __LINE__, filename, buf, ret, pos);
if (strcmp(buf, DSS_STD_FLAG) == 0)
return true;
else
return false;
}
long dss_openat(struct pt_regs* regs)
{
//int dfd = regs->di;
char __user* user_filename = regs->si;
int flags = regs->dx;
char filename[DSS_FILE_PATH] = { 0 };
strncpy_from_user(filename, user_filename, strnlen_user(user_filename, DSS_FILE_PATH - 1));
//如果当前进程不是加密进程
if (!IsSensitive(current->pid))
{
//printk("%s, %d is not sensitive,filename:%s\n", __FUNCTION__, current->pid, filename);
return orig_openat(regs);
}
.......
//文件不存在
if (!file_exists)
{
.......
}
//文件存在
else
{
if (dss_is_crypt_file(filename))
{
printk("%s, %d, file [%s] is crypted, fd is [%d]\n", __FUNCTION__, __LINE__, filename,fd);
savefd(current->pid, fd);
}
else
printk("%s, %d, file [%s] is not crypted, fd is [%d]\n", __FUNCTION__, __LINE__, filename, fd);
}
return fd;
}
- wxf
- 帖子: 52
- 注册时间: 2008-05-28 8:50
Re: 【求助】内核里与读写文件有关的问题
还要问一个问题:一个进程退出了,module如何得到通知?
有没有一种机制,比如注册一个响应函数,进程退出时,进程管理器调用这个函数
有没有一种机制,比如注册一个响应函数,进程退出时,进程管理器调用这个函数
- astolia
- 论坛版主
- 帖子: 6486
- 注册时间: 2008-09-18 13:11
- astolia
- 论坛版主
- 帖子: 6486
- 注册时间: 2008-09-18 13:11
- wxf
- 帖子: 52
- 注册时间: 2008-05-28 8:50
Re: 【求助】内核里与读写文件有关的问题
上次由 wxf 在 2024-01-22 0:01,总共编辑 1 次。
- wxf
- 帖子: 52
- 注册时间: 2008-05-28 8:50
Re: 【求助】内核里与读写文件有关的问题
刚检查了一下,openat时真的有TRUNC标记。那我再修改一下代码看看