資源描述:
《VC++動態(tài)鏈接庫編程之DLL木馬》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、VC++動態(tài)鏈接庫編程之DLL木馬?DLL在程序編制中可作出巨大貢獻(xiàn),它提供了具共性代碼的復(fù)用能力。但是,正如一門高深的武學(xué),若被掌握在正義之俠的手上,便可助其仗義江湖;但若被掌握在邪惡之徒的手上,則必然在江湖上掀起腥風(fēng)血雨。DLL正是一種這樣的武學(xué)。DLL一旦染上了魔性,就不再是正常的DLL程序,而是DLL木馬,一種惡貫滿盈的病毒,令特洛伊一夜之間國破家亡。DLL木馬的原理DLL木馬的實現(xiàn)原理是編程者在DLL中包含木馬程序代碼,隨后在目標(biāo)主機中選擇特定目標(biāo)進(jìn)程,以某種方式強行指定該進(jìn)程調(diào)用包含木馬程序的DLL,最終達(dá)到侵襲目標(biāo)系
2、統(tǒng)的目的。正是DLL程序自身的特點決定了以這種形式加載木馬不僅可行,而且具有良好的隱藏性:(1)DLL程序被映射到宿主進(jìn)程的地址空間中,它能夠共享宿主進(jìn)程的資源,并根據(jù)宿主進(jìn)程在目標(biāo)主機的級別非法訪問相應(yīng)的系統(tǒng)資源;(2)DLL程序沒有獨立的進(jìn)程地址空間,從而可以避免在目標(biāo)主機中留下"蛛絲馬跡",達(dá)到隱蔽自身的目的。DLL木馬實現(xiàn)了"真隱藏",我們在任務(wù)管理器中看不到木馬"進(jìn)程",它完全溶進(jìn)了系統(tǒng)的內(nèi)核。與"真隱藏"對應(yīng)的是"假隱藏","假隱藏"木馬把自己注冊成為一個服務(wù)。雖然在任務(wù)管理器中也看不到這個進(jìn)程,但是"假隱藏"木馬本質(zhì)
3、上還具備獨立的進(jìn)程空間。"假隱藏"只適用于Windows9x的系統(tǒng),對于基于WINNT的操作系統(tǒng),通過服務(wù)管理器,我們可以發(fā)現(xiàn)系統(tǒng)中注冊過的服務(wù)。DLL木馬注入其它進(jìn)程的方法為遠(yuǎn)程線程插入。遠(yuǎn)程線程插入技術(shù)指的是通過在另一個進(jìn)程中創(chuàng)建遠(yuǎn)程線程的方法進(jìn)入那個進(jìn)程的內(nèi)存地址空間。將木馬程序以DLL的形式實現(xiàn)后,需要使用插入到目標(biāo)進(jìn)程中的遠(yuǎn)程線程將該木馬DLL插入到目標(biāo)進(jìn)程的地址空間,即利用該線程通過調(diào)用WindowsAPILoadLibrary函數(shù)來加載木馬DLL,從而實現(xiàn)木馬對系統(tǒng)的侵害。DLL木馬注入程序這里涉及到一個非常重要的W
4、indowsAPI――CreateRemoteThread。與之相比,我們所習(xí)慣使用的CreateThreadAPI函數(shù)只能在進(jìn)程自身內(nèi)部產(chǎn)生一個新的線程,而且被創(chuàng)建的新線程與主線程共享地址空間和其他資源。而CreateRemoteThread則不同,它可以在另外的進(jìn)程中產(chǎn)生線程!CreateRemoteThread有如下特點:(1)CreateRemoteThread較CreateThread多一個參數(shù)hProcess,該參數(shù)用于指定要創(chuàng)建線程的遠(yuǎn)程進(jìn)程,其函數(shù)原型為:HANDLECreateRemoteThread(HANDL
5、EhProcess,//遠(yuǎn)程進(jìn)程句柄LPSECURITY_ATTRIBUTESlpThreadAttributes,SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);(2)線程函數(shù)的代碼不能位于我們用來注入DLL木馬的進(jìn)程所在的地址空間中。也就是說,我們不能想當(dāng)然地自己寫一個函數(shù),并把這個函數(shù)作為遠(yuǎn)程線程的入口函數(shù);(3)不能把本進(jìn)程的指針作為CreateR
6、emoteThread的參數(shù),因為本進(jìn)程的內(nèi)存空間與遠(yuǎn)程進(jìn)程的不一樣。以下程序由作者Shotgun的DLL木馬注入程序簡化而得(單擊此處下載,在經(jīng)典書籍《Windows核心編程》中我們也可以看到類似的例子),它將d盤根目錄下的troydll.dll插入到ID為4000的進(jìn)程中:#include#include#includevoidCheckError(int,int,char*);//出錯處理函數(shù)PDWORDpdwThreadId;HANDLEhRemoteThread
7、,hRemoteProcess;DWORDfdwCreate,dwStackSize,dwRemoteProcessId;PWSTRpszLibFileRemote=NULL;voidmain(intargc,char**argv){intiReturnCode;charlpDllFullPathName[MAX_PATH];WCHARpszLibFileName[MAX_PATH]={0};dwRemoteProcessId=4000;strcpy(lpDllFullPathName,"d:\troydll.dll");//將
8、DLL文件全路徑的ANSI碼轉(zhuǎn)換成UNICODE碼iReturnCode=MultiByteToWideChar(CP_ACP,MB_ERR_INVALID_CHARS,lpDllFullPathName,strlen(lpDllFullPathN