網站首頁 個人範例 行業範例 行政範例 職場範例 校園範例 書信範例 生活範例 節日文化範例
當前位置:文學範文吧 > 行業範例 > 技工

Windows NT/2000系統下進程隱藏的基本技術和方法

欄目: 技工 / 發佈於: / 人氣:1.21W

摘要 進程的隱藏一直是木馬程序設計者不斷探求的重要技術,本文采用遠程線程技術,通過動態鏈接庫方法,較好地解決了這一問題,通過遠程線程將木馬作為線程隱藏在其他進程中,從而達到隱藏的目的。

Windows NT/2000系統下進程隱藏的基本技術和方法

關鍵字進程 線程 木馬 動態鏈接庫

木馬程序(也稱後門程序)是能被控制的運行在遠程主機上的程序,由於木馬程序是運行在遠程主機上,所以進程的隱藏無疑是大家關心的焦點。

本文分析了Windows NT/2000系統下進程隱藏的基本技術和方法,並着重討論運用線程嫁接技術如何實現Windows NT/2000系統中進程的隱藏。

1 基本原理

在WIN95/98中,只需要將進程註冊為系統服務就能夠從進程查看器中隱形,可是這一切在Windows NT/2000中卻完全不同, 無論木馬從端口、啟動文件上如何巧妙地隱藏自己,始終都不能躲過Windows NT/2000的任務管理器,Windows NT/2000的任務管理器均能輕鬆顯示出木馬進程,難道在Windows NT/2000下木馬真的再也無法隱藏自己的進程了?我們知道,在WINDOWS系統下,可執行文件主要是Exe和Com文件,這兩種文件在運行時都有一個共同點,會生成一個獨立的進程,尋找特定進程是我們發現木馬的方法之一,隨着入侵檢測軟件的不斷髮展,關聯進程和SOCKET已經成為流行的技術,假設一個木馬在運行時被檢測軟件同時查出端口和進程,我們基本上認為這個木馬的隱藏已經完全失敗。在Windows NT/2000下正常情況用户進程對於系統管理員來説都是可見的,要想做到木馬的進程隱藏,有兩個辦法,第一是讓系統管理員看不見你的進程;第二是不使用進程。本文以第二種方法為例加以討論,其基本原理是將自已的木馬以線程方式嫁接於遠程進程之中,遠程進程則是合法的用户程序,這樣用户管理者看到的只是合法進程,而無法發現木馬線程的存在,從而達到隱藏的目的。

2 實現方法

為了弄清實現方法,我們必須首先了解Windows系統的另一種"可執行文件"----DLL,DLL是Dynamic Link Library(動態鏈接庫)的縮寫,DLL文件是Windows的基礎,因為所有的API函數都是在DLL中實現的。DLL文件沒有程序邏輯,是由多個功能函數構成,它並不能獨立運行,一般都是由進程加載並調用的'。因為DLL文件不能獨立運行,所以在進程列表中並不會出現DLL,假設我們編寫了一個木馬DLL,並且通過別的進程來運行它,那麼無論是入侵檢測軟件還是進程列表中,都只會出現那個進程而並不會出現木馬DLL,如果那個進程是可信進程,(例如瀏覽器程序,沒人會懷疑它是木馬吧?)那麼我們編寫的DLL作為那個進程的一部分,也將成為被信賴的一員,也就達到了隱藏的目的。

運行DLL方法有多種,但其中最隱蔽的方法是採用動態嵌入技術,動態嵌入技術指的是將自己的代碼嵌入正在運行的進程中的技術。理論上來説,在Windows中的每個進程都有自己的私有內存空間,別的進程是不允許對這個私有空間進行操作的,但是實際上,我們仍然可以利用種種方法進入並操作進程的私有內存。動態嵌入技術有多種如:窗口Hook、掛接API、遠程線程等,這裏介紹一下遠程線程技術,它只要有基本的進線程和動態鏈接庫的知識就可以很輕鬆地完成動態嵌入。

遠程線程技術指的是通過在另一個進程中創建遠程線程的方法進入那個進程的內存地址空間。我們知道,在進程中,可以通過CreateThread函數創建線程,被創建的新線程與主線程(就是進程啟動時被同時自動建立的那個線程)共享地址空間以及其他的資源。但是很少有人知道,通過CreateRemoteThread也同樣可以在另一個進程內創建新線程,被創建的遠程線程同樣可以共享遠程進程(是遠程進程)的地址空間,所以,實際上,我們通過一個遠程線程,進入了遠程進程的內存地址空間,也就擁有了那個遠程進程相當的權限。

3 實施步驟

1) 用Process32Next()函數找到宿主進程,獲取宿主進程ID,並用

OpenProcess()函數打開宿主進程。

2) 用VirtualAllocEx()函數分配遠程進程地址空間中的內存。

3) 用WriteProcessMemory()函數將待隱藏的DLL的路徑名。

4) 拷貝到步驟二已經分配的內存中。

5) 用GetProcAddress()函數獲取LoadlibraryA()函數的實地址(在中)。

6) 用CreateRemoteThread()函數在遠程進程中創建一個線程。

7) 它調用正確的LoadlibraryA()函數。

8) 為它傳遞步驟二中分配的內存地址。