日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
網(wǎng)絡(luò)安全編程:進(jìn)程的暫停與恢復(fù)

在有些時(shí)候,不得不讓進(jìn)程處于暫停運(yùn)行的狀態(tài)。比如,病毒有兩個(gè)運(yùn)行的進(jìn)程,它們在不斷互相檢測,當(dāng)一個(gè)病毒進(jìn)程發(fā)現(xiàn)另一個(gè)病毒進(jìn)程被結(jié)束了,那么它會(huì)再次把被結(jié)束的那個(gè)病毒進(jìn)程運(yùn)行起來。由于兩個(gè)病毒進(jìn)程的互相檢測頻率較高,因此很難把兩個(gè)病毒的進(jìn)程結(jié)束掉。因此,只能讓兩個(gè)病毒進(jìn)程都暫停后,再結(jié)束兩個(gè)病毒的進(jìn)程。

目前成都創(chuàng)新互聯(lián)公司已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、玉龍網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

進(jìn)程的暫停實(shí)質(zhì)上是線程的暫停,因?yàn)檫M(jìn)程是一個(gè)資源容器,而真正占用CPU時(shí)間的是線程。如果需要將進(jìn)程暫停,就需要將進(jìn)程中所有的線程全部暫停。關(guān)于進(jìn)程的暫停與恢復(fù),實(shí)質(zhì)是對進(jìn)程中的全部線程進(jìn)行暫停與恢復(fù)。

1. 暫停與恢復(fù)線程所需函數(shù)

讓線程暫停所使用的API函數(shù)是SuspendThread(),其定義如下: 

 
 
 
  1. DWORD SuspendThread(  
  2.  HANDLE hThread // handle to thread  
  3. ); 

該函數(shù)只有一個(gè)參數(shù),是要暫停線程的句柄。獲得線程的句柄使用OpenThread()函數(shù),該函數(shù)的定義如下: 

 
 
 
  1. HANDLE OpenThread(  
  2.  DWORD dwDesiredAccess, // access right  
  3.  BOOL bInheritHandle, // handle inheritance option 
  4.  DWORD dwThreadId // thread identifier  
  5. ); 

該函數(shù)的使用方法與OpenProcess()類似,只是第3個(gè)參數(shù)是dwThreadId,即線程ID。

OpenThread()函數(shù)在VC6默認(rèn)提供的PSDK中是不存在的,必須安裝更新高版本的PSDK才可以使用該函數(shù)。如果沒有更新PSDK的版本,那么需要使用LoadLibrary()和GetProcAddress()來動(dòng)態(tài)調(diào)用OpenThread()函數(shù)。如果使用更高版本的VC開發(fā)環(huán)境,那么OpenThread()函數(shù)可以直接使用。

要暫停進(jìn)程中的全部線程,則離不開枚舉線程。枚舉線程的函數(shù)是Thread32First()和Thread32Next()兩個(gè)。在枚舉線程前,仍然要使用CreateToolhelp32Snapshot()函數(shù)來創(chuàng)建系統(tǒng)進(jìn)程快照,但是該函數(shù)不能創(chuàng)建指定進(jìn)程中的線程快照。因?yàn)椴荒軇?chuàng)建指定進(jìn)程中的線程快照,所以在暫停線程時(shí),必須對枚舉到的線程進(jìn)行判斷,判斷其是否屬于指定進(jìn)程中的線程。在THREADENTRY32結(jié)構(gòu)體中,th32ThreadID表示當(dāng)前枚舉到線程的線程ID,th32OwnerProcessID則表示線程所屬的進(jìn)程ID。這樣,在枚舉線程時(shí),只要判斷是否屬于指定的進(jìn)程,即可進(jìn)行暫停操作。

與線程暫停相對的是恢復(fù)暫停的線程?;謴?fù)暫停的線程的函數(shù)是ResumeThread(),其定義如下: 

 
 
 
  1. DWORD ResumeThread(  
  2.  HANDLE hThread // handle to thread  
  3. ); 

該函數(shù)的使用方法與SuspendThread()一樣?;謴?fù)暫停的線程的方式與暫停線程的方式類似,不再重復(fù)說明。

2. 線程暫停與恢復(fù)的代碼

線程暫停的代碼如下: 

 
 
 
  1. void CManageProcessDlg::OnBtnStop()  
  2. {  
  3.   // TODO: Add your control notification handler code here  
  4.   int nPid = -1;  
  5.   nPid = GetSelectPid();  
  6.   // 進(jìn)程 ID 為 0,則返回  
  7.   if ( nPid == 0 )  
  8.   {  
  9.     return ;  
  10.   }  
  11.   // 創(chuàng)建線程快照  
  12.   HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, nPid);  
  13.   if ( hSnap == INVALID_HANDLE_VALUE ) 
  14.   {  
  15.     AfxMessageBox("CreateToolhelp32Snapshot Error");  
  16.     return ;  
  17.   }  
  18.   THREADENTRY32 Te32 = { 0 };  
  19.   Te32.dwSize = sizeof(THREADENTRY32);  
  20.   BOOL bRet = Thread32First(hSnap, &Te32);  
  21.   // 循環(huán)獲取線程快照中的每一項(xiàng)  
  22.   while ( bRet )  
  23.   {  
  24.     // 得到屬于選中進(jìn)程的線程  
  25.     if ( Te32.th32OwnerProcessID == nPid )  
  26.     {  
  27.       // 打開線程  
  28.       HANDLE hThread = OpenThread(THREAD_ALL_ACCESS,  
  29.         FALSE, Te32.th32ThreadID); 
  30.       // 暫停線程  
  31.       SuspendThread(hThread);  
  32.       CloseHandle(hThread);  
  33.     }  
  34.     bRet = Thread32Next(hSnap, &Te32);  
  35.   }  
  36.   CloseHandle(hSnap);  

