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