正是DLL程序本身的特性決定了這種形式加載木馬不僅可行,而且具有很好的隱蔽性:
(1)DLL程序映射到主機進程的地址空間,可以* * *享受主機進程的資源,並根據主機進程非法訪問目標主機級別的相應系統資源;
(2)2)DLL程序沒有獨立的進程地址空間,可以避免在目標主機中留下“蛛絲馬跡”,達到隱藏自身的目的。
DLL特洛伊實現了“真正的隱藏”,在任務管理器中我們看不到特洛伊“進程”,但它已經完全溶入了系統內核。與“真實隱藏”相對應的是“虛假隱藏”,“虛假隱藏”特洛伊將自己註冊為壹項服務。雖然在任務管理器中看不到這個進程,但是“假隱藏”的特洛伊本質上有壹個獨立的進程空間。“假藏”只適用於Windows9x系統。對於基於WINNT的操作系統,我們可以通過服務管理器找到系統中註冊的服務。
將DLL特洛伊註入其他進程的方法是遠程線程插入。
遠程線程插入技術是指通過在另壹個進程中創建壹個遠程線程來進入該進程的內存地址空間。木馬程序以DLL形式實現後,需要利用插入目標進程的遠程線程將特洛伊木馬DLL插入目標進程的地址空間,即通過調用Windows API LoadLibrary函數加載特洛伊木馬DLL,從而實現木馬對系統的侵害。
DLL特洛伊木馬註入器
這涉及到壹個非常重要的Windows API――CreateRemoteThread。相比之下,我們習慣的CreateThread API函數只能在進程本身內部生成壹個新線程,創建的新線程與主線程共享地址空間和其他資源。CreateRemoteThread不壹樣,它可以在另壹個進程中生成線程!CreateRemoteThread具有以下特征:
(1)CreateRemoteThread比CreateThread多壹個參數hProcess,用於指定創建線程的遠程進程。它的功能原型是:
句柄CreateRemoteThread(
HANDLE hProcess,//遠程進程句柄
LP security _ ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LP thread _ START _ ROUTINE LP START address,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
(2)線程函數的代碼不能位於我們用來註入DLL特洛伊的進程所在的地址空間。換句話說,我們不能想當然地自己寫壹個函數,把這個函數作為遠程線程的入口函數;
(3)該進程的指針不能作為CreateRemoteThread的參數,因為該進程的內存空間與遠程進程的內存空間不同。
(4)使用Windows API VirtualAllocEx函數在遠程線程的VM中分配DLL的全路徑寬度字符所需的存儲空間,並使用Windows API WriteProcessMemory函數將全路徑寫入存儲空間;
(5)使用Windows API GetProcAddress獲取Kernel32模塊中LoadLibraryW函數的地址,作為後面要啟動的遠程線程的入口函數;
(6)使用Windows API CreateRemoteThread啟動遠程線程,將LoadLibraryW的地址作為遠程線程的入口函數地址,將宿主進程中分配空間中存儲的完整DLL路徑作為線程入口函數的參數,啟動指定的DLL;
(7)清理現場。
DLL木馬的防治
從DLL特洛伊馬的原理和壹個簡單的DLL木馬程序中,我們了解了DLL特洛伊馬的工作模式,可以幫助我們更好的了解DLL特洛伊馬病毒的防治手段。
壹般的特洛伊被植入後,需要打開壹個網絡端口與攻擊程序進行通信,所以防火墻是抵禦特洛伊攻擊的最佳方式。防火墻可以檢查數據包過濾,我們可以讓防火墻限制通信端口,只允許系統接受來自少數特定端口的數據請求。這樣,即使特洛伊馬被成功植入,攻擊者也無法進入被入侵的系統,防火墻將攻擊者與特洛伊馬隔離開來。
對於DLL木馬,壹個簡單的觀察方法可能有助於用戶發現它們。我們來看看正在運行的進程所依賴的DLL。如果有壹些令人費解的DLL,我們可以斷定這個進程是宿主進程,系統被植入了DLL特洛伊。“道高壹尺,魔高十丈”。如今DLL木馬也發展到了更高的層次,看起來不再“莫名其妙”。在壹些最新的木馬中,采用了先進的DLL陷阱技術,程序員用特洛伊DLL替換了已知的系統DLL。特洛伊DLL過濾所有的函數調用,使用函數forwarder將正常調用直接轉發給被替換的系統DLL;對於壹些事先約定的特殊情況,DLL會執行壹些相應的操作。