1、服务:指操作系统中可以被调用的例程(即函数,等价于系统调用?)、设备驱动程序或者服务器进程。一些特定术语如下:
1)Windows API函数:指Windows API中已经被文档化、可被调用的子例程(函数),如CreateProcess、CreateFile和CreateMessage等。
2)原生的系统调服务:即系统调用,指操作系统中未文档化、可在用户模式下调用的底层服务。如NtCreateProcess是一个内部系统服务,Windows中的CreateProcess函数就是调用NtCreateProcess函数来创建新的进程。
3)内核支持函数(或者例程):指位于Windows操作系统内部且只能在内核模式下调用的子例程。
4)Windows服务:指由Windows服务控制管理器启动的进程。
5)动态链接库DLL:指一组可调用的子例程,合起来被链接成一个二进制文件,使用这些子例程的应用程序可以动态地加载此二进制文件。应用程序可以共享DLL,Windows保证在内存中只有一份DLL代码,供所有引用该DLL的应用程序共享。
2、进程:程序是一个静态的指令序列,而进程是一个容器,二者有着本质上的区别。进程中包含了执行程序的特定实例时所用到的各种资源。从最高层次的抽象来看,windows进程的构成元素如下:
1)私有的虚拟地址空间;
2)可执行的程序:定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中;
3)已打开句柄的列表:这些句柄执行各种系统资源,如信号量、通信端口和文件。该进程内所有的线程都可以访问这些系统资源;
4)被称为访问令牌的安全环境:它标识了该进程关联的用户、安全组、特权、UAC(用户账户控制)虚拟化、会话、以及有限的用户状态;
5)进程ID:唯一标识符(在内部,进程ID还是客户ID的一部分);
6)至少一个执行线程;
3、线程:是一个进程内的实体,也是windows执行此进程时的调度实体。线程包括以下一些基本的部件:
1)一组代表处理器状态的CPU寄存器中的内容;
2)两个栈:内核栈和用户栈,分别用于线程在内核模式下执行使用和用户模式下执行使用;
3)线程局部存储区域TLS:各个子系统、运行库和DLL都会使用到这个存储区域;
4)线程ID:线程的唯一标识符,是内部结构客户ID的一部分,进程ID和线程ID是从同一个名字空间中产生的,所以它们永远不会重叠;
5)有时候线程也会有它们自身的安全环境或者令牌:多线程服务器应用程序要模仿其客户的安全环境时,通常会使用线程自己的安全环境;
4、纤程(Fiber):纤程可以使得一个应用程序可以调度它自己的“线程”的执行过程,而不用依赖于Windows内置的基于优先级的调度机制(将CPU的执行从一个线程切换到另一个线程,将不可避免的涉及到内核调度器,这可能是一个开销昂贵的操作,尤其是两个线程经常频繁来回的切换)。因此纤程也被称之为“轻量级”线程或者用户态线程,从调度的角度来看,纤程间的切换对于内核是不可见的,因为它们是在用户模式下的Kernel32.dll中实现的。在其他高级语言(如golang)中,纤程又被称为协程。
6、虽然线程有自己的执行环境,但是同一个进程内的所有线程共享该进程的虚拟地址空间(以及属于该进程的其他资源)。这意味一个进程内的线程可以完全地读或者写该进程的虚拟地址空间。然而在特殊情况下,一个进程中的线程可能会引用另一个进程的地址空间,这种情况主要有两种:
1)第二个进程将自己的一部分私有地址空间变成共享内存区(在Windows API中称为文件映射对象);
2)第一个进程有权限打开第二个进程,从而可以使用诸如ReadProcessMemory和WriteProcessMemory等跨进程的内存函数;
7、除了私有地址空间和一个或多个线程外,每个进程还有一个安全环境和一个已打开句柄的列表,这些句柄执行诸如文件、共享内存区、互斥体、事件或者信号量等某个同步对象等等,如下图所示.
8、虚拟地址描述符VAD:指一些数据结构,内存管理器利用这些数据结构来记录进程正在使用的虚拟地址(类似于页表和页目录表?)。
9、作业:Windows在进程模型的基础上提供了一个扩展,称为作业。作业对象的主要功能是,使一组进程被当做一个整体i来管理和维护,通过作业对象,可以对特定的属性进行控制,也可以对一个进程或者所有与作业相关的进程进行限制。作业对象弥补了Windows平台上缺乏结构化的进程树的不足,且功能远比Unix风格的进程树强大。
10、虚拟内存:Windows实现了一个基于平面(线性)地址空间的虚拟内存系统,使每个进程独立拥有一个很大的私有地址空间。虚拟内存提供了一个内存逻辑视图,它可能并不对应于内存的物理布局。在程序运行的时候,内存管理器借助于硬件的支持,将虚拟地址转译或者映射成真正存放数据的物理地址。操作系统通过控制这一保护和映射机制,可以确保一个进程不会闯入另一个进程中,也不会改写操作系统的数据。
11、在Windows中,虚拟地址空间被划分成两部分,低半部分(0x0~0x7FFFFFFF)分配给进程,作为它们独有的私有存储空间(用户进程空间),而高半部分(0x80000000~0xFFFFFFFF)则用作操作系统的内存(内核空间)。低半部分的地址空间的映射关系会发生变化,以便总是反映出当前正则执行的进程的虚拟地址空间,而高半部分的地址空间的映射关系总是由操作系统的的虚拟内存使用。
12、内核模式和用户模式:为了避免用户应用程序修改或者访问关键的操作系统数据,Windows使用了两种处理器访问模式:用户模式和内核模式。用户程序运行在用户模式下,操作系统的代码运行在内核模式下。内核模式下,处理器允许访问所有的系统的系统内存和所有的CPU指令。通过让操作系统拥有比应用程序更高的特权级,处理器为操作系统提供了一层必要的保护,确保行为不正常的应用程序不会破坏系统整体的稳定性。
13、虽然每个Windows进程都有自己私有的内存空间,但是内核模式的操作系统和设备驱动程序代码共享同一个和虚拟地址空间(高半部分的内核空间),也即所有应用程序共享同一个内核空间。虚拟内存中的每一个页面都被标记了处理器必须在什么访问模式下才可以读或者写该页面。系统空间(即内核空间)中的页面只有在内核模式下才可以访问,而用户地址空间中的所有页面都可以在用户模式下访问。只读页面(比如那些包含静态数据的页面)在任何模式下都是不可写的。在一些支持不可执行内存吧保护的处理器上,Windows将包含的数据页面标记为不可执行,从而防止数据区域被无意或者恶意地当做代码执行。
13、内核对象:在Windows系统中,内核对象是指某个静态定义的对象类型的单个运行实例。对象类型由系统定义的数据类型、在该数据类型的实力上进行操作的一组函数,以及一组对象属性构成。对象属性是对象中的数据域,每个对象属性定义了对象的一部分状态。对象方法,即操作对象的手段,通常用于读取或者改变对象的属性。对象和普通数据结构之间最根本的区别是,对象的内部结构是不透明的。使用者必须调用一个对象服务才能获得对象内部的数据或者把数据放到对象内部(感觉像编程中的一条规则:是使用方法访问类型的属性而不是直接访问)。并非Windows系统中的所有数据结构都是对象,只有确实需要被共享。、保护。命名或者让用户模式程序看得到(通过系统服务/系统调用)的数据才被放到对象中。
14、注册表:Windows中的系统数据库,包含了引导和配置系统所必须的信息、全系统范围内控制Windows操作的软件设置、安全数据库以及针对每个用户的配置设置。
15、符号文件:包含了函数和变了的名称以及数据结构的布局和格式,它们是由链接器产生的。
16、用户模式的调试:
16.1侵入式的调试:除非另行指定,否则将调试器附加到一个正在运行的进程上时,将通过Windows函数DebugActiveProcess,在调试器和被调试程序之间建立一个连接。这使得看见恶意检查和改变进程的内存,设置断点,执行其他的调试功能。Windows允许在不杀掉目标进程的情况下停止调试,只要将调试器断开连接即可,不必杀掉进程。
16.2 非侵入式的调试:这种选择方式下,调试器只是简单的利用OpenProcess函数打开被调试的进程,它并不作为一个调试器负载到目标进程上。这使得使用者可以检查和改变目标进程中的内存,但是不能设置断点。(有点像CE工具默认的工作模式)