任雁軍
摘要:該文從Windows操作系統(tǒng)的進程的運行機制出發(fā),簡要介紹了Windows操作系統(tǒng)的進程的分類及管理機制,對常見的基于Windows操作系統(tǒng)的進程隱藏技術(shù)進行了概要的介紹并對各類隱藏技術(shù)的優(yōu)勢和不足進行的分析闡述,最后從實用的角度出發(fā),結(jié)合幾種不同的進程隱藏技術(shù)的特點與優(yōu)勢,給出了一種有效的進程隱藏方案,并詳細地分析解讀了實現(xiàn)這一方案的主要技術(shù)方法。
關(guān)鍵詞:進程隱藏;動態(tài)鏈接庫;DLL劫持
中圖分類號:TP393 文獻標(biāo)識碼:A
文章編號:1009-3044(2020)05-0244-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
進程是操作系統(tǒng)中正在運行的一個應(yīng)用程序,是系統(tǒng)進行資源分配和調(diào)度的基本單位,微軟的Windows是目前在PC機上應(yīng)用最廣的多用戶操作系統(tǒng),Window系統(tǒng)的進程大致可分為:系統(tǒng)核心進程、系統(tǒng)進程、服務(wù)進程及用戶進程。使用Win-dows自帶動任務(wù)管理器可以查看并管理一部分顯式存在的進程,然而還有很多進程則是以隱性的方式存在的,無法用任務(wù)管理器或其他工具對其進行查看、終止及刪除。
1 常見進程隱藏技術(shù)
所謂的進程隱藏,通俗地講就是讓可執(zhí)行程序以隱蔽的方式被加載并且使其進程盡可能地長期駐留在內(nèi)存中的方法。
1.1 進程偽裝
1)簡單地將程序改名與系統(tǒng)進程相同或者相似,早期的木馬或病毒多使用這種方法隱身,顯然很容易被識別。
2)將自身注冊為DLL模式的系統(tǒng)服務(wù)這樣在系統(tǒng)進程列表中就能實現(xiàn)隱身,這種方法雖簡單,但需要較高的權(quán)限。
3)借助系統(tǒng)程序Rund1132.exe啟動dll程序也能實現(xiàn)簡單的進程隱藏,但隱身的強度不高。
4)通過修改進程PEB中的命令行參數(shù)實現(xiàn)偽裝,這種方法容易被殺毒軟件查殺。
1.2代碼注入
將自身代碼動態(tài)地寫入目標(biāo)進程的內(nèi)存而實現(xiàn)隱身,這種方法用在系統(tǒng)進程中很難實現(xiàn),在一般進程中的存活時間取決于目標(biāo)進程的存活期,極易被殺毒軟件查殺。
1.3 HOOK隱藏
使用API HOOK函數(shù)捕獲系統(tǒng)消息而實現(xiàn)進程隱藏,這種方法需要較高的權(quán)限,也是殺毒軟件緊盯的目標(biāo)。
1.4 DLL劫持
利用系統(tǒng)加載DLL的順序,將偽造的同名Dll插在目標(biāo)Dll之前被加載,這種方法很巧妙,但隨著windows系統(tǒng)安全防護性能的不斷改進,在win7之后已經(jīng)很難找到可以劫持的系統(tǒng)關(guān)鍵Dll了。
可見前面介紹的每一種進程隱藏方法都有自身的優(yōu)勢和缺陷,在現(xiàn)實中那些與系統(tǒng)進程密切接觸的方法(比如HOOK和注入等)已經(jīng)成了殺毒軟件緊盯的目標(biāo),正確的做法是:讓你的動作盡量接近正常!同時綜合使用多種方法和策略,也能達到取長補短的效果。
2 一種進程隱藏方案實現(xiàn)
2.1實現(xiàn)原理
1) Dll劫持原理:Windows可執(zhí)行文件輸入表中列出的函數(shù)名實體存身在不同的動態(tài)鏈接庫(Dynamic Link Library,縮寫為DLL)文件中,只有當(dāng)函數(shù)被調(diào)用時,系統(tǒng)才加載所需的DLL文件到內(nèi)存中,由于輸入表只指定了DLL文件名而沒有指定具體路徑,所以系統(tǒng)加載器按照:當(dāng)前目錄一系統(tǒng)目錄一環(huán)境路徑的順序查找并加載同名DLL文件。如果將含有相同輸出表的同名DLL文件放在可執(zhí)行文件所在的目錄下就可搶先加載這個偽DLL文件,當(dāng)然之后還需將原DLL加載以免系統(tǒng)報錯。
2)劫持Version.dll實現(xiàn)加載并存活:由于Windows安全防護機制的不斷進步,win7之后系統(tǒng)關(guān)鍵DLL(如:kerne132.dll、ws2_32.dll、lpk.dll等)已經(jīng)無法劫持了,所以被劫持的DLL文件的選擇需要滿足兩個條件:非系統(tǒng)關(guān)鍵文件并且使用率較高。本方案選擇Version.dll作為被劫持對象,常見用戶進程(比如IE、WINWord等)都會調(diào)用它,可以保證“偽Version.dll”的加載成功,當(dāng)然“偽Version.dll”會伴隨調(diào)用它的用戶進程的終止而退出。
3)利用Rund1132隱身:在“偽Version.dll”中創(chuàng)建一個獨立的Rund1132進程加載真正需要隱身的xx. dll進程。命令行參數(shù)為:Rund1132 xx,函數(shù)名。
2.2 實現(xiàn)示意圖
圖1進程隱藏方案實現(xiàn)示意圖
2.3 主要代碼
A>使用預(yù)處理命令向原Version.dll直接轉(zhuǎn)發(fā)導(dǎo)出函數(shù)
#pragma comment(linker, "/EXPORT: VerFindFileA=version-Org.VerFindFileA,@1”)
#pragma comment(linker, "/EXPORT:VerFindFileW=version-Org.VerFindFileW,@2")
….
#pragma comment(linker, "/EXPORT: VerInstaIIFileA=_AheadLib_VerInstaIIFileA,@8”)
#pragma comment(linker, "/EXPORT: VerInstaIIFileW=_AheadLib_VerInstaIIFileW,@9")
….‘
#pragma comment(linker, "/EXPORT: VerLanguageNameA=_AheadLib_VerLanguageNameA, @12 ")
#pragma comment(linker, "/EXPORT: VerLanguageNameW=_AheadLib_VerLanguageNameW, @13 ")