快速业务通道

分享:Linux操作系统下隐藏文件

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-02

一. 概述

目前通用的隐藏文件方法还是hooksys_getdents64系统调用, 大致流程就是先调用原始的sys_getdents64系统调用,然后在在buf中做过滤.修改sys_call_table是比较原始的rk技术了,碰到好点的管理员, 基本上gdb一下vmlinux就能检测出来. 如何想做到更加隐蔽的话,就要寻找新的技术. inline hook也是目前比较流行的做法,不容易检测.本文通过讲解一种利用inline hook内核中某函数, 来达到隐藏文件的方法.

二. 剖析sys_getdnts64系统调用

想隐藏文件, 还是要从sys_dents64系统调用下手. 去看下它在内核中是如何实现的.

代码在linux-2.6.26/fs/readdir.c中:

asmlinkage long sys_getdents64(unsigned int fd, struct linux_dirent64

   __user * dirent, unsigned int count)

    {

    struct file * file;

    struct linux_dirent64 __user * lastdirent;

    struct getdents_callback64 buf;

    int error;



    error = -EFAULT;

    if (!access_ok(VERIFY_WRITE, dirent, count))

    goto out;



    error = -EBADF;

    file = fget(fd);

    if (!file)

    goto out;



    buf.current_dir = dirent;

    buf.previous = NULL;

    buf.count = count;

    buf.error = 0;



    error = vfs_readdir(file, filldir64, &buf);

    if (error < 0)

    goto out_putf;

    error = buf.error;

    lastdirent = buf.previous;

    if (lastdirent) {

    typeof(lastdirent->d_off) d_off = file->f_pos;

    error = -EFAULT;

    if (__put_user(d_off, &lastdirent->d_off))

    goto out_putf;

    error = count - buf.count;

    }



    out_putf:

    fput(file);

    out:

    return error;

    }

调用access_ok来验证是下用户空间的dirent地址是否越界,是否可写. 接着根据fd,利用fget找到对应的file结构. 接着出现了一个填充buf数据结构的操作,先不管它是干什么的,接着往下看.

vfs_readdir(file, filldir64, &buf);

函数最终还是调用vfs层的vfs_readdir来获取文件列表的. 到这,我们可以是否通过hookvfs_readdir来达到隐藏文件的效果呢. 继续跟踪vfs_readdir看看这个想法是否可行.

源代码在同一文件中:

int vfs_readdir(struct file *file, filldir_t filler, void *buf)

    {

    struct inode *inode = file->f_path.dentry->d_inode;

    int res = -ENOTDIR;

    if (!file->f_op || !file->f_op->readdir)

    goto out;



    res = security_file_permission(file, MAY_READ);

    if (res)

    goto out;



    res = mutex_lock_killable(&inode->i_mutex);

    if (res)

    goto out;



    res = -ENOENT;

    if (!IS_DEADDIR(inode)) {

    res = file->f_op->readdir(file, buf, filler);

    file_accessed(file);

    }

    mutex_unlock(&inode->i_mutex);

    out:

    return res;

    }

  EXPORT_SYMBOL(vfs_readdir);


它有3个参数,第一个是通过fget得到的file结构指针, 第2个通过结合上下文可得知,这是一个回调函数用来填充第3个参数开始的用户空间的指针. 接着看看它具体是怎么实现的.

通过security_file_permission()验证后, 在用mutex_lock_killable()对inode结构加了锁.然后调用ile->f_op->readdir(file, buf, filler);通过进一步的底层函数来对buf进行填充.这个buf就是用户空间strcut dirent64结构的开始地址.

到这里我们可以断定通过hook vfs_readdir函数对buf做过滤还是可以完成隐藏文

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号