本文在不修改ps或top命令的任何**與採用將程序號置0的方法的前提下,實現隱藏程序,本程式在crux 2.2上實現
1、原理
linux中,可以通過/proc檔案系統訪問到許多核心的內部資訊。/proc檔案系統最初的設計也是用於方便地訪問程序相關的資訊,因此命名為proc。現在這個檔案系統已用於反映系統中方方面面的資訊,例如/proc/modules是模組的列表,/proc/meminfo則是記憶體使用的統計。/proc檔案系統中的目錄並非持久儲存的資訊,也就是說,其目錄並不「真實」地存在於磁碟,而是在訪問時動態生成。
本專案中我們感興趣的是/proc檔案系統中關於程序的資訊。每乙個程序在/proc檔案系統中有乙個目錄即(/proc/),目錄名即程序號。self目錄是乙個鏈結,指向當前程序。
ps命令和top命令從/proc檔案系統中讀取程序資訊並顯示出來。因此,如果乙個程序的程序號沒有在/proc檔案系統中反映出來,則這個程序被「隱藏」了,「隱藏」程序在ps或top命令的輸出不出現。
2、實現
2.1 為task_struct新增變數hide如下:(include/linux/sched.h)
2.2 **修改proc**
在linux**樹中,所有檔案系統的**都放在linux/fs/目錄中,其中,proc檔案系統的原始碼在linux/fs/proc中,下面我簡單介紹一下proc目錄中的原始檔。
在目錄中共有11個相關檔案,他們是:
procfs_syms.c inode.c generic.c base.c
array.c root.c proc_tty.c proc_misc.c
kmsg.c kcore.c proc_devtree.c
這麼多的檔案我們如何去找呢,借鑑網上的資料,對各個檔案進行查詢可知:
其中,procfs_syms.c,generic.c及inode.c和proc檔案系統的管理相關,包括proc檔案系統的註冊,及向核心其他子系統提供的例程等等。
原始檔root.c和proc檔案系統的根結點的管理相關。
而base.c,array.c則用來處理/proc目錄中程序的資訊,包括命令列,程序狀態,記憶體狀態等等和程序相關的內容。proc_tty.c用來處理/proc/tty資訊,proc_misc.c則用來管理和/proc目錄中的大多數檔案。
除此之外,更有兩個非常重要的標頭檔案proc_fs.h,proc_fs_i.h,我們能在/linux/include/linux/目錄中找到。
同時,最重要的是,我們確定了我們所要需要的相關資訊在base.c檔案中,主要是在這2個函式之間:proc_pid_readdir,proc_task_readdir,但是是哪個函式呢?由於網上的資料很少,沒辦法乙個乙個試。通過檢視著2個看書的源**:
通過觀察,我們可以大膽的猜測,filldir()函式 就是往/proc新增目錄的函式,我們可以做個實驗,即,在filldir()下面再新增乙個filldir()函式,這樣的話,乙個程序在/proc目錄下就會有2個目錄,同時,ps -ax顯示的同乙個程序也會有2個。
修改完後編譯核心:
cd /usr/src/linux-《版本號》
make bzimage
cp arch/i386/boot/bzimage /boot/vmlinuz-0.1
cp system.map /boot/system.map-0.1
修改grub,為修改的核心新增相應的啟動項
vim /boot/grub/menu.lst
reboot重新啟動,在啟動後選擇crux_test選項,使用我們修改完的核心,
輸入ps -ax或者檢視/proc檔案便會出現我們預先猜測的結果,同時,經過驗證可知,ps, top命令呼叫的是proc_pid_readdir函式,而不是proc_task_readdir函式。嘿,在這,我們就發現新大陸了!
2.3 怎麼修改proc
由2.2可知,我們需要修改在函式為proc_pid_readdir,仔細閱讀相關**可知,我們只需在if (filldir(dirent, buf+j, proc_numbuf-j, filp->f_pos, ino, dt_dir) < 0) 前判斷程序是否是否有設定為隱藏,而在之前,我們要先獲取該程序的task_struct,具體**如下(注釋處即為新增的**):
另外需要在kernel/fork.c的copy_process()函式中新增初始化hide**(雖可不用,但為了保證邏輯,還是新增吧)
重新編譯核心
2.4 新增系統呼叫
為了驗證我們2.3所修改的核心**,我們需新增相應的系統呼叫,設定task_struct的hide,為此,我們新增2個系統呼叫,修改如下
2.4.1 kernel/sys.c新增源**
2.4.2 include/asm-i386/unistd.h新增系統呼叫號及系統的呼叫總數
2.4.3 arch/i386/kernel/syscall_table.s在系統呼叫表中新增相應項,在最後一行新增
2.4.4 在include/linux/syscalls.h新增函式宣告(貌似這個可有可無)
至此,新增系統呼叫完成,重新編譯核心
3 測試
我們編寫了乙個測試函式,用來我們修改的核心是否成功,**hide.c如下:
gcc hide.c -o hide後,執行 ./hide ,檢視結果如圖
測試成功,成功隱藏程序!
4、結束語
這只是實現隱藏的一種方式,網上看到的乙個是攔截系統呼叫,我之前想的是攔截中斷,直接在中斷裡面修改,這個有待驗證,以後有機會實現的話也會貼出來和大家分享。
這個程式從開始到完成大概花了我6,7個小時的時間,說起來難度也不大,核心**的修改量很小,問題的關鍵處是找到在何處修改**,這個俺也是邊查資料邊做實驗才找到的。
[2011-2-25]現已實現通過攔截系統呼叫隱藏程序的方式,分享與大家:http://blog.csdn.net/billpig/archive/2011/02/20/6196163.aspx
Linux程序隱藏問題 顯示隱藏程序
阿里云云監控到有兩台redis伺服器cpu被某程序消耗400 cpu資源 系統檢視top 情況並未找到高消耗程序x7但cpu100 ni netstat 查詢到了一些異常請求,初步判斷出元件被提權入侵了 嘗試查詢異常程序x7關聯的檔案,排查還在 etc hosts發現增加了如下異常對映,檢視相關異常...
Linux 痕跡清理 隱藏程序
1.偷換系統二進位制檔案 ps top 等 防範 比對hash 系統完整性檢查工具,比如tripwrie aide等 2.修改hook呼叫函式 修改命令返回結果,原函式getdents 防範 sysdig 開源 檢測ld preload環境變數是否有異常,ld.so.preload檔案異常 時間,大...
在VB中實現隱藏程序
1.這種方法可以實現在 應用程式 選項卡中隱藏但無法在 程序 選項卡中隱藏。任務管理器裡有三個選項卡吧,第乙個就是 應用程式 第二個是 程序 第三個是 效能 例如很多程都做到了這一點,如金山詞霸,諾頓等,都只出現在 程序 裡,而不出現在 應用程式 裡,如何實現呢?一句 就夠了 2.完全隱藏程序 理論...