Windows下常见概念

0x1 SDK和DDK

SDK(Platform Software Development Kit)汉语直译就是平台软件开发工具包,里面包含了对应的操作系统平台开发所用的API文档(应用程序接口)。
DDK(Device Driver Kit)驱动开发工具包,顾名思义这个工具包包含了对应操作系统下的驱动开发的一系列开发工具。
当我们开始对一个操作系统进行程序开发时,首先要清楚开发的是什么类型的程序。是服务用户的程序还是与设备挂钩的驱动程序而选择不同的开发工具包。

0x2 服务、函数和例程

Windows API函数 就是已经被公开文档化的调用子例程(函数),如CreateProcess()、CreateFile()等
原生的系统服务(或者执行体系统服务) 指操作系统未公开文档化的、可在用户模式下调用的底层服务。例如,NtCreateProcess是一个内部系统服务,Windows的CreateProcess函数调用该服务来创建一个新的进程。(我们都知道Windows是闭源的商业软件,其中很多内部的函数调用关系都未公开,所以我们想要了解这些原生的服务需要自己通过调试器调试或者逆向)
内核支持函数 指那些只能在内核模式下(Ring0权限级)下调用的子例程。例如ExAllocatePool是一个内核例程(函数),设备驱动调用该例程可以向Windows系统申请内存。
Windows服务 是指由Windows服务控制管理器启动的进程(我的上篇文章服务调试就是关于对于这种进程的调试解决方案)
DLL(动态链接库) 就是符合Windows平台下可执行文件格式(Windows PE结构)的一个可调用例程(函数)的集合。它不能单独运行在Windows下,但是可以通过EXE程序加载到对应的程序进程内存中进行调用,我们可以简单理解为,为应用程序提供现成函数的二进制文件(当然它符合PE结构,也是“可执行文件”)

0x3 进程、线程和作业

进程 说白了就是为可执行程序提供数据的一块数据结构(需要从符合可执行文件格式的文件中先读取出来到内存,然后再在内存中解析成进程),里面记录了程序运行的所有必须的信息,例如代码指令和数据。它相当于容器,光有容器是不能运行的,所以它还需要专门的函数来使用这块数据结构,这个函数就是所谓的线程。每个进程必须要有一个线程,这是操作系统的规定,不然内存申请出来不用就浪费了。
线程 是一个进程内部实体,也是Windows执行此进程时的调度实体。如果没有线程,则进程的程序不可能运行。
线程包括以下基本部件:
1)一组代表处理器状态的CPU寄存器中的内容
2)两个栈,一个用于当前线程内核模式下执行使用,另一个用现成用户模式下使用
3)线程局部存储区(TLS,thread-local storage)的私有存储区域,各个子系统、运行库和DLL都会用到该区域。
4)一个被称为线程ID的唯一标识符
5)有的时候线程也有它们字节的安全环境,如果多线程服务器应用程序要模仿其客户的安全环境,则往往可以利用线程的安全环境。
前面两个我们很清楚的知道就是我们总提的线程环境块记录的内容,用到TSS数据结构记录在TR寄存器里。记录各种寄存器的信息。TSS也是为了线程之间的任务切换使用的,因为我们切换线程任务时候用到的寄存器内容都不同,需要有相应的数据结构记录它。(这里没有特权级切换所以堆栈是不会切换的)
纤程与线程线程使得一个应用程序可以调度他自己的“线程”的执行过程,它不依赖于Windows内置的线程调度,内核不可见,位于Kernel32.dll中。为了使用纤程,首先要使用ConvertThreadToFiber函数。该函数将当前线程转变成一个正在运行的纤程。在转变得到的纤程中,通过CreateFiber函数,它又可以创建新的纤程(每个纤程都可以有他自己的一组纤程)。然而与线程不同的是,纤程不会自动被执行,必须手动调用SwitchToFiber函数选一个纤程,才能使它运行。新的纤程一直运行,直到它退出,或者直到它调用SwitchToFiber,再次选择运行另一个纤程。说白了就是将线程的调度方式变得人为可控顺序的方法,因为如果直接创建线程,使用的是系统内部调度算法,我们程序开发者根本无法控制想让哪个线程优先执行。
线程与进程同一个进程内的所有线程是共享一个进程空间的。然而一个进程中的线程不可能直接访问到另一个进程的空间,除非设置共享内存区第一个进程有权打开第二个进程,从而可以使用注入ReadProcessMemory和WriteProcessMemory等跨进程的内存函数。
每个进程还有一个安全标识和一个已打开句柄的列表,这些句柄指向诸如文件、共享内存区,或者像互斥体、信号量等同步对象。
每个进程都有一个安全环境,被存储在一个称为访问令牌的对象中。访问令牌包含了该进程的安全标识和凭证。在默认情况下,线程没有自己的访问令牌,但是他们也可以包含一个访问令牌。因此单独的线程可以模仿另一个进程的安全环境——包括在远程Windows系统上运行的进程——而不会影响到当前进程中的其他线程。
虚拟地址描述符(VAD,virtual address descriptor)是指一些数据结构,内存管理其利用这些数据结构来记录一个进程所以用的虚拟地址。
Windows在进程模型上做了一个拓展,称为作业(job)。作业对象主要功能是,使得一组进程被当做一个整体来管理和维护。作业对象允许对特定的属性进行控制,也允许对一个进程,或者所有作业相关联的进程进行限制。作业对象也为所有与该作业相关联的进程记录下基本的审计信息,其中包括曾经与该作业关联过但已经终止了的进程信息。
虚拟内存就是通过虚拟地址的高10位当作索引找到页目录表中的目录项(页目录表记录在CR3控制寄存器里),页目项记录着页表的物理地址的相关信息,通过页表物理地址和虚拟地址的中间10位(虚拟地址中间10位做为索引)找到页的页表项的物理地址,页表项记录了对应页的地址信息和属性,再将这物理地址获取出来和虚拟地址的低12位相加就是真正的物理地址。(PS:《操作系统真象还原》第5章有详细的解释,感兴趣的朋友可以去看下。)
内核模式和用户模式
内核模式就是利用计算机提供的特权等级实现的,计算机一共提供0、1、2、3这4个特权级,但是Windows操作系统只用了2个特权级,也就是我们常说的用户态(Ring3)和内核态(Ring0),用户态只能访问Ring3的代码和数据,Ring0可以访问任意代码和数据。用户模式下只有使用“门”的方式(任务切换、调用门、中断门、陷阱门)才能提升自己的特权等级,这种提升只能访问特定的例程(函数),而且不能访问内核数据。但是运行在内核模式下的组键,Windows对它们的读写系统内存并不加以保护,操作系统和驱动程序代码可以随意访问系统内存空间,也可以绕过Windows的安全机制直接访问对象。这就是为什么有的APT恶意程序想尽办法想要入住内核空间的原因。Windows为了防止第三方的驱动程序恶意对内核空间进行破坏引入了驱动签名。
驱动签名 当一个未经授权的(未签名)驱动企图加入系统中时,Windows会警告用户。而且,一种称为驱动程序检验器(Driver Verifier)的机制可以帮助设备驱动的编写者找到程序中的错误(缓冲区溢出或内存泄露)。
用户应用程序在发出一个系统服务调用的时候,就会从用户模式下切换到内核模式下。(肯定用到了“门”的一种,谁让软件依赖硬件实现功能呢)

