成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

網絡安全編程:進程的暫停與恢復

安全
如果需要將進程暫停,就需要將進程中所有的線程全部暫停。關于進程的暫停與恢復,實質是對進程中的全部線程進行暫停與恢復。

 [[384233]]

在有些時候,不得不讓進程處于暫停運行的狀態。比如,病毒有兩個運行的進程,它們在不斷互相檢測,當一個病毒進程發現另一個病毒進程被結束了,那么它會再次把被結束的那個病毒進程運行起來。由于兩個病毒進程的互相檢測頻率較高,因此很難把兩個病毒的進程結束掉。因此,只能讓兩個病毒進程都暫停后,再結束兩個病毒的進程。

進程的暫停實質上是線程的暫停,因為進程是一個資源容器,而真正占用CPU時間的是線程。如果需要將進程暫停,就需要將進程中所有的線程全部暫停。關于進程的暫停與恢復,實質是對進程中的全部線程進行暫停與恢復。

1. 暫停與恢復線程所需函數

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

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

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

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

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

OpenThread()函數在VC6默認提供的PSDK中是不存在的,必須安裝更新高版本的PSDK才可以使用該函數。如果沒有更新PSDK的版本,那么需要使用LoadLibrary()和GetProcAddress()來動態調用OpenThread()函數。如果使用更高版本的VC開發環境,那么OpenThread()函數可以直接使用。

要暫停進程中的全部線程,則離不開枚舉線程。枚舉線程的函數是Thread32First()和Thread32Next()兩個。在枚舉線程前,仍然要使用CreateToolhelp32Snapshot()函數來創建系統進程快照,但是該函數不能創建指定進程中的線程快照。因為不能創建指定進程中的線程快照,所以在暫停線程時,必須對枚舉到的線程進行判斷,判斷其是否屬于指定進程中的線程。在THREADENTRY32結構體中,th32ThreadID表示當前枚舉到線程的線程ID,th32OwnerProcessID則表示線程所屬的進程ID。這樣,在枚舉線程時,只要判斷是否屬于指定的進程,即可進行暫停操作。

與線程暫停相對的是恢復暫停的線程?;謴蜁和5木€程的函數是ResumeThread(),其定義如下: 

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

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

2. 線程暫停與恢復的代碼

線程暫停的代碼如下: 

  1. void CManageProcessDlg::OnBtnStop()  
  2.  
  3.   // TODO: Add your control notification handler code here  
  4.   int nPid = -1;  
  5.   nPid = GetSelectPid();  
  6.   // 進程 ID 為 0,則返回  
  7.   if ( nPid == 0 )  
  8.   {  
  9.     return ;  
  10.   }  
  11.   // 創建線程快照  
  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.   // 循環獲取線程快照中的每一項  
  22.   while ( bRet )  
  23.   {  
  24.     // 得到屬于選中進程的線程  
  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);  

線程恢復的代碼如下: 

  1. void CManageProcessDlg::OnBtnResume()  
  2.  
  3.   // TODO: Add your control notification handler code here  
  4.   int nPid = -1;  
  5.   nPid = GetSelectPid();  
  6.   // 進程 ID 為 0,則返回  
  7.   if ( nPid == 0 )  
  8.   {  
  9.     return ;  
  10.   }  
  11.   // 創建線程快照  
  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.   // 循環獲取線程快照中的每一項  
  22.   while ( bRet )  
  23.   {  
  24.     // 得到屬于選中進程的線程  
  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. 系統相關輔助工具介紹

首先看一款關于進程管理的工具Process Explorer,該工具的界面如圖1所示。

圖1  Process Explorer界面

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

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

圖2  RegMon界面

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

圖3  RegMon Filter界面

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

圖4  Process Explorer修改注冊表的項

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

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

圖6  注冊表中被修改的值

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

 

責任編輯:龐桂玉 來源: 計算機與網絡安全
相關推薦

2021-02-21 18:19:43

網絡安全網絡安全編程創建進程

2021-02-23 10:20:07

網絡安全進程代碼

2021-06-24 08:37:34

網絡安全內核代碼

2021-03-03 12:20:42

網絡安全DLL編程

2021-01-22 10:58:16

網絡安全進程間碼如

2021-03-05 13:46:56

網絡安全遠程線程

2021-01-26 13:45:03

網絡安全Winsock編程

2016-10-10 00:18:27

2021-04-22 09:35:23

網絡安全PE地址

2014-05-20 09:22:41

網絡安全

2022-01-09 17:36:26

網絡代碼安全

2023-07-13 07:10:20

2021-06-18 09:55:09

網絡安全目錄監控

2011-07-28 18:56:20

2010-09-08 14:26:48

2021-06-11 13:40:17

網絡安全專殺工具病毒

2021-02-05 15:20:06

網絡安全套接字命令

2011-03-17 13:32:45

2019-03-29 10:31:53

2011-11-08 11:21:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线免费观看 | 黄色在线| 欧洲尺码日本国产精品 | 九九热这里只有精品6 | 欧美做暖暖视频 | 本道综合精品 | av在线免费网站 | 欧美激情国产精品 | 99久久精品免费视频 | 国产精品福利久久久 | 亚洲一二三在线观看 | 亚洲精品一区在线观看 | 日韩成人在线观看 | 久久久久久精 | 亚洲欧美日韩久久 | 你懂的av | 免费黄色成人 | 久久久久久国产精品 | 精品欧美一区二区在线观看欧美熟 | 手机在线不卡av | 蜜臀网 | 91aiai| 精品欧美一区二区在线观看视频 | 羞羞视频在线观看免费观看 | 国内精品久久久久久影视8 最新黄色在线观看 | 色男人天堂av | 国产中文字幕网 | 久久久久国产视频 | 一级片免费视频 | 在线看91 | 精品一区二区三 | 欧美日韩一区二区三区在线观看 | 欧美综合在线视频 | 超碰在线免费av | 国产黄视频在线播放 | 99久久久无码国产精品 | 国产操操操 | 免费激情网站 | 亚洲精品一区二区另类图片 | 国产精品美女久久久久久免费 | 欧美日韩视频 |