議木馬自啟動(dòng)應(yīng)用
時(shí)間:2022-08-20 05:34:00
導(dǎo)語(yǔ):議木馬自啟動(dòng)應(yīng)用一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要:木馬一種具有遠(yuǎn)程控制功能的程序。文件關(guān)聯(lián)是木馬實(shí)現(xiàn)自啟動(dòng)的方法之一,這種方式的實(shí)現(xiàn)有三個(gè)關(guān)鍵技術(shù)。在詳細(xì)分析這三個(gè)關(guān)鍵技術(shù)后,用VC++編程實(shí)現(xiàn)木馬的自啟動(dòng)從而深刻地揭示該方法的原理。
關(guān)鍵詞:文件關(guān)聯(lián);木馬;自啟動(dòng)
1木馬啟動(dòng)的方式
木馬是一種能實(shí)現(xiàn)遠(yuǎn)程控制的黑客程序,具有竊取密碼,屏幕控制,文件傳輸?shù)任:1]。從廣義上來(lái)講,木馬是一種病毒,但不具有自我復(fù)制的特點(diǎn),因此,木馬要使用各種方法讓程序在計(jì)算機(jī)上運(yùn)行而又不被用戶發(fā)現(xiàn)。木馬首次被執(zhí)行后可能被用戶關(guān)閉或木馬程序隨著計(jì)算機(jī)的重啟或關(guān)閉,因此木馬還需要解決自啟動(dòng)的問(wèn)題,以達(dá)到長(zhǎng)期控制被害機(jī)器的目的。木馬常用的啟動(dòng)方法有以下幾種:
1.1通過(guò)注冊(cè)表
Windows操作系統(tǒng)的注冊(cè)表提供了一個(gè)注冊(cè)表項(xiàng),它的具體路徑是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。通過(guò)該表項(xiàng)可以實(shí)現(xiàn)程序的自啟動(dòng),一些重要的程序也是通過(guò)該表項(xiàng)來(lái)實(shí)現(xiàn)自啟動(dòng)的,例如輸入法程序,防火墻程序等。而該表項(xiàng)也為木馬的啟動(dòng)提供了可乘之機(jī),一些木馬就是利用該表項(xiàng)來(lái)實(shí)現(xiàn)自啟動(dòng),例如冰河。
1.2通過(guò)服務(wù)
Windows的很多后臺(tái)服務(wù)是通過(guò)系統(tǒng)“服務(wù)”程序來(lái)啟動(dòng)的,例如www服務(wù),telnet服務(wù)等。一些木馬程序也會(huì)注冊(cè)成后臺(tái)服務(wù)從而隨著計(jì)算機(jī)的啟動(dòng)而運(yùn)行。例如某些版本的灰鴿子就是使用這個(gè)方法。一些論文[2]詳細(xì)討論了這種方法的實(shí)現(xiàn)。
1.3通過(guò)文件關(guān)聯(lián)
文件關(guān)聯(lián)是指木馬與某一種類型的文件或程序關(guān)聯(lián)在一起,當(dāng)打開(kāi)文件或程序被運(yùn)行時(shí),木馬也悄悄隨著運(yùn)行。木馬一般選擇與常用的文件建立關(guān)聯(lián),否則即使建立了關(guān)聯(lián),木馬也可能由于文件沒(méi)有被打開(kāi)而不能自啟動(dòng)。冰河除了使用注冊(cè)表的方法外,也使用了關(guān)聯(lián)的方法,它通常關(guān)聯(lián)文本文件,當(dāng)然也可能關(guān)聯(lián)其它類型的文件。而廣外女生則關(guān)聯(lián)了EXE文件和COM文件,因此,任何一個(gè)EXE文件運(yùn)行都啟動(dòng)了木馬程序。一些論文[5]討論了另類的文件關(guān)聯(lián)的方法。
2文件關(guān)聯(lián)的關(guān)鍵技術(shù)
用文件關(guān)聯(lián)的方法實(shí)現(xiàn)木馬自啟動(dòng)有三個(gè)關(guān)鍵技術(shù),一是如何與文件或程序建立關(guān)聯(lián);二是調(diào)用正常的程序;三是如何獲得用戶需要打開(kāi)的文件名或程序名。本文以關(guān)聯(lián)文本文件為例進(jìn)行討論,并在VC++下編程實(shí)現(xiàn)。
2.1建立文件關(guān)聯(lián)
一個(gè)文件可以用某個(gè)程序打開(kāi),也可以用另外一個(gè)程序打開(kāi),但有一個(gè)默認(rèn)的打開(kāi)程序。默認(rèn)的打開(kāi)程序其實(shí)是由注冊(cè)表來(lái)決定的。在Windows的注冊(cè)表HKEY_CLASSES_ROOT表項(xiàng)中,包括很多類型的文件的相關(guān)信息,例如文件的圖標(biāo),文件打開(kāi)程序等。如果想修改文件的默認(rèn)打開(kāi)程序,修改這個(gè)注冊(cè)表項(xiàng)就可以了。因此,當(dāng)我們要與文本文件建立關(guān)聯(lián),通過(guò)程序修改注冊(cè)表項(xiàng)
HKEY_CLASSES_ROOT\txtfile中的shell\open\command鍵的鍵值為木馬程序就可以了。正常情況下,該鍵值的內(nèi)容為notepad.exe%1,其中%1表示txt文件名。
2.2調(diào)用正常的程序
通過(guò)修改注冊(cè)表,木馬能夠隨著用戶雙擊文件而悄悄運(yùn)行了,但如果默認(rèn)的正常程序沒(méi)有運(yùn)行,便會(huì)引起用戶的懷疑,所以木馬還需要解決運(yùn)行正常程序的問(wèn)題。對(duì)于文本文件,默認(rèn)的打開(kāi)程序是記事本程序,因此木馬還需要調(diào)用記事本程序,也就是notepad程序。
2.3獲得文件名
木馬調(diào)用記事本程序的同時(shí),還要獲得用戶所需要打開(kāi)的文件名(一般是用戶雙擊的文件名),同時(shí)把文件名傳遞給記事本程序,這樣用戶所看到的就是文本文件被正常打開(kāi)了。
3編程思路及實(shí)現(xiàn)
在本文中,我們的木馬程序命名為server.exe,我們的目標(biāo)是server程序首次執(zhí)行時(shí)(server程序的首次執(zhí)行可以通過(guò)欺騙用戶或捆綁文件等方法來(lái)實(shí)現(xiàn)),把server程序與txt文件建立關(guān)聯(lián),此后每當(dāng)用戶雙擊一個(gè)txt文件時(shí),server程序就悄悄地運(yùn)行,同時(shí)txt文件能正常地顯示在記事本程序中。因?yàn)閟erver程序是悄悄運(yùn)行,所以用戶看到的僅僅是一個(gè)記事本程序把txt文件打開(kāi)了。程序首先實(shí)現(xiàn)文件關(guān)聯(lián),主要通過(guò)修改注冊(cè)表實(shí)現(xiàn);程序獲得txt文件完整路徑及正確文件名;調(diào)用notepad程序,并把獲得的文件名傳遞給notepad程序。當(dāng)然,server程序作為木馬還應(yīng)包括其它功能,但這些功能不在本文討論之列。
3.1文件關(guān)聯(lián)的實(shí)現(xiàn)
與txt建立關(guān)聯(lián)的方法是,修改注冊(cè)表的HKEY_CLASSES_ROOT\txtfile\shell\open\command項(xiàng),把它的鍵值修改為server.exe程序。這需要用到注冊(cè)表RegOpenKeyEx()函數(shù)以及RegSetValueEx()函數(shù)。這部分關(guān)鍵程序代碼如下:
//寫(xiě)入注冊(cè)表,建立關(guān)系
HKEYhKey;
HKEYhKey1;
//找到注冊(cè)表項(xiàng)
LPCTSTRlpCommand="txtfile\\shell\\open\\command";
//打開(kāi)注冊(cè)項(xiàng)Key
long
lRet1=RegOpenKeyEx(HKEY_CLASSES_ROOT,lpCommand,0,KEY_WRITE,&hKey1);
if(lRet1==ERROR_SUCCESS)
{//定義并獲得木馬程序名
charpFileName[100]={0};
DWORDdwRet=GetModuleFileName(NULL,pFileName,MAX_PATH);
chartt[200]={0};
strcpy(tt,pFileName);
strcat(tt,"%1");//%1表示txt文件本身
//添加一個(gè)子Key,并設(shè)置值
lRet1=RegSetValueEx(hKey1,NULL,0,REG_EXPAND_SZ,(BYTE*)tt,strlen(tt));
//關(guān)閉注冊(cè)表
RegCloseKey(hKey1);
3.2調(diào)用正常程序的實(shí)現(xiàn)
在server中調(diào)用notepad主要用ShellExceute()函數(shù),詳細(xì)的函數(shù)調(diào)用見(jiàn)“獲得文件名的實(shí)現(xiàn)”部分的代碼。
3.3獲得文件名的實(shí)現(xiàn)
由于已經(jīng)建立關(guān)系,當(dāng)用戶雙擊一個(gè)txt文件時(shí),server.exe則會(huì)啟動(dòng),而txt文件名則需要用GetCommandLine()函數(shù)進(jìn)行并且進(jìn)行處理,這是GetCommandLine()函數(shù)所獲得的文件名包括一些空字符以及server程序路徑以及程序名等。
char*ptr=(char*)GetCommandLine();//獲得文件名,如果沒(méi)有雙擊txt文件名,則這個(gè)文件名是server程序名
intj,k;
j=0;
j=strlen(ptr);
k=strlen(pFileName);//server路徑及程序名長(zhǎng)度
k=k+3;
if(j>k)//用戶雙擊txt文件
ShellExecute(0,NULL,"notepad.exe",ptr+k,NULL,1);//調(diào)用notepad并且把txt文件名傳遞給notepad程序。
4小結(jié)
木馬的自啟動(dòng)方法對(duì)黑客實(shí)現(xiàn)控制被害機(jī)器是至關(guān)重要的一項(xiàng)功能。關(guān)聯(lián)文件的方法是木馬實(shí)現(xiàn)自啟動(dòng)的常用方法之一。建立關(guān)聯(lián),調(diào)用正常程序以及獲取用戶打開(kāi)文件名是這種方法的三個(gè)關(guān)鍵技術(shù)。本文討論木馬關(guān)聯(lián)txt文件的實(shí)現(xiàn)技術(shù)和方法,并在VC++中編程實(shí)現(xiàn)。木馬的自啟動(dòng)還應(yīng)考慮是否運(yùn)行多個(gè)木馬程序的問(wèn)題,也就是程序互斥的實(shí)現(xiàn),程序在這一方面并沒(méi)有解決和實(shí)現(xiàn)這個(gè)問(wèn)題,如果解決了這個(gè)問(wèn)題,則程序則更加完善。