0x4 相关工具使用

我们还要知道进程和进程之间的关系,每个进程都有属于自己的专属ID。如果一个进程又创建了一个新的进程,那么创建的进程和被创建的进程是父子关系。虽说是父子,但是两个进程毫无关联了,也就是说父进程的“生死”跟子进程无关,即父进程结束子进程也不会关闭。每个子进程还记录了对应的父进程ID,但是这些ID只是启到了记录作用,子进程的父ID允许指向已经销毁的父进程。
如下图用cmd的命令行再创建一个cmd窗口
在这里插入图片描述
用Process Explorer查看父子进程间的关系。
在这里插入图片描述
在第二个cmd中输入mspaint,再打开一个画图进程
在这里插入图片描述
接下来关闭第二个cmd窗口(在窗口cmd输入exit),观察发现子进程并没用关闭
在这里插入图片描述
接下来打开任务管理器,在应用程序视图中找到第一个cmd,右键点击结束进程树
在这里插入图片描述
出现以下警告,点击yes
在这里插入图片描述
发现第一个cmd窗口关闭,但是mspaint仍然运行。因为mspaint是孙子进程,而且中间进程已经被中止了,所以父进程和孙子进程之间已经没有链接了。
在这里插入图片描述
用任务管理器来查看进程信息
任务管理器提供了一个快速进程列表,可以显示出当前系统中运行的进程。每个进程都是由它的映像文件的名称命名的。与Windows其他对象不同,进程不可以赋予全局名称。我们点击查看中的选择列选项。
在这里插入图片描述
选择想要显示的信息
在这里插入图片描述
选择进程选项后我们可以看到所有进程的详细信息
在这里插入图片描述
在应用程序选项卡的显示窗口只能显示当前交互的窗口站中所有桌面上的顶级可见窗口(默认情况下有两个桌面对象——可以用CreateDesktop函数创建更多桌面对象)。状态栏显示窗口所属线程是否处于Windows消息等待状态。
在这里插入图片描述
利用进程管理器查看进程的细节
Windows官方提供的进程查看工具最详细的进程相关的工具就是Process Exploer,我们可以去微软官方下载它。
在这里插入图片描述
下载好就可以双击运行了,可以点击View视图设置显示内容
在这里插入图片描述
我设置的是上半部分显示进程列表,下半部分显示选中的进程内已打开的句柄。当鼠标移动到进程名称上时还会显示出映像文件的描述信息、公司名称和完整路径。在这个工具下粉色表示包含服务进程,自己的进程显示成蓝色。
内核模式和用户模式
打开控制面板,点击管理工具一项。
在这里插入图片描述
选择性能
在这里插入图片描述
点击添加按钮
在这里插入图片描述
选择性能对象为“Processor”后,点击“%Privileged Time”计数器
在这里插入图片描述
然后按住Ctrl键同时选中“%User Time”计数器,点击添加按钮
在这里插入图片描述
回到界面快速移动鼠标,看到了“%Privileged Time”计数器性能线开始有上升,表明鼠标中断和窗口系统的图形部分花了不少时间(这两部分在内和中比用户态更花时间,图形设备也是驱动程序运行在内核模式下)
在这里插入图片描述

发布了30 篇原创文章 · 获赞 5 · 访问量 1921

猜你喜欢

转载自blog.csdn.net/AlexSmoker/article/details/104282170