Linux操作系統下隱藏文件的新方法

作者:yan

一. 概述

目前通用的隱藏文件方法還是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做過濾還是可以完成隱藏文件的功能。而且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->d_off))

goto efault;

}

dirent = buf->current_dir;

if (__put_user(ino, &dirent->d_ino))

goto efault;

if (__put_user(0, &dirent->d_off))

goto efault;

if (__put_user(reclen, &dirent->d_reclen))

goto efault;

if (__put_user(d_type, &dirent->d_type))

goto efault;

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也有很方便的一點,就是它的內核源代碼是公開的, 好好閱讀源代碼吧, 你會有更多的收獲。

 
解析Linux操作系統文件目錄
  隨著Linux的不斷發展,越來越多的人開始使用Linux,對于那些剛剛接觸的人來說,恐  怕最先感到困惑的就是那些“不明不白”的目錄了。如果想熟練使用Linux,讓Linux聽  命于自己,就必須掌握這些目錄,下面就...查看完整版>>解析Linux操作系統文件目錄
 
解析linux操作系統文件目錄
  隨著linux的不斷發展,越來越多的人開始使用Linux,對于那些剛剛接觸的人來說,恐怕最先感到困惑的就是那些“不明不白”的目錄了。如果想熟練使用linux,讓Linux聽命于自己,就必須掌握這些目錄,下面就以Xteam公...查看完整版>>解析linux操作系統文件目錄
 
解析Linux操作系統文件目錄
   隨著Linux的不斷發展,越來越多的人開始使用Linux,對于那些剛剛接觸的人來說,恐怕最先感到困惑的就是那些“不明不白”的目錄了。如果想熟練使用Linux,讓Linux聽命于自己,就必須掌握這些目錄,下面就以Xteam...查看完整版>>解析Linux操作系統文件目錄
 
解析Linux操作系統文件目錄
隨著Linux的不斷發展,越來越多的人開始使用Linux,對于那些剛剛接觸的人來說,恐怕最先感到困惑的就是那些“不明不白”的目錄了。如果想熟練使用Linux,讓Linux聽命于自己,就必須掌握這些目錄,下面就以...查看完整版>>解析Linux操作系統文件目錄
 
解析Linux操作系統文件目錄
  隨著Linux的不斷發展,越來越多的人開始使用Linux,對于那些剛剛接觸的人來說,恐怕最先感到困惑的就是那些“不明不白”的目錄了。如果想熟練使用Linux,讓Linux聽命于自己,就必須掌握這些目錄,下面就以Xteam公...查看完整版>>解析Linux操作系統文件目錄
 
無法顯示操作系統隱藏文件夾怎麽辦-系統技巧
  問:不知道我的電腦什麽地方被動了手腳,不能顯示隱藏的文件夾,我在文件夾選項的“查看”當中也沒有辦法設置。請問有辦法解決麽?我有很多以前隱藏了的文件夾,現在想找回這些文件夾,該怎麽辦呢?  答:這個...查看完整版>>無法顯示操作系統隱藏文件夾怎麽辦-系統技巧
 
Vista操作系統下清理隱藏文件方法-Vista技巧
  Vista系統中多余的字體、多余的備份文件等的刪除方法大家早已知曉,因此本文只爲大家介紹一些比較“隱蔽”的刪除方法。注意:在進行以下操作前,應先備份Windows注冊表,以便執行了錯誤操作後能及時恢複系統。 ...查看完整版>>Vista操作系統下清理隱藏文件方法-Vista技巧
 
手動清除操作系統內隱藏病毒文件
  手動清除操作系統內隱藏病毒文件的方法:  選擇“顯示隱藏文件”這一選項後,發現U盤有個文件閃出來一下就馬上又消失了,而再打開文件夾選項時,發現仍就是“不顯示隱藏文件”這一選項。而且剛發現點擊C、D等盤...查看完整版>>手動清除操作系統內隱藏病毒文件
 
Windows操作系統中三則文件隱藏技巧
  1、最簡單的方法  右擊想要隱藏的文件或文件夾,在彈出的菜單中選取“屬性”,然後在屬性窗口的複選框中選中“隱藏”。接著在“我的電腦”或“資源管理器”中選取“查看”,再在下拉菜單中選“文件夾選項”,在...查看完整版>>Windows操作系統中三則文件隱藏技巧
 
 
回到王朝網路首頁