linux 隱藏程序 crux實現

2021-05-23 17:02:38 字數 3003 閱讀 1165

本文在不修改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.完全隱藏程序 理論...