前言

前言

Sysinternals Suite工具套件包含超过70种适用于Windows平台的高级诊断和排错工具,这些工具由我——Mark Russinovich和Bryce Cogswell开发而来。微软于2006年收购Sysinternals后,这些工具开始通过微软(TechNet旗下)Windows Sysinternals网站免费提供下载和使用。

本书目标在于帮助读者熟悉Sysinternals工具,了解如何更充分地利用这些工具。本书还将介绍一些我和他人使用这些工具解决Windows系统现实问题的范例。

虽然本书是我与Aaron Margosis合著的,但完全表达了我的观点。Aaron也对本书做出了巨大的贡献,这本书的顺利出版离不开他的辛苦工作。

 

注意 有关本书出版过程中的内容改动,请参阅前言“后期改动”一节。

本书涉及的工具

本书介绍了Windows Sysinternals网站(http://technet.microsoft.com/en-us/sysinternals/ default.aspx)提供的所有Sysinternals工具在撰写本文时(2016年初夏)包含的全部功能。然而Sysinternals工具的开发进度非常快,现有工具会不断获得新增功能,此外时不时还会引入新的工具(为及时了解最新进展,请订阅“Sysinternals网站讨论”博客的RSS信息源:http://blogs.technet.microsoft.com/sysinternals/)。在你阅读本书的时候,其中一些内容可能已经过时了,不过你依然应该尽量使用最新版Sysinternals工具,以便获得新增功能以及各种瑕疵修复。

本书并未涉及已弃用并不再通过Sysinternals网站提供的工具。如果你依然在使用RegMon(注册表监视器)或FileMon(文件监视器),可以考虑使用第5章介绍的Process Monitor取代这些工具。计算机行业首个Rootkit检测工具Rootkit Revealer(正是这个工具发现了“Sony rootkit”)也已完成使命顺利退役。此外还有其他几个提供了独特价值的工具(例如Newsid和EfsDump)也已经由于不再需要或Windows已包含类似的功能而退役。

Sysinternals的历史

我开发的首个Sysinternals工具是Ctrl2cap,它的诞生有一定的必然性。我从1995年开始使用Windows NT,之前主要使用UNIX,该系统的键位设置在标准PC键盘上Caps Lock键的位置是Ctrl键。我不想适应新的键位布局,于是开始研究Windows NT设备驱动的开发,并写了一个能将Caps Lock键的按压转换为Ctrl键的按压结果并传递至Windows NT输入系统的驱动。Ctrl2cap目前依然放在Sysinternals网站上,我还在自己的所有系统中使用着。

Ctrl2cap是我所开发的深入至Windows NT底层技术,同时提供了实用功能的众多工具中的第一个成员。在这之后我与Bryce Cogswell联手开发了NTFSDOS。我和Bryce最初在卡内基梅隆大学(Carnegie Mellon University)研究生院相识,我们一起完成了多篇学术论文,并发起了一个为Windows 3.1开发软件的初创项目。当时我产生了一个念头,想要写一个能够让用户通过无处不在的DOS软盘访问NTFS分区的工具。Bryce觉得这个工具在编程方面会遇到一些有趣的挑战,大概一个月后我们完成了该工具的开发并发布了第一个版本。

随后我还与Bryce合作开发了另外两个工具:Filemon和Regmon。NTFSDOS、Filemon以及Regmon这3个工具奠定了Sysinternals的基础。当时我们发布的Filemon和Regmon可运行于Windows 95和Windows NT系统上,可用来查看文件系统和注册表活动,这样的功能在当时是独一无二的,很快成为我们排错过程中必不可少的帮手。

随后Bryce和我决定将这些工具共享给其他人,但当时我们并没有自己的网站,所以最初我们将这些工具放在了另一位友人——Andrew Schulman的网站上。我最初认识他时,他也在研究DOS和Windows 95的内部运作。由于当时需要通过中间人来发布这些工具,因此我们无法根据进度及时更新这些工具并修复瑕疵,因此Bryce和我在1996年9月创建了NTInternals.com网站,通过这个网站发布我们的工具,以及我们撰写的有关Windows 95和Windows NT内部运作的文章。后来我们觉得可以通过销售自己开发的工具赚点零花钱,所以在网站上线的同一个月,我们成立了商用软件公司Winternals Software,并通过NTInternals.com上放置的一个横幅广告为新公司吸引流量。我们以Winternals Software公司身份发布的第一个工具是NTRecover,这个工具可以帮助用户将无法启动的Windows NT系统的磁盘挂载到其他可以使用的计算机上,然后像访问本地磁盘一样访问故障计算机中的文件。

NTInternals.com的使命是分发免费的工具软件,我们利用对Windows操作系统的深入理解开发了一系列功能强大的诊断、监视和管理工具。经过几个月的发展,该网站终于在1996年12月发展成图0-1的样子(这还要感谢Internet Archive的Wayback Machine功能可以让我们随时回顾历史),当时该网站的每天访客数已经达到1500人,逐渐成为互联网革命开始前的“上古时代”最受欢迎的Windows工具网站。1998年,在微软公司律师的“启发”下,我们将网站改名为Sysinternals.com。

图0-1 NTInternals.com网站

过去多年来,我们开发的工具一直在不断完善。我们根据自己的实际需要,根据大量早期用户的反馈和建议,并根据我们所设想的有关Windows内部各类信息的呈现方式开发了更多工具。

Sysinternals工具主要可分为3个基本类别:针对程序开发工作的,针对系统排错工作的,以及针对系统管理工作的。可以获取并显示程序调试语句的DebugView工具是我所开发的第一个面向开发者的工具,该工具主要用来帮我开发设备驱动。显示进程所加载DLL信息的DLLView,以及可以显示进程所打开句柄的进程列表GUI工具HandleEx,这两个工具是最早开发出来的排错工具(我在2001年将DLLView和HandleEx的工具合并在一起开发了Process Explorer)。本书第7章将要介绍的PsTools则是最受欢迎的管理工具,为了方便大家下载,我把它们捆绑成了一个工具套件。PSTools系列首个工具PsList最初的灵感来源于UNIX中用于查看进程列表的PS命令。这些工具的数量和功能不断增加,很快形成了一个工具套件,可以帮助用户更轻松地针对远程系统执行各种任务,而无须事先在远程系统上安装任何特殊软件。

到了1996年,我开始为《Windows IT Pro》杂志撰文,我的文章主要介绍Windows内部原理和Sysinternals工具,此外我还写了介绍其他功能的文章,例如1996年撰写的一篇引起广泛争议的文章让我在微软内部正式扬名,尽管大部分意见并非正面的。当时我在“Inside the Difference Between Windows NT Workstation and Windows NT Server”这篇文章中指出,Windows NT Workstation和Windows NT Server操作系统之间的差异仅仅是微软出于产品营销角度的考虑而产生的。

随后我发布的Ntcrash和Ntcrash2工具进一步恶化了微软与我的关系,这两个现在被称之为“Fuzzer”[1]的工具会使用随机生成的垃圾数据阻塞Windows NT系统调用接口。这些工具可检测出大量使用弱参数验证(Weak parameter validation),进而可能由于非特权用户模式进程造成内存出错和蓝屏崩溃的系统调用(在20世纪90年代的系统安全大环境下,这种问题被简单地视作可靠性方面的小瑕疵,不像现在会被视作“重要”的安全瑕疵)。

随着这些工具的继续完善和增加,我开始考虑专门撰写一本有关Windows内部原理的图书。当时市面上已经有了类似的图书:《Inside Windows NT》(Microsoft Press,1992年出版),本书的第一版由Helen Custer撰写,并伴随Windows NT 3.1一起出版。本书第二版由操作系统领域的知名专家、讲师和作者,当时就职于DEC公司的David Solomon围绕Windows NT 4.1重写并进行了完善。我并没有从头开始写一本类似的书,而是联系他并建议与他联手撰写主要面向Windows 2000的第三版。在1996年那篇文章余波渐平后,随着我直接向Windows开发人员提交Windows瑕疵报告,我与微软的关系正在逐渐回温,但David依然需要获得微软的允许,好在微软也同意了。

随后David Solomon和我联手撰写了本书的第三、第四、第五以及第六版。从第四版开始,本书改名为《Windows Internals》。从第五版开始,我们选择了Alex Ionescu作为合著者。到第六版,书中包含的内容实在太多,于是我们决定将该书分为上下两部。就在我们完成《Inside Windows 2000》(Microsoft Press,2000年出版)后不久,我开始与David合作讲授他的Windows内部原理研讨会课程,并加入了我所撰写的内容。这一由微软向全球Windows开发者提供的课程大量借助Sysinternals工具向学生介绍有关Windows内部运作的深入信息,当这些学生返回自己的开发者和IT专业人员工作岗位后,也陆续开始使用我们开发的这些工具。

到了2006年,我与微软的关系已经好转并维持了多年,Winternals也逐渐开发出一整套企业管理软件,经过多年的发展已经有了100多名员工,同时Sysinternals工具的每月下载量达到了2百万次。2006年7月18日,微软收购了Winternals和Sysinternals。不久之后Bryce和我(图0-2是我们在2006年的合影)加入了Windows团队并搬家到雷德蒙。目前我担任Microsoft Azure首席技术官的职务,主要负责领导Azure云计算平台的技术战略和架构。

图0-2 Mark Russinovich和Bryce Cogswell的合影

当时的收购,主要目标在于确保Bryce和我开发的工具能继续免费提供,并且我们构建的社区能够继续发展,这两个目标都实现了。目前,托管在technet.microsoft.com上的Windows Sysinternals网站已成为整个TechNet访问量最大的网站之一,平均每月下载量高达450万次。Sysinternals的高级用户会时不时访问该网站获取最新版工具以及新发布的工具,例如最近我们发布的Sysmon和PsPing,与此同时他们也会积极参与Sysinternals社区,在撰写本文时,这个飞速成长的社区已经有超过42000名注册用户。我还会继续对现有工具进行完善,并增加新的工具。

很多人曾建议如果能针对这些工具写一本书就太好了,但直到David Solomon也提出类似的建议,这个项目才开始提上日程。我在微软承担的工作使得我没有足够的时间另外写一本书,但David觉得可以找人来帮忙。最终Aaron Margosis同意与我合作,为此我感到很高兴。Aaron是Microsoft Cybersecurity Services部门的首席顾问,他对Windows安全性和应用程序兼容性有着极为深入的理解。我与Aaron相识多年,他卓越的写作技能,对Windows内部原理的熟悉程度,以及对Sysinternals工具的娴熟掌握使得他成为理想的合著者。

本书的目标读者

本书适合Windows IT专家、高级用户,以及希望更充分利用Sysinternals工具的开发者阅读。无论你对这些工具有怎样的了解,无论你管理着大企业或小公司的系统,或者只是维护着家人或朋友的计算机,本书中涉及的工具、技巧,以及经验都可以帮助你更高效地对Windows故障进行排错,让系统管理运维和监控工作变得更简单。

前提假设

本书会假设你已经熟悉并了解Windows操作系统。如果能对进程、线程、虚拟内存,以及Windows命令行等概念有基本了解,则将对阅读本书起到更大的帮助,本书第2章“Windows核心概念”对上述部分概念也有所涉及。

本书的组织方式

本书分为3部分。第1部分“入门”概括介绍了Sysinternals工具和Sysinternals网站,并介绍了所有工具中通用的功能,会告诉你如何获得帮助,同时还介绍了可以帮你更好地理解整个平台及这些工具所呈现信息应了解的一些Windows核心概念。

第2部分“使用指导”详细介绍了所有Sysinternals工具的功能、命令行选项、系统要求,以及注意事项。在大量屏幕截图和用例的帮助下,这部分内容可以回答你关于这些工具可能产生的各种问题。对于一些重要的工具,例如Process Explorer和Process Monitor,会用专门的章节进行介绍,后续章节则会按照类别介绍不同的工具,例如安全工具、Active Directory工具,以及文件工具。

第3部分“排错——‘难解之谜’”通过真实案例介绍了Aaron和我,以及全球各地管理员和高级用户使用Sysinternals工具解决实际问题的过程。

本书中的约定和特色

为了让相关信息更易读,更益于参照,本书中内容的呈现使用了下列约定。

  • 标有“注意”字样的方框提供了为成功完成某些步骤需要注意的事项或其他备选的实现方法。
  • 需要用户输入的文字(代码块除外)将加粗显示。
  • 两个按键名称之间的加号(+)意味着必须同时按下这些按键。例如“按下Alt+Tab”意味着需要按下Alt键,并在不松手的情况下按Tab键。
  • 两个或多个菜单项之间的竖线(例如 文件 | 关闭)意味着需要先选择第一个菜单或菜单项,随后选择下一个项目,以此类推。
  • 在命令行语法规范中,竖线意味着“OR(或)”,方括号意味着“可选”,斜体字意味着需要用户输入的信息对应的占位符,花括号意味着分组,省略号代表重复模式。例如:
procdump
    [-ma | -mp | -d callback_DLL] [-64] [-r [1..5] [-a] [-o]
    [-n count] [-s secs]
    [-c|-cl percent [-u]] [-m|-ml commit] [-p|-pl counter_threshold]
    [-e [1 [-g] [-b]]] [-h] [-l] [-t] [-f filter,...]
    {
      {{[-w] process_name}|service_name|PID } [dump_file | dump_folder] } |
      {-x dump_folder image_file [arguments]}
    }

上述代码意味着-ma-mp-d是可选使用的;如果使用-d,必须为callback_DLL赋值。此外还可选择使用-f选项,如果使用,则必须提供一个或多个filter值。最后四行的分组意味着必须指定一个process_nameservice_namePID,或使用-x选项并提供dump_folderimage_file

系统要求

除非特别注明,Sysinternals工具可在下列受支持的Windows版本,包括64位版中运行:

  • Windows Vista;
  • Windows 7;
  • Windows 8.1;
  • Windows 10(桌面)[2]
  • Windows Server 2008;
  • Windows Server 2008 R2;
  • Windows Server 2012;
  • Windows Server 2012 R2;
  • Windows Server 2016,包括Nano Server。

一些工具运行时需要管理权利,其他工具中部分功能可能需要管理权利。

后期改动

在本书即将完工的过程中,为了对Windows Server 2016新增的Nano Server模式提供支持,本书涉及的很多工具均发布了新版本。Nano Server是一种小痕迹、无头式(Headless)Windows Server 2016安装选项,仅包含最少量的功能和服务。对Sysinternals用户来说,最值得关注的地方在于Nano Server不包含32位子系统和GUI组件。正如在本书“第1章:Sysinternals工具入门”中所述,每款Sysinternals工具均会和其他必要的文件,例如64位库文件一起打包成一个32位可执行文件,这些嵌入的资源可按需提取并执行。当然,所有这些32位映像均无法在Nano Server上运行,于是我为控制台模式的工具创建了原生的64位版本,并在文件名末尾附加了“64.exe”字样。例如64位版SigCheck.exe变成SigCheck64.exe。此外我还创建了控制台版本的LoadOrd(加载顺序)工具:LoadOrdC.exe,以及一个原生的64位版LoadOrdC64.exe。

Nano Server的管理严重依赖PowerShell Remoting。PowerShell会将标准错误(stderr)流的所有输出视作对错误的陈述。控制台模式的Sysinternals工具会始终将Banner和语法信息写入Stderr。为改善这些工具对PowerShell,尤其是Nano Server的支持,现在这些工具已可将Banner和语法信息写入标准输出(stdout)流,并会使用新增的-nobanner命令行选项忽略Banner输出。然而要注意,该选项取代了以往很多工具用来实现类似功能的-q选项。

致谢

首先Aaron和我要感谢Sysinternals的共同创始人Bryce Cogswell,他对Sysinternals工具的开发做出了卓越贡献。借助我们之间的良好合作,Bryce和我才有机会联手发布各种实用的Sysinternals工具。Bryce已于2010年10月从微软退休,无论他今后的目标是什么,我们希望他好运。

此外也要感谢David Solomon鼓励Mark撰写这本书,负责对本书很多章节的审阅,并为第一版作序。多年来,Dave都是最热心的Sysinternals“布道师”之一,针对不同新功能提供了宝贵的建议。

感谢Luke Kim在本项目升级到最新版Microsoft Visual Studio,为开发工作提供Visual Studio Team Services(VSTS)源代码控制系统,优化构建和发布流程,管理Sysinternals.com网站和live.sysinternals.com基础架构服务器(现已运行在Azure之上)过程中提供的大量帮助。同时还要感谢Kent Sharkey发布的Sysinternals.com网站更新。

几年前,只有Bryce和我负责这些工具的开发,但我也开始逐渐接受其他开发者的贡献。Ken Johnson、Andrew Richards、Thomas Garnier、David Magnotti、Dmitry Davydok、Daniel Pearson、Justin Jiang和Nano Server团队的其他成员、Giulia Biagini、Pavel Yosifovich,以及Aaron Margosis均对一些功能的开发做出了自己的贡献。

此外还要感谢John Sheehan对以往未曾公开过的AppContainers工作原理进行的深入介绍;Alex Ionescu提供了有关受保护进程的技术细节;感谢Ned Pyle、Marty Lichtel和Carl Harrison允许将他们以前发布的案例纳入本书。

本书的技术审阅和修订过程中,得到了来自下列人员提供的宝贵见解和建议,我们也要向他们表示感谢:Andrew Richards、Bhaskar Rastogi、Bruno Aleixo、Burt Harris、Chris Jackson、Crispin Cowan、Greg Cottingham、Ken Johnson(即Skywing)、Luke Kim、Mario Raccagni、Steve Thomas,以及Yong Rhee。

Aaron和我对于邀请那个著名的人为这本书作序本来并没有抱太大希望,他竟然同意了,至今我们依然难以置信。万分感谢N.P.(Noted Person)[3]

我们还要感谢Microsoft Press的Devon Musgrave(策划编辑兼开发编辑)和Carol Dillingham(项目编辑)在本书出版过程中付出的辛苦工作,尤其要感谢他们在本来规定好的交稿日期“无限”延后的过程中表现出的耐心。感谢Waypoint Press的Steve Sagman在项目管理和排版方面提供的支持。同时要感谢负责技术加工的Christophe Nasarre和负责文案编辑的Roger LeBlanc。Aaron还想向自己的妻子Elise和孩子Elana、Jonah和Gabriel表示感谢,谢谢他们的爱和支持。另外Aaron还要感谢Brenda Schrier拍摄的作者照片,并要感谢华盛顿国家棒球俱乐部和西汉姆联队。

Mark也希望对他的妻子Daryl和女儿Maria表示感谢,感谢她们对自己工作的支持。

勘误、更新和图书支持

我们已经尽了最大努力确保本书内容精确无误。你可以访问http://aka.ms/Troubleshoot Sysint/errata查看本书的最新勘误列表和相应的修订。

如果发现勘误中未列出的错误,也可通过上述页面提交给我们。

如果需要进一步支持,可向Microsoft Press图书支持部门发送电子邮件:mspinput@ microsoft.com。

然而请注意,上述邮件地址并不提供有关微软软件的产品支持。若要获得有关微软软件或硬件产品的支持,请访问http://support.microsoft.com。

Microsoft Press提供的免费电子书

从技术概述到针对特定话题的深入信息,Microsoft Press针对种类丰富的不同话题提供了免费电子书。这些电子书分为PDF、EPUB,以及适用于Kindle的Mobi格式,可随时通过下列地址下载:

http://aka.ms/mspressfree

你也可以经常访问上述地址下载最新发布的电子书!

读者反馈

对于Microsoft Press来说,读者的满意是我们的头等要务,读者的反馈是我们最珍视的资产。请通过下列地址告诉我们你对这本书的想法:

http://aka.ms/tellpress

这个调查非常简短,我们会仔细阅读每位读者的意见和建议。提前感谢大家的反馈!

保持联系

书读完了联系也不能中断,你可以关注Microsoft Press的Twitter账号:http://twitter.com/ MicrosoftPress。


[1] 译注:此处的Fuzzer是指用于Fuzz testing(模糊测试)的工具,这是现在比较常见的一种测试方法,其核心思想是以自动或半自动方式生成随机数据输入到一个程序中,并监视程序异常,如崩溃,断言(Assertion)失败,以发现可能的程序错误,如内存泄漏。这种模糊测试常用于检测软件或计算机系统的安全漏洞,详见:https://en.wikipedia.org/ wiki/Fuzz_testing。

[2] 所有Sysinternals工具均为Win32应用,仅支持x86和x64架构系统,不兼容Windows 10 Mobile、IoT、Xbox等。

[3] 那个“著名的人”,他的秘密身份其实是Chris Jackson,即The App Compat Guy,亦即Captain Inappropriate。

目录

  • 版权
  • 版权声明
  • 内容提要
  • 序言
  • 前言
  • 关于作者
  • 第1部分 入门
  • 第1章 Sysinternals工具入门
  • 第2章 Windows核心概念
  • 第3章 Process Explorer
  • 第4章 Autoruns
  • 第2部分 使用指导
  • 第5章 Process Monitor
  • 第6章 ProcDump
  • 第7章 PsTools
  • 第8章 进程和诊断工具
  • 第9章 安全工具
  • 第10章 Active Directory工具
  • 第11章 桌面工具
  • 第12章 文件工具
  • 第13章 磁盘工具
  • 第14章 网络和通信工具
  • 第15章 系统信息工具
  • 第16章 其他工具
  • 第3部分 排错——“难解之谜”
  • 第17章 错误信息
  • 第18章 崩溃
  • 第19章 挂起和性能迟钝
  • 第20章 恶意软件
  • 第21章 理解系统行为
  • 第22章 开发者排错

相关技术

推荐用户