任雁軍

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