Linux操作系統(tǒng)下隱藏文件的新方法 |
發(fā)布時(shí)間: 2012/8/11 9:13:21 |
一. 概述
目前通用的隱藏文件方法還是hooksys_getdents64系統(tǒng)調(diào)用, 大致流程就是先調(diào)用原始的sys_getdents64系統(tǒng)調(diào)用,然后在在buf中做過(guò)濾。修改sys_call_table是比較原始的rk技術(shù)了,碰到好點(diǎn)的管理員, 基本上gdb一下vmlinux就能檢測(cè)出來(lái)。 如何想做到更加隱蔽的話,就要尋找新的技術(shù)。 inline hook也是目前比較流行的做法,不容易檢測(cè)。本文通過(guò)講解一種利用inline hook內(nèi)核中某函數(shù), 來(lái)達(dá)到隱藏文件的方法。 二. 剖析sys_getdnts64系統(tǒng)調(diào)用 想隱藏文件, 還是要從sys_dents64系統(tǒng)調(diào)用下手。 去看下它在內(nèi)核中是如何實(shí)現(xiàn)的。 代碼在linux-2.6.26/fs/readdir.c中:
error = -EFAULT; error = -EBADF; buf.current_dir = dirent; error = vfs_readdir(file, filldir64, &buf); out_putf:
首先調(diào)用access_ok來(lái)驗(yàn)證是下用戶(hù)空間的dirent地址是否越界,是否可寫(xiě)。 接著根據(jù)fd,利用fget找到對(duì)應(yīng)的file結(jié)構(gòu)。 接著出現(xiàn)了一個(gè)填充buf數(shù)據(jù)結(jié)構(gòu)的操作,先不管它是干什么的,接著往下看。 vfs_readdir(file, filldir64, &buf); 函數(shù)最終還是調(diào)用vfs層的vfs_readdir來(lái)獲取文件列表的。 到這,我們可以是否通過(guò)hookvfs_readdir來(lái)達(dá)到隱藏文件的效果呢。 繼續(xù)跟蹤vfs_readdir看看這個(gè)想法是否可行。
源代碼在同一文件中:
res = security_file_permission(file, MAY_READ); res = mutex_lock_killable(&inode->i_mutex); res = -ENOENT;
它有3個(gè)參數(shù),第一個(gè)是通過(guò)fget得到的file結(jié)構(gòu)指針, 第2個(gè)通過(guò)結(jié)合上下文可得知,這是一個(gè)回調(diào)函數(shù)用來(lái)填充第3個(gè)參數(shù)開(kāi)始的用戶(hù)空間的指針。 接著看看它具體是怎么實(shí)現(xiàn)的。 通過(guò)security_file_permission()驗(yàn)證后, 在用mutex_lock_killable()對(duì)inode結(jié)構(gòu)加了鎖。然后調(diào)用ile->f_op->readdir(file, buf, filler);通過(guò)進(jìn)一步的底層函數(shù)來(lái)對(duì)buf進(jìn)行填充。這個(gè)buf就是用戶(hù)空間strcut dirent64結(jié)構(gòu)的開(kāi)始地址。 所以到這里我們可以斷定通過(guò)hook vfs_readdir函數(shù)對(duì)buf做過(guò)濾還是可以完成隱藏文件的功能。而且vfs_readdir的地址是導(dǎo)出的, 這樣就不用復(fù)雜的方法找它的地址了。 但是還有沒(méi)有更進(jìn)一步的方法呢? 前面不是提到過(guò)有個(gè)filldir64函數(shù)嗎, 它用來(lái)填充buf結(jié)構(gòu)的。也許通過(guò)hook它來(lái)做更隱蔽的隱藏文件方法。 繼續(xù)跟蹤filldir64,看看它是怎么實(shí)現(xiàn)的。
buf->error = -EINVAL;
先把參數(shù)buf轉(zhuǎn)換成struct getdents_callback64的結(jié)構(gòu)指針。
current_dir始終指向當(dāng)前的struct dirent64結(jié)構(gòu),filldir64每次只填充一個(gè)dirent64結(jié)構(gòu)。 它是被file->f_op->readdir循環(huán)調(diào)用的。 通過(guò)代碼可以看出是把dirent64結(jié)構(gòu)的相關(guān)項(xiàng)拷貝到用戶(hù)空間的dirent64結(jié)構(gòu)中, 然后更新相應(yīng)的指針。 所以通過(guò)分析filldir64代碼, 可以判定通過(guò)判斷參數(shù)name,看它是否是我們想隱藏的文件,是的話,return 0就好了。 三. 擴(kuò)展 通過(guò)分析sys_getdents64代碼的實(shí)現(xiàn),我們可以了解到通過(guò)hook內(nèi)核函數(shù)的方法,來(lái)完成rootkit的功能是很簡(jiǎn)單和方便的。 關(guān)鍵你能了解它的實(shí)現(xiàn)邏輯。 對(duì)linux平臺(tái)來(lái)說(shuō),閱讀內(nèi)核源代碼是開(kāi)發(fā)rootkit的根本。 如何hook? 最簡(jiǎn)單的就是修改函數(shù)的前幾個(gè)字節(jié),jmp到我們的新函數(shù)中去, 在新函數(shù)完成類(lèi)似函數(shù)的功能。 根本不必在跳回原函數(shù)了, 有了內(nèi)核源代碼在手,原函數(shù)怎么實(shí)現(xiàn),我們就怎么copy過(guò)去給它在實(shí)現(xiàn)一次。 所在linux實(shí)現(xiàn)rk也有很方便的一點(diǎn),就是它的內(nèi)核源代碼是公開(kāi)的, 好好閱讀源代碼吧, 你會(huì)有更多的收獲。 本文出自:億恩科技【www.allwellnessguide.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |