虚拟内存
内核模式和用户模式
终端服务及多个会话
终端服务
:指的是在单个系统中,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 |
性能监视器
在本书中,我们经常会提到性能监视器,你可以在“开始”菜单的“管理工具”文件夹中找到该工具(也可以通过“控制面板”找到它);特别地,我们将主要关注性能监视器和资源监视器。性能监视器有三项功能:系统监视、查看性能计数器日志,以及设置报警(利用一组数据采集器,这些数据采集器也包含性能计数器日志,以及跟踪数据和配置数据)。为简化起见,我们在提到性能监视器的时候,实际是指该工具内部的系统监视功能。
性能监视器所提供的有关操作系统当前运行状况的信息,比任何其他单个工具所能提供的信息都要多得多。它针对各种各样的对象提供了数百个基本的和扩展的计数器。本书中所讲述的每一个主要话题, 都附有一张相关的Windows性能计数器表格。
性能监视器为每个计数器提供了一份简要描述。想要查看这些描述信息,请在“添加计数器(Add Counters) ”窗口中选择计数器, 然后选中“显示描述(Show Description) ”复选框。
尽管我们在本书中所做的低层系统监视功能都可以通过性能监视器来完成,但是,Windows还包含了一个实用工具――资源监视器(可以通过开始菜单来访问, 或者通过任务管理器的“性能”选项卡访问到) , 它可以显示四种主要的系统资源:CPU、磁盘、网络和内存。
在基本的状态下,关于这些资源所显示的信息与你在任务管理器中看到的相仿。然而,资源监视器还为这些资源提供了更多的显示区域,以扩展到更多的信息。
展开以后,CPU选项卡显示了有关每个进程CPU使用率的信息,如同任务管理器一样。然而,它加入了显示平均CPU使用率的一栏,这可以让你更好地知道哪些进程最为活跃。CPU选项卡还包含了一个单独的关于Windows服务及其关联的CPU使用率和平均CPU使用率的显示区。如同ProcessExplorer一样,选择某个进程(单击其相应的复选框)将显示出该进程所打开的有名称句柄的列表,以及被加载到该进程地址空间中的模块(比如DLL)的列表。“搜索句柄(Search Handles)”框可用来搜索哪些进程已经打开了某个指定名称的资源。
“内存”部分显示了与任务管理器所展示的同样多的信息,但它针对整个系统进行了组织。物理内存条状图将当前的物理内存,按照“为硬件保留的内存”、“正在使用”、“已修改”、“备用”和“可用”进行组织。关于这些术语的确切含义,参见本书下册第10章。
另一方面,“磁盘”部分显示了基于每个文件的I/O信息,这样可以很容易地识别出当前系统中哪些文件被访问最多、被写得最多,或者被读得最多。这些结果可以被进一步按照进程来过滤。
“网络”部分显示了活动的网络连接、哪些进程拥有这些网络连接,以及在这些连接上传输了多少数据。利用这些信息,有可能看到通过其他途径很难检测到的后台网络活动。而且,有关在当前系统中活动的TCP连接的信息也显示出来了,它们按进程组织,诸如远程的和本地的端口与地址、包延迟之类的数据都显示在其中。最后,正在监听的端口也按进程显示出来了,这使得管理员可以看到哪些服务(或应用程序)当前正在指定的端口上等待连接。针对每个端口和进程的协议和防火墙策略也显示在其中。
注意,通过编写程序可以访问所有的Windows性能计数器。第4章“HKEY PERFORMANCE_DATA”一节简要介绍了通过WindowsAPI来获得性能计数器这种做法所涉及的一些组件。
内核调试
内核调试意味着检查内核的内部数据结构,以及/或者跟踪内核中的函数。这是一条很有用的探查Windows内部机理的途径,因为你可以显示那些通过其他任何工具都无法得到的内部系统信息,并且对于内核内部的代码流有一个更加清晰的认识。
在介绍各种调试内核的方法前,我们先来看一组在执行任何内核调试时都需要的文件。
内核调试所需要的符号(PDB)
符号文件包含了函数和变量的名称,以及数据结构的布局和格式。它们是由链接器产生的,在调试会话中被调试器用来引用和显示这些名称。这些名称信息通常并不存储在二进制映像文件中,因为在执行代码的时候并不需要用到它们。这意味着,二进制映像文件更加小巧,也更加快速。然而这也意味着,在调试的时候,你必须确保在一个调试会话中,调试器能够访问到与当前引用的映像文件相关联的符号文件。
要使用任何一个内核调试工具来检查Windows内核的内部数据结构(比如进程列表、线程块、已加载的驱动程序列表、内存使用信息,等等),你必须至少得到了内核映像Ntoskrnl.exe 的正确符号文件(第2章“总体架构”一节介绍了有关这个文件的更多信息)。符号表文件必须与这些符号表所在的映像文件的版本完全匹配。例如,如果你安装了Windows的一个更新内核的服务补丁(Service Pack)或者热补丁(HotFix),那么,你必须获得匹配的、更新过的符号文件。
为Windows的各种版本下载并安装符号是有可能做到的,但是,热补丁的更新符号则并不总是可以获得。要想获得当前调试所需符号的正确版本,最容易的办法是,利用Microsoft的按需符号服务器,只需在调试器中用一种特殊的语法来指定符号路径即可。例如,下面的符号路径将使得调试工具从该Internet符号服务器上加载所需要的符号,并且在本地的C:lsymbols文件夹中维护一份副本:
srvc:\symbolshttp://msdl.microsoft.com/download/symbols
有关如何使用符号服务器的更详细的指令,请参考调试工具帮助文件或者Web页面http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx。
windows调试工具(WinDBG)
Windows调试工具(Debugging Tools for Windows)包含了本书中用于挖掘Windows内部机理的高级调试工具。最新的版本也被包含在Windows软件开发工具(SDK)中,作为其一部分。这些工具既可以用于调试用户模式的进程,也可以调试内核(参见下面的辅助内容)。
注 Windows调试工具的版本更新非常频繁,其发布独立于Windows操作系统的版本,所以请时常检查最新的版本。
用户模式的调试
实验:显示内核数据结构的类型信息
liveKd工具
LiveKd是Sysinternals出品的一个免费工具,可用于使用前面刚刚介绍的标准Microsoft内核调试器来检查正在运行的系统,而无须按调试模式引导系统。当需要在一台并非按调试模式引导的机器上进行内核级故障排除时,这种方法可能会非常有用。有些问题可能难以确定地重现,打开调试选项以后再重新引导机器可能无法让错误重现。
可以像运行WinDbg或者Kd那样运行LiveKd.LiveKd会把指定的所有命令行选项传递给你所选择的调试器。在默认情况下,LiveKd运行命令行内核调试器(Kd).要想让它运行WinDbg,请指定-w开关。要想查看有关LiveKd开关的帮助文件,请指定-?开关。
LiveKd将模拟的崩溃转储文件展示给调试器,所以,在LiveKd中可以执行任何可用于崩溃转储的操作。因为LiveKd依赖于物理内存来支持模拟的崩溃转储,所以内核调试器有可能会运行到这样一种状态:有些数据结构正处于被系统修改的过程中,因而是不一致的。每当调试器被启动起来时,它都会获得当前系统状态的一个全新视图。如果你想要刷新系统快照,可以退出调试器(用g命令),LiveKd将问你是否要再次启动起来。如果调试器进入一个打印
Windows软件开发工具(Windows SDK)
Windows软件开发工具(SDK)可通过MSDN订阅程序获得,也可以从msdn.microsoft.com 免费下载。除调试工具外,它还包含了编译和链接Windows应用程序所必需的文档、C头文件和库文件。(虽然Microsoft Visual C++也附带了这些头文件的一份副本,但是,Windows SDK 中包含的头文件版本总是符合Windows操作系统的最新版本,而VisualC++附带的头文件可能是老的版本,只符合Visual C++刚刚发布时的系统版本)。从考察内部机理的角度来看,Windows SDK中令人感兴趣的项目包括Windows API头文件(\Program Files\Microsoft SDKs\Windowslv7.0A\Include)。其中有些工具的源代码也包含在Windows SDK和MSDN Library的示例代码中。
Windows驱动程序开发工具(Windows Driver Kit)
Windows驱动程序开发工具(WDK,Windows Driver Kit)也可以通过MSDN订阅程序获得。如同Windows SDK一样,它也可以免费下载。Windows驱动程序开发工具的文档包含在MSDN Library中。
虽然WDK针对的是设备驱动程序开发人员,但它也是Windows内部信息的一个丰富来源。
例如,虽然本书下册第8章描述了1/0系统架构、驱动程序模型,以及基本的设备驱动程序数据结构,但是它并没有详细地描述各个内核支持函数。WDK文档包含了所有用于设备驱动程序的Windows内核支持函数和各种机制的详细说明,而且有两种形式:教程和参考资料。
WDK中除了包含文档以外,还包含了相应的头文件(特别是ntddk.h、ntifs.h和wdm.h),这些头文件定义了关键的内部数据结构和常量,以及许多内部系统例程的接口。在用内核调试器来挖掘Windows内部数据结构时,这些文件非常有用,因为尽管本书中给出了这些数据结构的一般性布局形式和内容,但是域(field)一级的详细描述(比如大小和数据类型)并没有给出。然而,在WDK中,许多数据结构(比如对象分发器的头、等待块、事件、突变体(mutant)、信号量,等等)都有完整的描述。
所以,如果你想在阅读本书的基础上,进一步钻研1/O系统和驱动程序模型,可以阅读WDK 的文档(特别是Kernel-Mode Driver Architecture Design Guide和Kernel-Mode Driver Reference)你也可以找到另外两本很有用的参考书: Walter Oney著的Programming the Microsoft Windows Driver Model, 2nd Edition (Microsoft Press, 2002),以及Penny Orwick和Guy Smith 合著的Developing Drivers with the Windows Driver Foundation (Microsoft Press, 2007).
Sysinternals工具
本书中的许多实验用到了一些可从Sysinternals下载的免费软件工具。这些工具中的绝大部分是由本书的作者之一Mark Russinovich编写的。最为流行的工具包括Process Explorer和Process Monitor。请注意,这些工具中有许多要安装和执行内核模式设备驱动程序,因此需要(提升至)管理员权限;若它们运行在标准的(非提升的)用户账户下,则只有很有限的功能和输出。
由于Sysinternals工具的更新很频繁,所以,尽可能确保使用了这些工具的最新版本。若想获得有关工具更新的通知,可以订阅(follow)Sysinternals站点博客(此博客有RSS源)。
关于这些工具的说明、如何使用这些工具,以及使用这些工具来解决问题的实例,请参考Mark Russinovich 和Aaron Margosis 合著的Windows Sysinternals Administrator's Reference (Microsoft Press,2011)。
有关这些工具的问题和讨论,请访问Sysinternals的论坛。
perfview
解析etw事件文件的工具
下载地址 csdn 资源中