相信大家都有這么一個(gè)經(jīng)歷,我們使用電腦,在某些來(lái)歷不明的網(wǎng)站上下載一些程序,然后打開(kāi)這些程序的時(shí)候,可能會(huì)出現(xiàn)以下的情況。

嗯沒(méi)錯(cuò),你電腦中的殺毒軟件會(huì)給你發(fā)出溫馨的提示,提醒你該程序可能含有木馬病毒,這些病毒可能損害你的計(jì)算機(jī)。那么這些木馬病毒的本質(zhì)是什么呢?他們是怎么攻擊我們的電腦的呢?我們今天就來(lái)探討下這個(gè)問(wèn)題!
首先我們先來(lái)認(rèn)識(shí)一下動(dòng)態(tài)鏈接庫(kù)的概念,DLL是Dynamic Link Library的縮寫(xiě),意為動(dòng)態(tài)鏈接庫(kù)。在windows中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對(duì)獨(dú)立的動(dòng)態(tài)鏈接庫(kù),即DLL文件,放置于系統(tǒng)中。
Windows系統(tǒng)就是由許多的動(dòng)態(tài)鏈接庫(kù)(DLL文件)構(gòu)成的。它們是Windows系統(tǒng)最基本的應(yīng)用程序。
下面就是我們的Windows操作系統(tǒng)的一些動(dòng)態(tài)鏈接庫(kù)。

簡(jiǎn)單來(lái)說(shuō),動(dòng)態(tài)鏈接庫(kù)里面其實(shí)就是一個(gè)一個(gè)的函數(shù),Windows也是一個(gè)應(yīng)用程序,它被分割成了許許多多的動(dòng)態(tài)鏈接庫(kù)。
比較大的應(yīng)用程序都由很多模塊(動(dòng)態(tài)鏈接庫(kù))組成,這些模塊分別完成相對(duì)獨(dú)立的功能,它們彼此協(xié)作來(lái)完成整個(gè)軟件系統(tǒng)的工作。下圖為微信應(yīng)用程序中所調(diào)用的動(dòng)態(tài)鏈接庫(kù)。

Windows 系統(tǒng)平臺(tái)上提供了一種完全不同的較有效的編程和運(yùn)行環(huán)境,你可以將獨(dú)立的程序模塊創(chuàng)建為較小的 DLL 文件,并可對(duì)它們單獨(dú)編譯和測(cè)試。在運(yùn)行時(shí),只有當(dāng) EXE 程序確實(shí)要調(diào)用這些 DLL 模塊的情況下,系統(tǒng)才會(huì)將它們裝載到內(nèi)存空間中。不用的時(shí)候,系統(tǒng)將它們給從內(nèi)存中卸載掉。
這種方式不僅減少了 EXE 文件的大小和對(duì)內(nèi)存空間的需求,而且使這些 DLL 模塊可以同時(shí)被多個(gè)應(yīng)用程序使用。Windows 自己就將一些主要的系統(tǒng)功能以 DLL 模塊的形式實(shí)現(xiàn)。
因此,讀到這里,我相信大家應(yīng)該明白了,為什么殺毒軟件會(huì)給你提示某個(gè)程序含有木馬病毒,就是因?yàn)樵摬《境绦蛑锌赡軙?huì)給你原本正常運(yùn)行的其他程序注入DLL,讓你的正常程序調(diào)用病毒程序攜帶的DLL文件,以導(dǎo)致你的正常程序“中毒”。

DLL的編寫(xiě)與語(yǔ)言沒(méi)有任何關(guān)系,所以我們用VS2017創(chuàng)建一個(gè)動(dòng)態(tài)鏈接庫(kù),命名為MyDll,他就是我們要寫(xiě)的病毒DLL文件。

然后在dllmain.cpp中寫(xiě)我們的代碼,我們的代碼很簡(jiǎn)單,直接寫(xiě)上一個(gè)alert函數(shù),功能是:當(dāng)我們的病毒DLL文件被應(yīng)用程序加載時(shí),直接彈出一個(gè)彈窗。

OK,最后編譯生成我們的DLL文件。
編寫(xiě)完DLL文件之后,我們還要寫(xiě)一個(gè)exe程序,該exe程序就是病毒程序的主體,它完成核心的功能:將我們的病毒DLL寫(xiě)進(jìn)某個(gè)正常運(yùn)行的應(yīng)用程序,讓該正常的應(yīng)用程序調(diào)用我們的DLL代碼,那么這就是一件很危險(xiǎn)的事情了,讓我們的正常運(yùn)行的程序調(diào)用未知的DLL代碼,后果可想而知。這種技術(shù)就是DLL遠(yuǎn)線(xiàn)程注入技術(shù)。
我們的病毒程序會(huì)強(qiáng)制給目標(biāo)進(jìn)程創(chuàng)建一個(gè)線(xiàn)程,線(xiàn)程的任務(wù)是:將我們的病毒木馬DLL加載進(jìn)目標(biāo)進(jìn)程,讓目標(biāo)進(jìn)程執(zhí)行DLL代碼。
那么,代碼如何寫(xiě)呢?
我們還是使用VS2017編寫(xiě),創(chuàng)建一個(gè)控制臺(tái)程序,命名為dll_inject。

然后按照剛才提到的思路編寫(xiě)代碼,這沒(méi)什么難度,查看MSDN,調(diào)用Win32API即可實(shí)現(xiàn)。

主函數(shù)中調(diào)用我們的dll注入攻擊函數(shù)dll_inject,我們用來(lái)攻擊一下PC版的微信,查看用戶(hù)管理器,得知微信的PID為17544,以第一個(gè)參數(shù)傳進(jìn)去,第二個(gè)參數(shù)即我們要注入的DLL文件的路徑。

編譯之后,得到我們的dll注入主程序。

雙擊運(yùn)行,看一下攻擊的結(jié)果:
可以看到,微信進(jìn)程已經(jīng)被成功注入了我們的病毒DLL文件了,也彈窗了,彈窗就證明我們的病毒DLL被微信加載成功。


所以,總結(jié)一下,總體思路是:
1)編寫(xiě)一個(gè)病毒DLL,完成我們想要干的壞事。
2)編寫(xiě)一個(gè)應(yīng)用程序exe,強(qiáng)制讓遠(yuǎn)程的進(jìn)程創(chuàng)建一個(gè)線(xiàn)程,執(zhí)行加載DLL文件的操作。
3)遠(yuǎn)程進(jìn)程加載成功我們寫(xiě)的病毒DLL之后,就表示我們的DLL已經(jīng)成功注入遠(yuǎn)程進(jìn)程中了,也可以說(shuō)是感染到了遠(yuǎn)程進(jìn)程了。
DLL的發(fā)明給我們帶來(lái)了諸多便利和優(yōu)雅,但是也可能會(huì)給我們帶來(lái)災(zāi)難性的后果,我們的世界就是黑和白的斗爭(zhēng),然后在斗爭(zhēng)中不斷地發(fā)展。