有时,过程必须暂停。例如,病毒有两个操作过程,它们正在不断地相互检测。当一个病毒过程发现另一个病毒过程已经结束时,它将再次运行结束的病毒过程。由于两种病毒过程的相互检测频率较高,很难结束两种病毒的过程。因此,只有在两种病毒过程都被暂停后,两种病毒的过程才能结束。
过程的暂停本质上是线程的暂停,因为过程是一个真正占用的资源容器CPU时间是线程。如果需要暂停过程,则需要暂停过程中的所有线程。关于过程的暂停和恢复,本质上是暂停和恢复过程中的所有线程。
1. 暂停和恢复线程所需的函数
暂停使用线程API函数是SuspendThread()其定义如下:
该函数只有一个参数,即暂停线程的句柄。使用获得线程的句柄OpenThread()函数的定义如下:
该函数的使用 *** 及OpenProcess()类似,但第三个参数是dwThreadId,即线程ID。
OpenThread()函数在VC6默认提供的PSDK不存在,必须安装更新高版本PSDK只能使用此函数。如果没有更新PSDK版本,需要使用LoadLibrary()和GetProcAddress()动态调用OpenThread()函数。如果使用更高版本VC开发环境,那么OpenThread()函数可直接使用。
没有枚举线程,就不能暂停过程中的所有线程。枚举线程的函数是Thread32First()和Thread32Next()两个。在枚举线程之前使用CreateToolhelp32Snapshot()函数创建系统过程快照,但不能在指定过程中创建线程快照。由于在指定过程中无法创建线程快照,因此在暂停线程时,必须判断列出的线程是否属于指定过程中的线程。THREADENTRY32结构体中,th32ThreadID这意味着到线程的线程ID,th32OwnerProcessID这意味着线程所属的过程ID。这样,在枚举线程中,只要判断是否属于指定的过程,就可以暂停操作。
与线程暂停相比,恢复暂停线程。恢复暂停线程的函数是ResumeThread()其定义如下:
该函数的使用 *** 与SuspendThread()相同。恢复暂停的线程类似于暂停的线程,不再重复。
2.代码 线程暂停和恢复
线程暂停代码如下:
线程恢复代码如下:
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键,默认任务管理器出现了。这是注册表中著名的图像劫持,这是许多恶意程序的常用 *** ,如病毒和木马。您可以在这里编写的任务管理器中添加替换系统任务管理器的功能进行练习。