Windows 进程和作业
- 创建进程
- CreateProcess 函数的参数
- CreateProcess 的流程
- 创建Windows“现代化”进程
- 创建其他类型的进程
- 进程的内部构造
- EPROCESS
- KPROCESS
- PEB
- CSR_PROCESS
- W32PROCESS
- 受保护进程
- 最小进程和 Pico 进程
- 最小进程
- Pico进程
- Trustlet 安全进程
- 进程的终止
- 作业
- 作业的限制
- 使用作业
- 操作作业
- Windows 查看作业对象
- Windows容器
本节内容大纲如下:
创建进程
CreateProcess 函数的参数
CreateProcess是Windows操作系统提供的API,用于创建新进程。通过CreateProcess API,可以创建一个新的进程并启动它,同时可以指定程序、命令行参数、工作目录、环境变量、安全特性和进程优先级等。CreateProcess API的原型如下:
BOOL CreateProcess(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
参数说明:
- lpApplicationName:可执行文件的名称或完整路径。
- lpCommandLine:命令行参数。
- lpProcessAttributes和lpThreadAttributes:安全特性参数,用于指定进程和线程的安全属性,默认为NULL。
- bInheritHandles:是否继承父进程的句柄,如文件句柄、命名管道等。
- dwCreationFlags:创建标志,如指定CREATE_NEW_CONSOLE可以创建一个新的控制台窗口。
- lpEnvironment:环境变量指针,指定进程使用的环境变量,默认为NULL,即使用父进程的环境变量。
- lpCurrentDirectory:工作目录。
- lpStartupInfo:启动信息结构体,用于指定进程的窗口样式、标题等。
- lpProcessInformation:进程信息结构体,包含了新创建进程的句柄、ID等信息。
CreateProcess API可用于创建GUI程序、控制台程序、Windows服务、COM服务器等各种类型的应用程序。
CreateProcess 的流程
CreateProcess 的主要流程如下:
- 验证参数,将 Windows 子系统标志和选项转换为原生形式,解析、验证并转换属性列表为原生形式。
- 打开要在进程中执行的映像文件(.exe)
- 创建 Windows 执行体进程对象
- 创建初始线程(栈、上下文、Windows 执行体线程对象)
- 执行创建后需要的,与 Windows 子系统有关的进程初始化操作
- 开始执行初始化线程(指定了 CREATE_SUSPENDED 除外)
- 在新进程和线程的上下文种完成地址空间的初始化操作(如加载 DLL 库),并开始执行程序的入口点。
创建Windows“现代化”进程
创建现代化应用程序进程除了要通过正确的可执行文件路径调用 CreateProcess 之外,还要执行其他工作。例如要提供必需的命令行参数,此外还要添加一个未文档化的进程属性,并提供一个名为 PROC_THREAD_ATTRIBUTE_PACKAGE_FULL_NAME 的键,通过该键的值设置完整的商店应用包名称。虽然该属性尚未文档化,但我们可以通过其他方式执行商店应用。
创建其他类型的进程
虽然 Windows 应用程序可以启动传统或现代化应用程序,但执行体还可以支持绕过 Windows API 启动其他类型的进程。如原生进程、最小进程或 Pico 进程。
进程的内部构造
每个 Windows 进程都可以用一个执行体进程(EPROCESS)结构来表示。
PROCESS 及其大部分相关数据结构都位于系统地址空间中。唯一例外是进程环境块(process environment block,PEB),它是位于进程(用户)地址空间中。
EPROCESS
可以通过 dt nt!_eprocess 查看当前调试进程的 EPROCESS 内容。
KPROCESS
在 EPROCESS 中的第一个成员名为进程控制块(process control block,PCB),它是一种 KPROCESS 类型的结构,专门用于内核进程。它的结构如下:
我们可以通过 dt nt!_kprocess 查看 KPROCESS 结构。
PEB
PEB 位于它所描述的进程的用户模式地址空间,其中包含了映像加载程序、堆管理器以及其他 Windows 组件需要从用户模式访问的信息。通过系统调用暴露所有这些信息是一种非常大开销的做法,而 EPROCESS 和 KPROCESS 结构只能从内核模式访问,为了节省内核空间所以又有了用户空间下的 PEB(process environment block,PEB)
查看 PEB 的方式可以使用 !process 命令或者 !peb 命令查看。首先使用 !process 命令查看进程对象及相关结构中所含信息的子集。对于每个进程,该命令的输出结果都分为两部分。当不指定进程地址或者 ID 时,执行 !process 会列出当前在 CPU0 上运行的线程所属的进程信息。
CSR_PROCESS
CSR_PROCESS 结构包含了专用于 Windows 子系统(Csrss)进程信息,因此仅 Windows 应用程序才有相关联的 CSR_PROCESS 结构(Smss 就没有)。此外,因为每个会话都有自己的 Windows 子系统实例,所以 CSR_PROCESS 结构是由每个会话的 Csrss 进程维护的。CSR_PROCESS 的基本结构如下:
在 windbg 中使用 !process 0 0 csrss.exe 查看:
W32PROCESS
W32PROCESS 结构其中包含了内核(Win32K)中 Windows 图形和窗口管理代码维护 GUI 进程状态信息(这些信息是在进程进行过至少一次 USER/GDI 系统调用时定义好的)所需的全部信息。
W32PROCESS 的基本结构如下(由于 Win32k 结构的类型符号没有公开提供,所以无法通过 windbg 进行展示)
受保护进程
简单的说。就是为了使得在 Windows 系统下播放和使用的媒体文件能够保持其版权收到可靠的保护(数字版权,digital rights management,DRM),从而专门设置了这一进程——受保护进程。
受保护进程能够与普通进程共存,但是会对系统中其他进程对此类进程请求访问权限的过程添加很多限制。
可以通过 process explorer 查看受保护的进程。
最小进程和 Pico 进程
最小进程
Windows 10 最少具备两个最小进程:
- system 进程
- memory compression 进程
此外,还可能会有 secure system 进程。
在 Windows 10 中还可以通过其他方式运行最小进程:启用适用于 Linux 的 Windows 子系统(WSL)这一可选功能,借此安装由 Lxss.sys 和 LxCore.sys 驱动程序组成且系统自带的 Pico 提供程序。
Pico进程
Pico进程是在微内核操作系统L4中实现的一个用户空间程序,用于管理L4内核中的进程。Pico进程是L4中的一个轻量级进程,其主要任务是管理其他进程的创建、销毁、调度和内存管理等操作。Pico进程通常运行在用户空间,并通过一个系统调用接口与内核进行交互,因此具有较高的安全性和可靠性。
Pico进程可以看作是L4中的一个特殊进程,用于为其他进程提供基本的进程管理服务,例如创建、销毁和管理进程的运行状态。通过Pico进程,用户可以轻松地实现进程的调度和内存管理,从而构建一个优秀的操作系统。
Trustlet 安全进程
Trustlet 安全进程是一种安全技术,它是一个轻量级的安全环境,运行在智能手机或智能手表等设备上,可以保护设备的安全和隐私。它采用了硬件安全的方法,使用特殊的处理器和存储器来保护设备和数据。
Trustlet 安全进程通过一个安全接口与操作系统通信,可以访问设备的安全存储区域和加密模块,执行安全任务,比如存储用户的加密密码、处理银行交易等。它可以与普通应用程序进行隔离,即使普通应用程序被攻击或感染了恶意软件,也不会影响Trustlet安全进程中的数据和功能。
Trustlet 安全进程是一种可信的安全技术,广泛应用于智能手机、智能手表、智能家居等物联网设备中。它可以保护用户的隐私和安全,避免信息泄露和金融损失。
进程的终止
Windows 进程可以调用 ExitProcess 函数进行退出。
ExitProcess是Windows API中的一个函数,用于终止当前进程。它位于kernel32.dll库中,并且只能被用于在Windows下运行的进程中。ExitProcess函数接受一个整数参数,通常用于表示进程的退出代码。这个代码会被传递给操作系统,使其能够了解进程是如何退出的。
ExitProcess函数是Windows API中系统调用的一部分,可以调用它来结束当前进程的运行。当调用ExitProcess函数时,它会立即终止进程,并且不会返回到调用程序。由于ExitProcess函数终止了进程,因此在调用函数之后,任何进程资源都将被释放,并且在退出时会发送各种通知。
ExitProcess函数的原型如下:
void ExitProcess(UINT uExitCode);
其中,uExitCode参数为进程退出代码,通常用整数表示。如果退出代码为0,则表示进程正常终止。而如果退出代码不为0,则表示进程退出时出现了错误。
作业
Windows 作业是指在 Windows 操作系统上执行的一系列任务或程序,其目的是为了实现某种特定的功能或目标。
Windows 作业的详细描述需要考虑以下方面:
-
作业的类型:Windows 作业可以有很多不同的类型,例如批处理作业、计划任务、后台任务等。因此,在描述一个 Windows 作业时,首先需要明确它的类型。
-
作业的目的:描述一个 Windows 作业时还应该明确它的目的,即这个作业是为了实现何种特定的功能或目标。比如,一个自动备份数据的作业的目的就是为了保护数据安全。
-
作业的执行方式:Windows 作业的执行方式也有多种,可能是由操作系统自动触发的,也可能是由用户手动触发的。因此,在描述一个 Windows 作业时,需要明确它的执行方式。
-
作业的配置:Windows 作业的配置包括各种参数,例如作业的执行时间、执行频率、执行条件、执行命令、执行日志等等。在描述一个 Windows 作业时,需要详细描述它的配置参数。
-
作业的管理:Windows 作业的管理包括监控、调度、修改、删除等操作。在描述一个 Windows 作业时,也需要说明如何进行相关的管理操作。
综上所述,Windows 作业的详细描述应该包括作业的类型、目的、执行方式、配置参数和管理操作等方面。这样可以帮助用户更好地了解和使用 Windows 作业功能。
Windows 作业(Job)的作用是将一组相关的进程组织在一起,共同接受同一组策略的限制。通过使用作业,可以在多个进程之间共享一些系统资源,例如共享内存、同步对象等。Windows 作业还可以被用于管理和限制进程的资源使用,例如内存、CPU 和网络带宽等,从而提高系统资源的利用率和稳定性。
除了资源管理之外,Windows 作业还可以被用于进程的控制和监控。例如,可以使用作业来强制停止一组相关的进程,或者监控它们的状态和性能等。这对于需要对一组进程进行协调管理的应用场景非常有用,例如批处理作业、服务管理器等。
作业的限制
Windows 作业的限制包括:
-
作业中的进程必须是同一用户创建的。
-
作业中的进程必须在同一台计算机上运行。
-
作业中的进程可以使用不同的安全级别,但不能低于其所属作业的安全级别。
-
作业中的进程无法与作业之外的进程通信,除非它们使用共享内存、命名管道或套接字等通信方式。
-
作业中的进程无法访问作业之外的资源,例如打印机、文件共享等。
-
作业中的进程无法以交互方式运行,也无法在用户桌面上显示窗口或对话框。
-
作业中的进程无法使用交互式服务(如图形界面、声音、USB设备等)。
-
作业中的进程无法以系统帐户身份运行,例如 LocalSystem 或 NetworkService 等。
-
作业中的进程无法启动其他作业或进程。
-
作业中的进程无法绕过 Windows 安全机制,例如使用管理员权限或绕过 UAC(用户账户控制)等。
使用作业
CreateJobObject 是Windows操作系统中的一个API函数,它可以创建一个作业对象。作业对象是一种进程容器,用于管理和限制一组相关的进程。
此函数的语法如下:
HANDLE CreateJobObject(
LPSECURITY_ATTRIBUTES lpJobAttributes, // 指向SECURITY_ATTRIBUTES结构的指针,用于定义作业对象的安全特性
LPCTSTR lpName // 指向一个以NULL结尾的字符串,用于指定作业对象的名称
);
其中,lpJobAttributes参数用于指定安全特性,如果将该参数设置为NULL,则使用默认安全设置。lpName参数为可选参数,用于指定作业对象的名称。
CreateJobObject函数创建成功将返回一个句柄值,该句柄用于标识作业对象。创建的作业对象可以用于限制进程的CPU时间、工作集大小、I/O操作等资源使用。此外,作业对象还可以用于监控和终止进程。
SetInformationJobObject API是Windows操作系统提供的一种API函数,该函数可以用于操作作业对象的信息,包括限制作业中处理器时间、内存使用、作业和进程优先级以及作业保护限制等。
使用该API函数可以设置作业对象的限制条件,当作业中的进程超出设置的限制时,系统会终止该进程或作业。
SetInformationJobObject API通常与CreateJobObject API一起使用,CreateJobObject API用于创建作业对象,而SetInformationJobObject API用于对作业对象进行限制。
该API函数的语法如下:
BOOL SetInformationJobObject(
HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
LPVOID lpJobObjectInformation,
DWORD cbJobObjectInformationLength
);
参数说明:
- hJob:作业对象的句柄。
- JobObjectInformationClass:作业对象信息的类别,如JobObjectExtendedLimitInformation、JobObjectBasicUIRestrictions等。
- lpJobObjectInformation:一个指向作业对象信息结构体的指针。
- cbJobObjectInformationLength:作业对象信息结构体的大小。
操作作业
-
首先,用户需要打开任务管理器。可以通过快捷键Ctrl+Shift+Esc或者右键点击任务栏上的空白部分并选择“任务管理器”来打开它。
-
在任务管理器中,用户可以查看当前正在运行的所有进程和应用程序,以及它们占用的资源量,如CPU、内存和磁盘。
-
用户可以选择结束进程或应用程序,以释放资源或解决问题。
-
如果要创建新的作业或计划任务,可以点击“创建任务”或“创建基本任务”,根据提示步骤进行设置。
-
在设置新的作业时,用户需要指定作业的名称、描述、触发器、操作、条件和设置选项等。
-
触发器可以指定一个或多个条件,根据时间、事件或计算机状态来触发作业。
-
操作可以是运行脚本、运行程序、发送电子邮件等。
-
条件可以是指定用户登录或注销时触发作业,或者指定计算机空闲时运行作业。
-
在设置完成后,用户可以保存新作业并查看、编辑或删除现有作业。
-
在Windows系统中,还可以使用命令行工具如schtasks.exe来创建、修改或删除作业。
Windows 查看作业对象
作业对象在 Windows 中可以使用任务管理器来查看。步骤如下:
-
打开任务管理器:在任务栏上右键单击,选择“任务管理器”,或者使用快捷键“Ctrl+Shift+Esc”。
-
切换到“详细信息”选项卡:在任务管理器中,切换到“详细信息”选项卡。
-
查找作业对象:在“详细信息”选项卡中,查找以“svchost.exe”开头的进程,这些进程是作业对象的宿主进程。双击该进程,进入“属性”的界面。
-
查看作业对象:在“属性”界面中,选择“服务”选项卡,可以看到该进程所托管的作业对象和相应的服务名称。
Windows容器
Windows容器是一种轻量级的虚拟化技术,允许多个应用程序在同一台主机上运行,同时保持彼此隔离。Windows容器可以运行在Windows操作系统上,包括Windows Server和Windows 10。它们提供了一种快速、可靠、安全的软件开发和交付方式,可以大幅减少开发、测试和部署应用程序所需的时间和资源。Windows容器分为两种类型:基于进程的容器和基于Hyper-V的容器。基于进程的容器是轻量级的虚拟化,它们与宿主机共享同一套操作系统内核和系统资源;而基于Hyper-V的容器则是更为重量级的虚拟化,每个容器都拥有自己的操作系统内核和系统资源。