网络安全编程:进程的暂停与恢复

 [[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。这样,在枚举线程时,只要判断是否属于指定的进程,即可进行暂停操作。

与线程暂停相对的是恢复暂停的线程。恢复暂停的线程的函数是ResumeThread(),其定义如下: 

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

该函数的使用方法与SuspendThread()一样。恢复暂停的线程的方式与暂停线程的方式类似,不再重复说明。

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键,默认的任务管理器出现了。这就是注册表中有名的映像劫持,这是很多病毒、木马等恶意程序常用的方法。大家可以自己在这里编写的任务管理器中添加替换系统任务管理器的功能以做练习。 

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/143366.html<

(0)
运维的头像运维
上一篇2025-03-09 16:12
下一篇 2025-03-09 16:14

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注