文章目录
- 前言
- 1.1 Windows操作系统的版本
- 1.2 基础概念和术语
- Windows API
- 关于 .Net
- Win32 API 历史
- 服务、函数、例程
- 进程、线程和作业
- 进程
- tlist /t 查看进程树
- 任务管理查看进程
- Process Explorer查看进程的细节
- 线程
- 纤程与用户模式调度器线程
- 虚拟内存
- 内核模式和用户模式
- 终端服务及多个会话
- 概念
- 远程桌面连接和快速用户切换
- 内核对象及句柄
- 安全性
- 注册表
- Unicode
- 1.3 挖掘Windows内部机理
- 性能监视器
- 内核调试
- windows调试工具
- liveKd工具
- Windows软件开发工具(Windows SDK)
- Windows驱动程序开发工具(Windows Driver Kit)
- Sysinternals工具
- 总结
前言
本章将介绍Microsoft Windows操作系统的关键概念和术语,比如:
- Windows API、
- 进程、
- 线程、
- 虚拟内存、
- 内核模式和用户模式、
- 对象、
- 句柄、
- 安全性
- 注册表等。
这些概念和术语将贯穿全书。
同时也会介绍一些可用来探查Windows内部的工具,比如:
- 内核调试器
- 性能监视器,
- 以及来自Windows Sysinternals 的一些关键工具。
此外,还将说明如何以WDK (Windows Driver Kit)
和SDK (Platform Software Development Kit)
作为资源,来找到关于Windows内部机理的进一步信息。
请一定要理解本章中讲述的所有内容,本书其余章节将以此为基础。
1.1 Windows操作系统的版本
产品名称 | 内部版本号 | 发布日期 |
Windows NT 3.1 | 3.1 | 1993.7 |
Windows NT 3.5 | 3.5 | 1994.9 |
Windows NT 3.51 | 3.51 | 1995.5 |
Windows NT 4.0 | 4.0 | 1996.7 |
Windows 2000 | 5.0 | 1999.7 |
Windows XP | 5.1 | 2001.12 |
Windows Server 2003 | 5.2 | 2003.3 |
Windows Vista | 6.0 | 2007.1 |
Windows Server 2008 | 6.0 | 2008.3 |
Windows 7 | 6.1 (编译版本7600) | 2009.10 |
Windows Server 2008 R2 | 6.1(编译版本7600) | 2009.10 |
注“Windows 7”这一产品名称中的“7”并非指内部版本号,而是Windows家族的世代编号。实际上,为了使应用兼容性问题尽可能小,Windows 7的版本号其实是6.1,如表1.1所示。这使得那些检查大版本号的应用程序在Windows 7上可以像在Windows Vista上那样继续执行。事实上,Windows 7和Server 2008 R2有同样的版本号和编译版本,因为它们是从同样的Windows代码基编译而来。
1.2 基础概念和术语
Windows API
Windows应用编程接口(API)是针对Windows操作系统家族的用户模式系统编程接口。在64位版本的Windows推广以前,32位版本Windows操作系统的编程接口被称为Win32 API
,以区别于原来的16位版本Windows的编程接口,即16位WindowsAPI。
术语WindowsAPI兼指Windows的32位和64位编程接口。
Windows API 常用的又分为几个大类:
- 基本服务
- 组件服务司
- 用户界面服务
- 图形和多媒体服务
- 消息和协作
- 网络
- Web服务
关于 .Net
Microsoft.NET框架组成:
- 框架类库(FCL,Framework Class Library)的类库
- 提供了托管代码执行环境的公共语言运行库(CLR,Common Language Runtime)
托管代码执行环境包含一些特性:
- 即时编译
- 类型检验
- 垃圾回收 GCC
- 代码访问安全性等。
由于CLR具有这些特性,因此它所提供的开发环境能够提高开发人员的生产效率,减少常见的编程错误。
.NET框架的组件之间的关系
Win32 API 历史
第一次使用:microsoft Windows 3.0
起因:成为Windows NT启动之初,替代32位 OS/2 Presentation Manager API.
服务、函数、例程
windows 特定的术语的含义:
-
Windows API函数
指Windows API中已被文档化的、可被调用的子例程。
例如CreateProcess、CreateFile和GetMessage。 -
原生的系统服务(或者系统调用)
指操作系统中未文档化的、可在用户模式下调用的底层服务。
例如,NtCreateUserProcess是一个内部系统服务,Windows的CreateProcessi函数调用该服务来创建新的进程。有关系统调用的定义,参见第3章“系统机制”的“系统服务分发”一节。 -
内核支持函数(或例程)
指位于Windows:操作系统内部且只能在内核模式下调用的子例程(关于内核模式,本章后文将给出定义)。
例如,ExAllocatePoolWith Tag就是个这样的例程,设备驱动程序调用该例程可以向Windows系统堆(称为内存池)申请内存。 -
Windows服务
指由Windows服务控制管理器启动的进程。
例如,Task Scheduler服务运行在用户模式进程中,它支持at命令(类似于UNIX命令at或cron)。(注意,虽然注册表将Windows设备驱动程序定义为“服务”,但是,在本书中不这样使用。) -
DLL(动态链接库)
指一组可调用的子例程,合起来被链接成一个二进制文件,使用这些子例程的应用程序可以动态地加载此二进制文件。
例如Msvcrt.dll(C运行库)和Kernel32.dl(一个Windows API子系统库)。Windowsl的用户模式组件和应用程序大量使用了DLL.
DLL比静态库的优势在于,应用程序可以共享DLL,Windows保证在内存中只有一份DLL代码,供所有引用该DLL的应用程序共享。注意,非可执行的NET程序集也被编译成DLL,但是,它们没有导出任何子例程,而是由CLR解析出编译的元数据,以便访问对应的数据类型和成员。
进程、线程和作业
进程
程序是指一个静态的指令序列,
进程是一个容器,其中包含了执行程序的特定实例时所用到的各种资源。
Windows进程是由以下元素构成的:
-
私有的虚拟地址空间
,这是指该进程可以使用的一组虚拟内存地址。 -
可执行的程序
,它定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中已打开句柄的列表,这些句柄指向各种系统资源,比如信号量、通信端口和文件,该进程内所有的线程都可以访问这些系统资源。 -
被称为访问令牌的安全环境
,它标识了与该进程关联的用户、安全组、特权、UAC
(User Account Control,用户账户控制)虚拟化状态、会话,以及有限的用户账户状态。 -
被称为进程ID的唯一标识符
(在内部,进程ID还是标识符客户ID的一部分)。 -
至少一个执行线程
(尽管“空”进程也是有可能的,但没有用处)。
tlist /t 查看进程树
tlisk.exe 位于 C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\tlisk.exe
任务管理查看进程
Process Explorer查看进程的细节
Process Expore 下载地址
线程
线程是一个进程内部的实体,也是Windows执行此进程时的调度实体。
如果没有线程,进程的程序将不可能运行。
线程包括以下一些最基本的部件:
- 一组代表
处理器状态
的CPU寄存器中的内容。 - 两个栈一一一个用于线程在内核模式下执行时,另一个用于线程在用户模式下执行时。
- 一个被称为
线程局部存储
(TLS,thread-local storage)的私有存储区域,各个子系统、运行库和DLL都会用到该存储区域。 - 一个被称为
线程ID
的唯一标识符(它也是内部结构客户ID〔client ID)的一部分进程D和线程D是从同一个名字空间中产生的,所以它们永远不会重叠)。 - 有时候线程也有它们自己的
安全环境
,或者令牌,多线程服务器应用程序要模仿其客户的安全环境时,常常会使用线程自己的安全环境。
易失的寄存器
、栈
和私有存储区域
合起来被称为线程的环境(context)
。因为这些信息随着Windows所在机器架构的不同而有所不同,所以,此结构必须是与底层架构相关的。
Windows的GetThreadContexti函数
允许程序访问这一与架构相关的信息(称为CONTEXT块)。
纤程与用户模式调度器线程
出现的原因
:因为将CPU的执行从一个线程切换到另一个线程,将不可避免地涉及内核调度器,所以,这可能是一个开销昂贵的操作,如果两个线程经常频繁地来回切换则尤其如此。
Windows实现了两种机制来降低这一开销:
- 纤程(fiber)
- 用户模式调度(UMS,user-mode scheduling)。
虚拟内存
内核模式和用户模式
终端服务及多个会话
终端服务
:指的是在单个系统中,Windows对于多个可交互用户会话的支持。利用Windows的终端服务,一个远程用户可以在另一台机器上建立一个会话,并且登录进去,在该服务器上运行应用程序。
服务器把图形用户界面(以及其他可配置的资源,比如音频和剪贴板)传送到客户机,客户机把用户的输入传回服务器。
(与X窗口系统类似,Windows允许在一个服务器系统上运行单独的应用程序,其显示部分远程传送到客户机,而非将整个桌面远程到客户机)。
概念
Session0
:第一个会话被认为是服务会话,或者Session0,它包含了宿纳系统的服务的进程。
Session1
: 在机器的物理控制台上的第一个登录会话为一号会话,而其他的会话可以通过远程桌面连接程序(Mstsc…exe)来建立,或者通过使用快速用户切换(后文会介绍)来建立。
远程桌面连接和快速用户切换
Windows的客户机版本允许单个远程用户连接到机器上,但如果有人已经在控制台上登录了,则工作站会被锁住(也就是说,一个人可以用本地方式或远程方式使用Windows?客户机系统,但不能同时以这两种方式来使用该系统)。包括Windows Media Center在内的Windows版本允许一个交互会话和多达四个Windows Media Center Extender会话。
Windows服务器系统支持两个并发的远程连接(这是为了方便远程管理,例如,有些管理工具要求登录到被管理的机器中才可以使用),以及两个以上的远程会话(只需经过适当的授权许可,并且系统被配置为终端服务器)。
所有的Windows客户机版本都支持通过一种被称为快速用户切换(fast user switching)
的特性,在本地创建多个会话。当用户选择断开其会话,而不是注销其登录时(例如,单击“开始”菜单,从“关机”子菜单中选择“切换用户”,或者在按住Windowst键的同时按下L键,然后单击“切换用户”按钮),当前会话(即在该会话中运行的进程,以及描述该会话的所有会话范围的数据结构)仍然保留在系统中,而系统返回到主登录屏幕。如果一个新的用户登录进来,则新建一个会话。
内核对象及句柄
安全性
注册表
Unicode
如果使用了Unicode编码 还会乱码 其实多半因为系统缺少对应语言包导致的。
1.3 挖掘Windows内部机理
主要使用的工具:
工具 | 映像名 | 来源 |
Startup Programs Viewer | AUTORUNS | Sysinternals |
Access Check | ACCESSCHK | Sysinternals |
Dependency Walker | DEPENDS | www.dependencywalker.com |
Global Flags | GFLAGS Windows | 调试工具 |
Handle Viewer | HANDLE | Sysinternals |
Kernel debuggers | WINDBG,KD | Windows调试工具,Windows SDK |
Object Viewer | WINOBJ | Sysinternals |
性能监视器(Performance Monitor) | PERFMON.MSC | Windows内置工具 |
Pool Monitor | POOLMON | Windows Driver Kit |
Process Explorer 下载地址 | PROCEXP | Sysinternals |
Process Monitor | PROCMON | Sysinternals |
Task(Process)List | TLIST | Windows调试工具 |
任务管理器(Task Manager) | TASKMGR | Windows内置工具 |
DebugView 下载地址 | Sysinternals |