閱讀屋>技工> Windows NT/系統下程序隱藏的基本技術和方法

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

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,如果那個程序是可信程序,(例如瀏覽器程式IEXPLORE.EXE,沒人會懷疑它是木馬吧?)那麼我們編寫的DLL作為那個程序的一部分,也將成為被信賴的一員,也就達到了隱藏的目的。

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

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

  3 實施步驟

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

  OpenProcess()函式開啟宿主程序。

  2) 用VirtualAllocEx()函式分配遠端程序地址空間中的記憶體。

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

  4) 複製到步驟二已經分配的記憶體中。

  5) 用GetProcAddress()函式獲取LoadlibraryA()函式的實地址(在kernel32.dll中)。

  6) 用CreateRemoteThread()函式在遠端程序中建立一個執行緒。

  7) 它呼叫正確的LoadlibraryA()函式。

  8) 為它傳遞步驟二中分配的記憶體地址。

【Windows NT/系統下程序隱藏的基本技術和方法】相關文章: