程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC++下剖析黑客軟件隱蔽程序的手段

VC++下剖析黑客軟件隱蔽程序的手段

編輯:關於VC++

隨著計算機網絡的不斷發展,黑客技術也日益成為一支不可忽視的技術力量,盡管多數黑客的攻擊目標以服務器為主,對大多數的互連網用戶的直接危害並不大。但有一類稱為"特洛伊木馬"的黑客程序可以通過欺騙等手段在普通網絡用戶端安裝木馬的服務端,使用戶的計算機在上網時留有後門,而黑客則可以通過這個後門對被感染的計算機隨心所欲地進行監視、破壞。顯然這種黑軟對於普通網絡用戶的危害是非常嚴重的。

此類黑軟仍然屬於應用程序,其本質是基於套接字的網絡通訊程序。因此黑客能成功攻擊被感染計算機的一個非常必要的先決條件就是此時被攻擊方已經有木馬程序的服務端在運行。由於木馬程序是一種惡意程序,能在被攻擊者沒有察覺的情況下悄悄啟動運行為攻擊者打開後門,故顯然不能象其他程序一樣堂而皇之的顯示在任務欄和任務列表中,否則會立即為用戶所察覺而將其關閉,也就失去了為攻擊者提供後門的作用。本文下面就針對其隱藏程序的機理展開討論。

二、程序在任務欄中的隱藏原理

程序在任務欄的隱藏比較簡單,首先要保證程序主界面的隱藏,一般是通過修改應用程序類的初始化實例函數InitInstance()的ShowWindow()語句的SW_SHOW參數為SW_HIDE來實現的。主界面隱藏的同時任務欄雖然也會消失,但在程序啟動時會閃一下,因此需要修改程序的擴展屬性。一種方法是SDK的寫法,即直接利用GetWindowLong()獲取到當前的擴展屬性然後通過邏輯運算去掉原有的WS_EX_APPWINDOW屬性,並新添加一個WS_EX_TOOLWINDOW屬性,這樣系統會將其認為是一個工具條窗口而不會再在任務欄中加以顯示。最後需要將修改過的擴展屬性通過SetWindowLong()函數將其寫回。這兩個函數的聲明分別如下:

LONG GetWindowLong(HWND hWnd,int nIndex);
LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong);

另一種很簡便的是MFC的寫法:在程序框架類的預創建窗口函數裡通過直接對CREATESTRUCT結構對象的邏輯操作而將程序屬性進行改變:

cs.style=WS_POPUP;

cs.dwExStyle|=WS_EX_TOOLWINDOW;

這兩種寫法雖然表現形式各不相同,其本質都是一樣的。

三、程序在任務列表中的隱藏原理

任務列表(Ctrl+Alt+Del時彈出的對話框)顯示了當前系統正在運行的一些應用程序,如果實現了上一步,雖然在任務欄看不見程序,但有經驗的用戶可以通過觀察任務列表而發現一些值得懷疑的應用程序而在此將其關閉。所以大多數黑軟也都通過較復雜的手段實現了自身在任務列表中的隱藏,使被發現的機會大大降低。

在Win9x中,一般每個應用程序都要通過一個API(應用程序接口)函數RegisterServiceProcess()向系統申請注冊成為一個服務進程,並且也是通過這個函數注銷其服務進程來結束這個服務進程的運行。如果一個進程注冊為一個服務進程,通過Ctrl+Alt+Del就可以在任務列表裡看見該進程的標題。而如果一個進程運行了但沒有向系統申請注冊成為服務進程那麼就不會在任務列表裡顯示。黑軟也正是利用這個原理使自身在運行時能在任務列表中實現隱藏。該函數存放於系統內核Kernel32.dll中,具體聲明如下:

DWORD RegisterServiceProcess(DWORD dwProcessId,DWORD dwType);

其第一個參數指定為一個服務進程的進程標識,如果是0則注冊當前的進程;第二個參數指出是注冊還是注銷當前的進程,其狀態分別為:RSP_SIMPLE_SERVICE和RSP_UNREGISTER_SERVICE。黑軟一般是在程序啟動初始化時首先從Kernel32.dll動態連接庫中將RegisterServiceProcess()函數加載到內存,然後再通過該函數將程序從任務列表中隱藏:

//從Kernel32.dll中加載RegisterServiceProcess()
HMODULE m_hKernel=::GetModuleHandle("Kernel32.DLL");
RSP m_rsp=(RSP)::GetProcAddress(m_hKernel,"RegisterServiceProcess");
m_rsp(::GetCurrentProcessId(),1);//此時為隱藏,當第二個參數為0時顯示

另外,還有一部分黑軟是通過ShowWindowAsync()函數啟動一個新的線程來顯示一個新窗口的。該函數的原形為:

BOOL ShowWindowAsync(HWND hWnd,int nCmdShow);

而黑軟正是鑽了該函數的第二個參數可以設置窗體顯示狀態的空子,在設置成SW_HIDE時就可以使目標窗體(黑軟)從任務列表中隱藏。

小結:以上就是Win9x下的黑客程序所具備的一些基本功能,在此基礎上我們可以借助於其實現技巧來編寫出一些諸如後台監控之類的實用程序。並且可以通過對黑客類軟件的隱藏機理的分析能使廣大用戶對此類黑軟采取一些必要的措施,通過加強防范來使自己的損失防患於未然。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved