某些時(shí)候程序員為了防止其他人不小心或者惡意破壞掉你運(yùn)行的程序,或者我們要做些“見(jiàn)不得光”的事情,就有隱藏進(jìn)程的需求,目的是讓小白或者初級(jí)運(yùn)維無(wú)法通過(guò)相關(guān)命令工具查找到你的程序,達(dá)到隱藏目的。前兩天正好項(xiàng)目上需要用到隱藏進(jìn)程的需求,所以分析了下個(gè)人覺(jué)得目前比較好的做法。
linux下查看進(jìn)程的方法
ps命令
top命令
目前網(wǎng)上很多方法基本都是通過(guò)如下方式來(lái)達(dá)到進(jìn)程隱藏:
1.根據(jù)分組權(quán)限來(lái)實(shí)現(xiàn)不同用戶(hù)組查看不同的進(jìn)程權(quán)限。
2.修改內(nèi)核,將需要隱藏的進(jìn)程的進(jìn)程pid改為0(task->pid = 0),因?yàn)閜s,top命令不會(huì)顯示進(jìn)程id為0的進(jìn)程。
3.修改內(nèi)核,hook掉系統(tǒng)調(diào)用,在hook函數(shù)中修改邏輯判斷已達(dá)到隱藏進(jìn)程。
第一種如果追中人有管理員權(quán)限就沒(méi)有辦法隱藏了。第二三種需要懂內(nèi)核編程,有一定的技術(shù)門(mén)檻(實(shí)際上只要會(huì)點(diǎn)內(nèi)核還是很easy的),今天我們說(shuō)下第四種辦法:在用戶(hù)態(tài)修改系統(tǒng)調(diào)用,從而隱藏進(jìn)程。
PS/TOP顯示進(jìn)程原理
strace命令是一個(gè)常用的代碼調(diào)試工具,它可以跟蹤到一個(gè)進(jìn)程產(chǎn)生的系統(tǒng)調(diào)用,包括參數(shù),返回值,執(zhí)行消耗的時(shí)間。因此對(duì)于調(diào)試程序出錯(cuò)是非常有用的。這里不過(guò)多展示strace的調(diào)試用法,具體可以查看詳細(xì)的strace命令。
我們看下ps,top是如何顯示進(jìn)程信息的:
strace ps
strace top
通過(guò)strace命令可以看出 ps,top等查看進(jìn)程的信息都是通過(guò)調(diào)用 readdir 方法遍歷 /proc 目錄來(lái)獲取進(jìn)程信息。每個(gè)動(dòng)態(tài)創(chuàng)建的進(jìn)程ID號(hào)下面詳細(xì)的記錄了關(guān)于該進(jìn)程的fd,mem,io,cpuset等進(jìn)程信息。
既然進(jìn)程信息是proc目錄下動(dòng)態(tài)生成的,因此最顯而易見(jiàn)和最徹底的方法就是不讓proc下生成該進(jìn)程信息。通過(guò)查找代碼,定位到內(nèi)核通過(guò)fs/proc/base.c中的proc_pid_lookup查找進(jìn)程號(hào),然后由proc_pid_instantiate來(lái)在proc下創(chuàng)建該進(jìn)程號(hào)相關(guān)的進(jìn)程信息。因此我們只需要在proc_pid_lookup中匹配要過(guò)濾的進(jìn)程名,然后直接返回就行了,如下:
內(nèi)核proc創(chuàng)建pid進(jìn)程信息
這種辦法徹底不創(chuàng)建該進(jìn)程信息,但是要修改編譯內(nèi)核,實(shí)際上是不太可取的。而我們目的也只是隱藏,不必完全屏蔽進(jìn)程信息。因此,有沒(méi)有一種辦法在用戶(hù)態(tài)通過(guò)劫持系統(tǒng)調(diào)用而忽略掉我們的進(jìn)程呢?
本來(lái)想著如何自己實(shí)現(xiàn)一個(gè)hook系統(tǒng)調(diào)用,但是本著絕不重復(fù)造輪子的工匠精神,瓶子哥嘗試搜羅了下,還真有現(xiàn)成的,即通過(guò)劫持readdir系統(tǒng)調(diào)用實(shí)現(xiàn)ps,top無(wú)法查找到進(jìn)程而達(dá)到隱藏進(jìn)程。
我們先實(shí)戰(zhàn),在看其實(shí)現(xiàn)原理。
1 . 實(shí)現(xiàn):
1) git clone https://github.com/gianlucaborello/libprocesshider.git
2) cd libprocesshider/ && make
3) cp libprocesshider.so /usr/local/lib/
4) echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
這一步也可以用export LD_PRELOAD=/usr/local/lib/libprocesshider.so來(lái)代替。
執(zhí)行命令上述命令前,運(yùn)行mtop進(jìn)程,ps可以查看到mtop的進(jìn)程。
執(zhí)行上述命令后,ps 查看,可以發(fā)現(xiàn)已經(jīng)找不到該進(jìn)程了,而且 top,ls /proc/下面也不能找到該進(jìn)程,完美達(dá)到隱藏進(jìn)程。
2. 原理:
我們查看processhider.c源碼可以發(fā)現(xiàn),原理上就是重寫(xiě)了readdir的系統(tǒng)調(diào)用,因?yàn)闊o(wú)論ps,top,ls 都會(huì)調(diào)用readdir。
而思路就是利用 LD_PRELOAD 來(lái)實(shí)現(xiàn)系統(tǒng)函數(shù)的劫持,程序在執(zhí)行外部庫(kù)函數(shù)調(diào)用的時(shí)候,會(huì)根據(jù)動(dòng)態(tài)庫(kù)的優(yōu)先級(jí)來(lái)加載庫(kù)函數(shù),linux下庫(kù)的加載順序?yàn)?etc/ld.so.preload( LD_PRELOAD)>/etc/ld.so.cache>/etc/ld.so.conf,當(dāng)程序調(diào)用外部庫(kù)的函數(shù),如果LD_PRELOAD里面有自定義和其他系統(tǒng)庫(kù)相同的庫(kù)函數(shù),則優(yōu)先加載我們自定義的函數(shù),這樣就達(dá)到了劫持系統(tǒng)函數(shù)的目的。
由于ps,top,ls 等幾乎所有的查看命令都基于readdir系統(tǒng)調(diào)用,所以能夠完美的隱藏掉進(jìn)程,對(duì)付一般的小白是完全夠用了。如果為了避免分析人員查找 /etc/ld.so.preload而定位到進(jìn)程,我們可以不創(chuàng)建ld.so.preload文件,而使用LD_PRELOAD宏來(lái)定義庫(kù)的路徑。例如將export LD_PRELOAD=/usr/local/lib/libprocesshider.so 放到linux系統(tǒng)啟動(dòng)過(guò)程中rc文件去加載,加大定位的難度。
另外除去隱藏,還可以對(duì)執(zhí)行程序進(jìn)行運(yùn)行加密,常量字符串加密混淆,程序自動(dòng)銷(xiāo)毀等反追蹤等,后面我們?cè)僖灰挥懻摗?/p>
(每天一個(gè)實(shí)戰(zhàn)技能,感謝點(diǎn)贊、關(guān)注、轉(zhuǎn)發(fā)。)
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。