【免杀前置课——Windows编程】九、进程线程(windows 系统概述、Windows对象分类、内核对象的创建方式、内核对象特性、内核对象的跨进程访问、进程是什么、进程和线程的区别、什么是模块)

  • Post author:
  • Post category:其他

进程线程

windows 系统:

虽然windows系统是C语言编写的,但是它是一个面向对象的操作系统。
Windows一个个的对象,本质上都是*结构体变量*windows 系统不希望程序员能够直接访问这些结构体变量,所以使用上都有一个特点,都需要先得到他们的句柄(句柄不等于指针)然后再调用相应的API去操作这些对象

Windows对象分类:

windows对象大致分为三大类:
USER对象:窗口、控件、图标、菜单、光标。user32.dll
GDI 对象:画刷、字体、画笔。GDI32.dll
内核对象:文件、进程、线程。Kernel32.dll。l

内核对象的创建方式:

1、创建对象CreateXXX.
CreateProcess创建进程。CreateThread,创建线程。CreateFile创建文件CreateSemaphore.创建信号量等。
2、打开对象获取句柄:OpenXXX3、通过API操作对象
4、关闭句柄CloseHandle.。

内核对象特性:

所有的内核对象都属于操作系统内核,可以再不同的进程间访问到,俗称:内核对象是跨进程的。很多时候,我们呢都需要在不同的进程中访问同一个内核对象,比如进程间的同步,进程间共享数据等等。
通常,我们使用命名的方式在不同进程间使用内核对象

  • 每一个内核对象都有一个引用计数,也可以说每一个内核对象结构体都有一个字段叫引用计数,当有一个进程创建或者打开了此内核对象,那么内核对象的引用计数就会加1,进程终止,或者关闭,引用计数减一,当引用计数为0,则对象销毁。
  • 内核对象都有一个安全描述符,这个描述符说明了谁拥有此对象,哪些用户和组被允许访问或使用此对象,以及哪些用户和组被拒绝访问或使用此对象。在创建一个内核对象的时候,需要我们传递一个安全描述符.

一般情况下,在创建进内核对象的时候这个安全描述符可以给一个null这意味着此内核对象将使用与当前令牌相关的默认安全属性。
在windows操作系统中,使用对象就要使用句柄,对于内核对象来说,也是这样。内核对象的句柄是和进程相关的同一个对象在不同进程中,其句柄值是不同的。这点和GDI对象不同,GDI对象的句柄值,全局有效。由此可见,不同的类型的对象,其管理方式也不同。

  • 句柄表:在每一个进程对象中,都有一个句柄表,用于记录本进程所打开的所有内核对象可以简单的将句柄表理解为一个一维数组,句柄值可以理解为数组索引。
  • 句柄表中的每一项,描述了使用此句柄访问对象的权限,以及此句柄是否可以被子进程继承

内核对象的跨进程访问

由于内核对象是操作系统全局的,因此我们可以再多个程序中访问同一个内核对象。
通常有3种方式实现跨进程访问内核对象:

  • 1、由父进程继承给子进程
  • 2、使用名称或者ID作为标识,打开一个内核对象。
  • 3、使用 DuplicateHandle.函数,将一个句柄从一个进程传递给另一个进程。

什么是进程

进程是windows操作系统中的一个重要概念,简单来说运行一个程序就会产生一个进程,进程是操作系统用来分配资源的单位,
其中至少包含了
一个虚拟的地址空间、
地址空间中有加载的exe,同时还有程序运行所有需加载的dll。
进程内核对象、
一个运行着的线程

进程和线程的区别

运行一个程序就会产生一个进程
进程是操作系统用来分配资源的单位。
线程是执行任务的基本单位。
一个进程中至少包含着一个运行着的线程。可以把进程理解为一个工厂线程理解为工人,进程中包含着线程,进程不进行实际操作负责提供空间,线程进行实际的操作。
32位进程分2G给用户空间,还有2G的内核空间。
在这里插入图片描述

什么是模块:

包含着代码和数据的可以运行的文件我们称之为可执行文件。
在windows平台常见的可执行文件:exe、dll。
一个运行中的进程通常都需要将好几个可执行文件加载到他的虚拟内存空间,那么每个在此进程中被加载的可执行文件都称之为模块。
在这里插入图片描述
同一内核对象在不同进程中的句柄值未必相同。
在这里插入图片描述

#include<Windows.h>



int main() 
{
	STARTUPINFOW sw{0};
	PROCESS_INFORMATION pinfo{ 0 };
	CreateProcessW(
		L"d:\\1.exe",//程序路径
		NULL,//命令行
		NULL,//进程标识符
		NULL,//线程标识符
		FALSE,//是否可被继承
		0,//创建标识
		NULL,
		NULL,//当前目录
		&sw,//进程启动信息
		&pinfo//进程信息
	);
	//pinfo.hProcess 进程句柄
	CloseHandle(pinfo.hThread);//关闭线程
	CloseHandle(pinfo.hProcess);//关闭进程
	return 0;
}

版权声明:本文为m0_62783065原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。