線程恢復(fù)的代碼如下: 

 
 
 
  1. void CManageProcessDlg::OnBtnResume()  
  2. {  
  3.   // TODO: Add your control notification handler code here  
  4.   int nPid = -1;  
  5.   nPid = GetSelectPid();  
  6.   // 進(jìn)程 ID 為 0,則返回  
  7.   if ( nPid == 0 )  
  8.   {  
  9.     return ;  
  10.   }  
  11.   // 創(chuàng)建線程快照  
  12.   HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, nPid);  
  13.   if ( hSnap == INVALID_HANDLE_VALUE )  
  14.   {  
  15.     AfxMessageBox("CreateToolhelp32Snapshot Error");  
  16.     return ;  
  17.   }  
  18.   THREADENTRY32 Te32 = { 0 };  
  19.   Te32.dwSize = sizeof(THREADENTRY32);  
  20.   BOOL bRet = Thread32First(hSnap, &Te32);  
  21.   // 循環(huán)獲取線程快照中的每一項(xiàng)  
  22.   while ( bRet )  
  23.   {  
  24.     // 得到屬于選中進(jìn)程的線程  
  25.     if ( Te32.th32OwnerProcessID == nPid )  
  26.     {  
  27.       // 打開線程  
  28.       HANDLE hThread = OpenThread(THREAD_ALL_ACCESS,  
  29.         FALSE, Te32.th32ThreadID);  
  30.       // 暫停線程  
  31.       ResumeThread(hThread);  
  32.       CloseHandle(hThread);  
  33.     }  
  34.     bRet = Thread32Next(hSnap, &Te32);  
  35.   }  

3. 系統(tǒng)相關(guān)輔助工具介紹

首先看一款關(guān)于進(jìn)程管理的工具Process Explorer,該工具的界面如圖1所示。

圖1  Process Explorer界面

該軟件的功能非常強(qiáng)大。當(dāng)啟動(dòng)一個(gè)進(jìn)程或者結(jié)束一個(gè)進(jìn)程的時(shí)候,該軟件會(huì)高亮顯示被啟動(dòng)或結(jié)束的進(jìn)程。當(dāng)然,它的功能非常多。大家自己研究挖掘一下。這里重點(diǎn)介紹該工具的一個(gè)小功能,單擊菜單“Option”->“Replace Task Manager”。該功能是用來替換系統(tǒng)的任務(wù)管理器,也就是將Process Explorer設(shè)為默認(rèn)的任務(wù)管理器。請按照上述設(shè)置方法進(jìn)行設(shè)置,然后按下Ctrl+Shift+Esc組合鍵試試,系統(tǒng)默認(rèn)的任務(wù)管理器不見了,而顯示的是Process Explorer,系統(tǒng)默認(rèn)的任務(wù)管理器已經(jīng)被Process Explorer所替換。如果想要還原到原來的任務(wù)管理器,只要再次單擊“Replace Task Manager”菜單項(xiàng)就可以了。

替換任務(wù)管理器的功能是如何實(shí)現(xiàn)的呢?原理非常簡單,就是對注冊表做了手腳,但是如何知道對注冊表做了什么樣的改動(dòng)呢?另外一個(gè)值得推薦的工具叫作RegMon,它是用來監(jiān)控注冊表變化的工具。該軟件如圖2所示。

圖2  RegMon界面

打開RegMon工具后,按下Ctrl+L組合鍵會(huì)出現(xiàn)“RegMon Filter”界面,在“Include”中填入“procexp.exe”(procexp.exe是Process Explorer工具的文件名),如圖3所示。

圖3  RegMon Filter界面

對“RegMon Filter”界面設(shè)置完畢后,單擊“OK”按鈕確認(rèn),回到Process Explorer工具中,單擊其菜單的“Replace Task Manager”菜單項(xiàng),看RegMon捕獲到的注冊表信息,如圖4和圖5所示。

圖4  Process Explorer修改注冊表的項(xiàng)

圖5  Process Explorer修改注冊表鍵的值

打開注冊表編輯器,查看被修改注冊表鍵值的內(nèi)容,如圖6所示。

圖6  注冊表中被修改的值

在注冊表中,HKLM\Software\Microsoft\Windows NT\CurrentVersion\ImageFileExecution\taskmgr.exe\debugger的值為D盤下的ProcExp.exe的文件(該文件是Process Explorer的文件名),將該鍵值刪掉,再按下Ctrl+Shift+Esc鍵,默認(rèn)的任務(wù)管理器出現(xiàn)了。這就是注冊表中有名的映像劫持,這是很多病毒、木馬等惡意程序常用的方法。大家可以自己在這里編寫的任務(wù)管理器中添加替換系統(tǒng)任務(wù)管理器的功能以做練習(xí)。


本文題目:網(wǎng)絡(luò)安全編程:進(jìn)程的暫停與恢復(fù)
網(wǎng)頁地址:http://www.5511xx.com/article/ccegoic.html