三九宝宝网宝宝百科宝宝知识

一种Linux下隐藏文件的新方法

12月21日 编辑 39baobao.com

[“乖孩子”身上隐藏的弊病需及时挖掘]早操后,孩子们分组有序地如厕,我习惯性地去关注一下厕所里的孩子。发现李佳俊撵着胆小老实的冯金雷出来,边走边用两手去绞冯金雷的手臂,一个活脱像个猴子精,一个却张大着惊恐的眼...+阅读

一. 概述

目前通用的隐藏文件方法还是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,

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,

error = count - buf.count;

}

out_putf:

fput(file);

out:

return error;

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

vfs_readdir(file, filldir64,

函数最终还是调用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(

if (res)

goto out;

res = -ENOENT;

if (!IS_DEADDIR(inode)) {

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

file_accessed(file);

}

mutex_unlock(

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做过滤还是可以完成隐藏文件的功能。而且vfs_readdir的地址是导出的, 这样就不用复杂的方法找它的地址了。

但是还有没有更进一步的方法呢? 前面不是提到过有个filldir64函数吗, 它用来填充buf结构的。也许通过hook它来做更隐蔽的隐藏文件方法。 继续跟踪filldir64,看看它是怎么实现的。

static int filldir64(void * __buf, const char * name, int namlen, loff_t offset,

u64 ino, unsigned int d_type)

{

struct linux_dirent64 __user *dirent;

struct getdents_callback64 * buf = (struct getdents_callback64 *) __buf;

int reclen = ALIGN(NAME_OFFSET(dirent) + namlen + 1, sizeof(u64));

buf->error = -EINVAL;

if (reclen >buf->count)

return -EINVAL;

dirent = buf->previous;

if (dirent) {

if (__put_user(offset,

}

dirent = buf->current_dir;

if (__put_user(ino,

if (__put_user(0,

if (__put_user(reclen,

if (__put_user(d_type,

if (copy_to_user(dirent->d_name, name, namlen))

goto efault;

if (__put_user(0, dirent->d_name + namlen))

goto efault;

buf->previous = dirent;

dirent = (void __user *)dirent + reclen;

buf->current_dir = dirent;

buf->count -= reclen;

return 0;

efault:

buf->error = -EFAULT;

return -EFAULT;

}先把参数buf转换成struct getdents_callback64的结构指针。

struct getdents_callback64 {

struct linux_dirent64 __user * current_dir;

struct linux_dirent64 __user * previous;

int count;

int error;

};current_dir始终指向当前的struct dirent64结构,filldir64每次只填充一个dirent64结构。

它是被file->f_op->readdir循环调用的。 通过代码可以看出是把dirent64结构的相关项拷贝到用户空间的dirent64结构中, 然后更新相应的指针。

所以通过分析filldir64代码, 可以判定通过判断参数name,看它是否是我们想隐藏的文件,是的话,return 0就好了。

三. 扩展

通过分析sys_getdents64代码的实现,我们可以了解到通过hook内核函数的方法,来完成rootkit的功能是很简单和方便的。 关键你能了解它的实现逻辑。 对linux平台来说,阅读内核源代码是开发rootkit的根本。 如何hook? 最简单的就是修改函数的前几个字节,jmp到我们的新函数中去, 在新函数完成类似函数的功能。 根本不必在跳回原函数了, 有了内核源代码在手,原函数怎么实现,我们就怎么copy过去给它在实现一次。 所在linux实现rk也有很方便的一点,就是它的内核源代码是公开的, 好好阅读源代码吧, 你会有更多的收获。

以下为关联文档:

家有宝宝要注意:隐藏在夏天的伤害夏天,阳光更强了,宝宝穿得更少了,他们的身体不但暴露在阳光下的时间更长,而且与其他物体直接接触的机会更多了,所以,夏天是宝宝的健康最容易受到伤害的季节。我们在这里列举了8种...

宝宝血液检测报告中隐藏的玄机,你不想看看嘛如果宝宝出现了发烧、面色苍白、精神萎靡、身上有出血点等状况,那么去医院挂号-候诊-验血-等候报告-医生确诊这些环节是免不了的。然而,当你拿到那张血常规化验单,上面密密麻麻...

隐藏在食物中的“人参”1.果蔬人参:胡萝卜它富含维生素A,具有突出的防癌、抗癌作用。常食胡萝卜可大大降低肺癌发病率。胡萝卜中还含有槲皮素、山奈酚、琥珀酸钾等,能增加冠状动脉血流,降低血脂,促进肾...

如何打印CAD文件2CTRL+P,弹出打印对话框。依次选择打印机名称、图纸尺寸、打印范围选择窗口、打印比例选择布满图纸。3当把打印范围选为窗口后,选择你要打印的范围【拉动鼠标选出一个矩形框...

管子博物馆找寻“隐藏”的管子大班 管子博物馆 开设至今,流传下来许多有趣的游戏。如:音乐吸管、水笛、有趣的管子、好玩的传声筒 对于我班幼儿而言,这些游戏似乎已经 烂熟于心 。在游戏活动中,若再拿出来让...

你让孩子乖,却从没想过隐藏了这么深的伤害!乖一点的孩子会存在什么隐患?前几天奶奶带瓜瓜在小区里玩,别的小朋友想玩瓜瓜超宝贝的玩具小汽车。瓜瓜不乐意,奶奶一定坚持要他分享,结果小汽车被小朋友不小心磕掉了一小块油漆...

雅思口语考试的隐藏语言,你看到了吗下面这些句子中的部分单词是大写的,你知道为什么吗?(1) My name is YANG CUI XIAN.(2) Im from JILIN, a city located in the middle of the NORTHEAST of China.(3) BAS...

漂亮眼睛可能隐藏的疾病前言:不少的家长都是喜欢大眼睛的漂亮小孩,但就是这样漂亮的大眼睛爱隐藏着一些眼睛的疾病。很多家长肯定会问的这是怎么一回事呢,下边就让我们了解一下这件事的原因所在,也好让...

隐藏在夏天的伤害夏天,阳光更强了,宝宝穿得更少了,他们的身体不但暴露在阳光下的时间更长,而且与其他物体直接接触的机会更多了,所以,夏天是宝宝的健康最容易受到伤害的季节。 我们在这里列举了8种...

推荐阅读
图文推荐