一、引言 “特洛伊木馬”曾在網(wǎng)上造成很大恐慌,此類(lèi)黑客程序通過(guò)欺騙手段在普通網(wǎng)絡(luò )用戶(hù)端安裝木馬的服務(wù)端,使用戶(hù)的計算機在上網(wǎng)時(shí)留有后門(mén),而黑客則可以通過(guò)這個(gè)后門(mén)對被感染的計算機隨心所欲地進(jìn)行監視、破壞。顯然這種黑軟對于普通網(wǎng)絡(luò )用戶(hù)的危害是非常嚴重的。
就本質(zhì)而言黑客軟件仍然屬于應用程序,是基于套接字的網(wǎng)絡(luò )通訊程序。因此黑客能成功攻擊被感染計算機的一個(gè)非常必要的先決條件就是此時(shí)被攻擊方已經(jīng)有木馬程序的服務(wù)端在運行。由于木馬程序是一種惡意程序,能在被攻擊者沒(méi)有察覺(jué)的情況下悄悄啟動(dòng)運行為攻擊者打開(kāi)后門(mén),故顯然不能象其他程序一樣堂而皇之的顯示在任務(wù)欄和任務(wù)列表中,否則會(huì )立即為用戶(hù)所察覺(jué)而將其關(guān)閉,也就失去了為攻擊者提供后門(mén)的作用。本文下面就針對其隱藏程序的機理展開(kāi)討論。
二、程序在任務(wù)欄中的隱藏原理 程序在任務(wù)欄的隱藏比較簡(jiǎn)單,首先要保證程序主界面的隱藏,一般是通過(guò)修改應用程序類(lèi)的初始化實(shí)例函數InitInstance()的ShowWindow()語(yǔ)句的SW_SHOW參數為SW_HIDE來(lái)實(shí)現的。主界面隱藏的同時(shí)任務(wù)欄雖然也會(huì )消失,但在程序啟動(dòng)時(shí)會(huì )閃一下,因此需要修改程序的擴展屬性。一種方法是SDK的寫(xiě)法,即直接利用GetWindowLong()獲取到當前的擴展屬性然后通過(guò)邏輯運算去掉原有的WS_EX_APPWINDOW屬性,并新添加一個(gè)WS_EX_TOOLWINDOW屬性,這樣系統會(huì )將其認為是一個(gè)工具條窗口而不會(huì )再在任務(wù)欄中加以顯示。最后需要將修改過(guò)的擴展屬性通過(guò)SetWindowLong()函數將其寫(xiě)回。這兩個(gè)函數的聲明分別如下:
LONG GetWindowLong(HWND hWnd,int nIndex); LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong); |
另一種很簡(jiǎn)便的是MFC的寫(xiě)法:在程序框架類(lèi)的預創(chuàng )建窗口函數里通過(guò)直接對CREATESTRUCT結構對象的邏輯操作而將程序屬性進(jìn)行改變:
cs.style=WS_POPUP; cs.dwExStyle|=WS_EX_TOOLWINDOW; |
這兩種寫(xiě)法雖然表現形式各不相同,其本質(zhì)都是一樣的。
三、程序在任務(wù)列表中的隱藏原理 任務(wù)列表(Ctrl+Alt+Del時(shí)彈出的對話(huà)框)顯示了當前系統正在運行的一些應用程序,如果實(shí)現了上一步,雖然在任務(wù)欄看不見(jiàn)程序,但有經(jīng)驗的用戶(hù)可以通過(guò)觀(guān)察任務(wù)列表而發(fā)現一些值得懷疑的應用程序而在此將其關(guān)閉。所以大多數黑軟也都通過(guò)較復雜的手段實(shí)現了自身在任務(wù)列表中的隱藏,使被發(fā)現的機會(huì )大大降低。
在Win9x/2000中,一般每個(gè)應用程序都要通過(guò)一個(gè)API(應用程序接口)函數RegisterServiceProcess()向系統申請注冊成為一個(gè)服務(wù)進(jìn)程,并且也是通過(guò)這個(gè)函數注銷(xiāo)其服務(wù)進(jìn)程來(lái)結束這個(gè)服務(wù)進(jìn)程的運行。如果一個(gè)進(jìn)程注冊為一個(gè)服務(wù)進(jìn)程,通過(guò)Ctrl+Alt+Del就可以在任務(wù)列表里看見(jiàn)該進(jìn)程的標題。而如果一個(gè)進(jìn)程運行了但沒(méi)有向系統申請注冊成為服務(wù)進(jìn)程那么就不會(huì )在任務(wù)列表里顯示。黑軟也正是利用這個(gè)原理使自身在運行時(shí)能在任務(wù)列表中實(shí)現隱藏。該函數存放于系統內核Kernel32.dll中,具體聲明如下:
| DWORD RegisterServiceProcess(DWORD dwProcessId,DWORD dwType); |
其第一個(gè)參數指定為一個(gè)服務(wù)進(jìn)程的進(jìn)程標識,如果是0則注冊當前的進(jìn)程;第二個(gè)參數指出是注冊還是注銷(xiāo)當前的進(jìn)程,其狀態(tài)分別為:RSP_SIMPLE_SERVICE和RSP_UNREGISTER_SERVICE。黑軟一般是在程序啟動(dòng)初始化時(shí)首先從Kernel32.dll動(dòng)態(tài)連接庫中將RegisterServiceProcess()函數加載到內存,然后再通過(guò)該函數將程序從任務(wù)列表中隱藏:
//從Kernel32.dll中加載RegisterServiceProcess() HMODULE m_hKernel=::GetModuleHandle("Kernel32.DLL"); RSP m_rsp=(RSP)::GetProcAddress(m_hKernel,"RegisterServiceProcess"); m_rsp(::GetCurrentProcessId(),1);//此時(shí)為隱藏,當第二個(gè)參數為0時(shí)顯示 |
另外,還有一部分黑軟是通過(guò)ShowWindowAsync()函數啟動(dòng)一個(gè)新的線(xiàn)程來(lái)顯示一個(gè)新窗口的。該函數的原形為:
| BOOL ShowWindowAsync(HWND hWnd,int nCmdShow); |
而黑軟正是鉆了該函數的第二個(gè)參數可以設置窗體顯示狀態(tài)的空子,在設置成SW_HIDE時(shí)就可以使目標窗體(黑軟)從任務(wù)列表中隱藏。
四、小結 以上就是Win9x/2000下的黑客程序所具備的一些基本功能,在此基礎上我們可以借助于其實(shí)現技巧來(lái)編寫(xiě)出一些諸如后臺監控之類(lèi)的實(shí)用程序。并且可以通過(guò)對黑客類(lèi)軟件的隱藏機理的分析能使廣大用戶(hù)對此類(lèi)黑軟采取一些必要的措施,通過(guò)加強防范來(lái)使自己的損失防患于未然。