[新闻稿存档 ^][< 第 2 卷第 4 号][第 3 卷第 1 号 >]

Systems Internals 通讯第 2 卷,第 5 号

www.sysinternals.com
版权所有 (C) 2000 Mark Russinovich


2000 年 11 月 30 日 - 本期内容:

  1. 编辑

  2. SYSINTERNALS 最近更新

    • PsLoggedOn v1.2
    • PsShutdown v1.0
    • PsTools v1.1
    • BgInfo v1.1
    • Tokenmon v1.0
    • Filemon v4.32
    • Regmon v4.32
    • 在 Windows 2000 中,第 3 版
    • Windows 2000 Magazine 11 月刊和冬季刊
    • Sysinternals at Microsoft
    • Sysinternals 许可
  3. 内部信息

    • NFI
    • 隐藏的 Win9x 注册表项
  4. 即将推出

    • 新的 Whistler 系统调用

赞助商:WINTERNALS SOFTWARE

Sysinternals 通讯由 Winternals Software 赞助,网址为 www.winternals.com。 Winternals Software 是 Windows NT/2K 高级系统工具的领先开发者和提供商。 Winternals Software 产品包括用于 Windows NT 4.0 的 FAT32、NTFSDOS Professional Edition(用于 DOS 的读/写 NTFS 驱动程序)和 Remote Recover。

所有版本的 Windows 9x 和 Windows NT/2000 附带的 netstat 命令会显示系统上打开的 TCP/IP 端口,但不会显示哪个进程打开了端口。 TCPView Pro 是 Winternals 的最新监视工具,它不仅附带与 netstat 等效的命令行工具 Tcpvstat,可显示哪个进程已打开每个端口,还包含显示相同信息的 GUI 以及 TCP/IP 活动的实时跟踪。 实时跟踪显示进行网络访问的应用程序、具有可选 DNS 名称解析的访问的本地和远程 IP 地址、访问类型、访问成功以及传输的数据量。 TCPView Pro 仅售 69 美元。 立即在 www.winternals.com/products/monitoringtools/tcpviewpro.shtml 下载 TCPView Pro 14 天全功能试用版。

大家好,

欢迎阅读 Sysinternals 新闻稿。 该新闻稿目前有 28,000 名订阅者。

从 Windows NT 迁移到 Windows 2000 的一个好处是大大提高了可靠性。 我曾在多篇文章中介绍过改进的原因,这主要归功于一款名为 Driver Verifier 的工具。 可以通过在“开始”菜单的“运行”对话框中键入“验证程序”来配置验证程序,以密切监视特定设备驱动程序的执行,查找违反多个驱动程序编程规则中的任何一条。 不过,验证器在被动监控的基础上更进一步,它还会加剧潜在的错误条件,例如,为驱动程序分配跨越无效区域的内存块,并将传递给驱动程序的数据结构中的特定字段清零。 如果你真的想硬碰硬,可以让验证器为驱动程序模拟内存不足的情况。

Microsoft 通过其驱动程序签名计划利用验证程序,该计划要求任何由 Microsoft 进行数字签名的驱动程序通过严格的驱动程序验证程序测试。 安装驱动程序时,硬件向导会检查驱动程序是否已签名。 如果未签名,它将警告你,或无法安装驱动程序,具体取决于你在“驱动程序签名选项”对话框中输入的设置,可以从控制面板系统小程序的“硬件”页进行访问。

事实上,默认的驱动程序签名策略会警告最终用户注意未签名的驱动程序,这足以让大多数硬件供应商费尽心思使其驱动程序更加强大并获得签名。 但是,设备驱动程序可以在驱动程序签名策略未检测到的情况下潜入系统。 仅使用 INF 文件安装的驱动程序 (以 .inf 扩展名结尾的驱动程序安装文件) 会检查签名。 安装程序应用程序可以通过直接使用安装程序 API 或通过手动配置驱动程序的注册表设置来手动安装驱动程序。 Sysinternals 应用程序就是一个很好的示例:Filemon、Regmon 和其他具有驱动程序组件的 Sysinternals 工具手动安装其驱动程序,因此你不会收到未由 Microsoft 签名的警告。

通常不与 INF 文件一起安装的驱动程序包括病毒扫描仪、加密软件和 CD-ROM 刻录软件。 不过,这并不妨碍与硬件相关的驱动程序顺利通过。 适用于 Windows 2000 (www.sysinternals.com/ctrl2cap.htm 的 Sysinternals Ctrl2cap 驱动程序是硬件相关驱动程序的一个示例,该驱动程序以绕过驱动程序签名检查的方式进行安装。 此漏洞导致系统中存在未经验证的驱动程序,可能会危及系统稳定性(我在最高设置下验证所有 Sysinternals 驱动程序)。 Microsoft 应该强制所有驱动程序(而不仅仅是那些使用 INF 文件安装的驱动程序)都要经过签名检查。

为什么我在发牢骚? 我的 CD-ROM 刻录软件是市场上最受欢迎的那种类型的软件,但它的驱动程序会导致我使用的 Windows 2000 SP1 系统反复崩溃。 如果将驱动程序验证程序配置为检查,则系统在验证程序检测到驱动程序的第一个冲突并崩溃之前,系统甚至不会完成启动。 驱动程序在没有 INF 文件的情况下安装,因此不会警告我它未签名。 我敢保证,如果 Microsoft 的政策更加严格,那么这家供应商在推出未签名(而且漏洞百出)的驱动程序之前一定会三思而后行。

请将新闻稿传递给你认为可能对其内容感兴趣的好友。

谢谢!

-马克

SYSINTERNALS 最近更新

PSLOGGEDON V1.2

除了从 LoggedOn 到 PsLoggedOn 的明显名称更改外,此命令行工具还具有一些新功能,该工具能够显示本地登录者以及通过本地或远程系统上的资源共享登录的人员。 第一个是用户反馈生成的“-l”命令行开关。 许多人使用 PsLoggedOn 查看是否有任何帐户在本地登录到其服务器。 例如,可能有用户通过文件共享登录,但在决定何时更新账户或远程管理服务器时,这并不重要。

PsLoggedOn 的第二个新功能不仅能显示登录者,还能显示登录时间。 当 PsLoggedOn 使用 Win32 API NetSessionEnum 枚举资源共享登录时,它可以免费获取资源共享登录的登录时间(命令行 Net 命令也使用 NetSessionEnum 枚举会话)。 但是,没有 Win32 API 可告诉你谁在本地登录到系统,更不用说他们登录的时间了。

为了确定谁在本地登录到系统,PsLoggedOn 枚举位于计算机 HKEY_USERS 注册表项下的安全 ID (SID) 。 当某人在本地登录到计算机时,无论是在控制台上还是通过服务,其配置文件将加载到密钥 HKEY_USERS 中。 应用程序可以通过 HKEY_CURRENT_USER 键访问其配置文件的注册表设置, 因为系统会将该键视为指向其下 HKEY_USERS 特定配置文件的符号链接。 因此,PsLoggedOn 可以通过将计算机密钥中找到的 HKEY_USERS SID 转换为相应的用户名来知道本地登录的人员。 PsLoggedOn 在将远程计算机的注册表定向到登录远程系统的用户时使用 RegConnectKey 连接到远程计算机的注册表。

使用类似技巧找出用户登录的时间。 当 WinLogon 进程在用户登录后将用户的配置文件加载到 HKEY_USERS 中,WinLogon 会在其配置文件中创建一个名为“Volatile Environment”的易失性(不保存到磁盘上的配置文件)子键。 注册表存储注册表项的上次修改时间戳,并且由于系统不会在创建易失环境子项后修改这些子项,因此 PsLoggedOn 可以通过获取其可变环境子项的时间戳来确定用户何时登录。

在以下位置下载具有完整源代码的 PsLoggedOn v1.2
www.sysinternals.com/psloggedon.htm.

PSSHUTDOWN V1.0

如果你曾经需要关闭或重新启动本地或远程 Windows NT/2000 系统,则需要下载 PsShutdown。 PsShutdown 是 Shutdown Windows NT/2000 资源工具包工具的克隆版本。 它采用相同的命令行参数,用于指定关闭前的延迟、是否重新启动、向当前登录到系统的任何用户显示的可选消息,以及要关闭或重新启动的计算机的名称。

在 www.sysinternals.com/psshutdn.htm 下载 PsShutdown v1.0。

PSTOOLS V1.1

你可能已经注意到,Sysinternals 中以前缀“Ps”开头的工具越来越多。 第一个是 PsList,这是一个命令行工具,用于列出有关本地或远程 Windows NT/2000 系统上的活动进程的信息。 我之所以给 PsList 起这个名字,是因为标准的 UNIX 命令行进程信息工具被命名为“ps”。 获取前缀的下一个工具是 PsKill,这是一个命令行实用工具,可用于终止在本地或远程 Windows NT/2000 系统上运行的进程。 我给 PsKill 加上“Ps”前缀,是因为它是 PsList 的完美伴侣。

随着时间的推移,我开发了其他与 PsList 和 PsKill 共享相同定义特征的工具:它们基于命令行,适用于本地或远程 Windows NT/2000 系统。 例如,ElogList 允许转储系统事件日志的内容,GetSid 显示计算机或特定帐户的 SID。 最近,我决定将所有这些工具捆绑在一起,为其提供所有“Ps”前缀,并将它们作为名为 PsTools 的单个包进行下载。

PsTools 包括 PsList、PsKill 以及重命名后的 PsLogList 和 PsGetSid 等,共包含七个工具。 如果看到带有“Ps”前缀的 Sysinternals 工具,则会自动知道它是在本地和远程工作的命令行工具。

在 www.sysinternals.com/pstools.htm 下载 PsTools v1.1。

BGINFO V1.1

由于收到了大量的用户反馈,Bryce 更新了 BgInfo,这是一款设置桌面壁纸的实用程序,可显示有关系统配置的自定义信息。 默认情况下,BgInfo 在应用其对话框中指定的设置之前会倒计时 10 秒,但新的命令行选项 /timer 允许进行更改或完全消除倒计时。 这使得将 BgInfo 包含在登录脚本中或作为配置文件的 Startup 文件夹中的快捷方式更加方便。

版本 1.1 包括其他新功能,例如能够显示定义的任意文本,以及更多预定义的信息类别。 桌面位图 BgInfo v1.1 创建的通常也较小,从而最大程度地减少了 BgInfo 的桌面内存占用。

在 www.sysinternals.com/bginfo.htm 下载 BgInfo v1.1。

TOKENMON V1.0

Tokenmon 是可从 Sysinternals 下载的多种监视工具套件的最新补充。 Tokenmon 与其类似的 Regmon 和 Filemon 具有相同的用户界面,它可以监控 Windows NT/2000 系统上的重要安全相关活动。 什么是与安全相关的“重要”活动? Windows NT/2000 安全性的核心是令牌对象,它是包含帐户 SID、组 SID 和特权的数据结构。 每当进程尝试访问受保护的对象时,安全参考监视器在其令牌中使用 SID 作为访问验证的一部分。 如果进程尝试执行受限操作(例如重新启动系统),系统会检查进程令牌中的相应特权。

Windows NT/2000 安全模型的强大 (和专利) 功能之一是模拟。 模拟允许线程暂时替代其基于进程的标识,并通过使用模拟令牌采用备用标识。 服务器应用程序在代表客户端访问资源时利用模拟,在访问期间采用客户端标识。

Tokenmon 以与 Regmon 对注册表 API 相同的方式安装系统调用挂钩,以便监视令牌的创建和删除、权限的启用和禁用以及模拟。 Tokenmon 还使用 NT/2000 内核提供的进程创建挂钩来监视进程的创建和删除,以及其他 API 来确定用户何时登录以及何时注销。

Tokenmon 的完整源代码已经发布,其中一些有趣的技术值得讨论。 Tokenmon 通过挂钩 NtCreateToken 系统调用来检测登录事件,该调用是登录代理(如 WinLogon)用于为新登录会话的第一个进程创建初始令牌的调用。 由第一个进程创建的进程将继承第一个令牌的副本。 为了检测注销,Tokenmon 通过内核模式 SeRegisterLogonSessionTerminatedRoutine 函数注册注销通知,该函数是一种为文件系统驱动程序(称为网络重定向程序)而存在的 API,用于缓存登录会话数据,并希望在用户注销时进行清理。 网络重定向程序实现文件共享客户端/服务器连接的客户端。

另一个有趣的 Tokenmon 实现细节是它监视 API 的挂钩方式。 Tokenmon 挂钩的某些 API 不会导出以供设备驱动程序使用,而是在用户模式 NTDLL.DLL 库中导出,供使用其 Win32 等效项的应用程序使用。 Regmon 挂钩以内核模式导出的所有注册表 API,使 Regmon 设备驱动程序能够获取其系统调用号码,并适当地挂钩系统调用表。 对于未导出以供驱动程序使用的 API,Tokenmon GUI 必须使用 NTDLL.DLL 中的导出获取呼叫号码,然后将号码传递给驱动程序,以便驱动程序可以挂钩系统调用表。 因此,Tokenmon 演示了如何挂钩未在内核模式下导出的系统调用。

在 www.sysinternals.com/tokenmon.htm 下载具有完整源代码的 Tokenmon v1.0。

FILEMON V4.32

此最新的 Filemon 更新引入了更直观和完整的筛选,显示 Windows 9x/Me 网络文件访问的完整 UNC 路径名称,并显示 NTFS 元数据文件名。

以前版本的 Filemon 要求输入具有必需通配符的筛选器。 例如,如果要监视对驱动器 C: 上的 Temp 目录的访问,则必须输入如下筛选器:“c:\temp\*”。 使用新的筛选语法通配符是可选的,因此虽然示例筛选器有效,但“c:\temp”将达到相同的效果。 此外,Filemon 现在会将你输入的筛选器应用于显示中的所有字段,包括进程名称、请求类型、路径和“其他”列。 这种灵活性使你可以为特定类型的请求或在其他列中具有特定数据的请求监视,这是以前不可能实现的。

Windows 9x/Me 系统上的 Filemon 用户现在将在访问远程资源时看到具有完整 UNC 语法的 Filemon 显示路径名称。 Filemon 以前不会显示此类访问的服务器或共享名称,导致路径名称不完整。

最后,如果你在 Windows NT/2000 上使用过 Filemon,你无疑在路径列中看到了许多访问的“DASD”文本,(“DASD”来自“直接访问存储设备”,Microsoft 使用该术语来描述对绕过文件系统结构的卷的访问)。 对于 NTFS 卷上的大多数活动,DASD 现在已成为历史。 相反,你将看到正在读取和写入的 NTFS 元数据文件的名称。 例如,对 MFT 记录的更新以前会导致 DASD 输出行,但现在你将看到它作为对 MFT 的内部元数据文件名“$Mft”的访问。

为什么 Filemon 以前不显示元数据文件名,现在它如何获取这些名称? 表示 NTFS 元数据文件的文件对象不存储文件名,因此 Filemon 无法从文件对象中提取名称。 Filemon 获取文件名的另一种方法,即查询文件系统驱动程序,在 NTFS 元数据文件中也无法工作。 虽然 NTFS 确实使用元数据文件的名称进行响应,但 NT 4 上的 NTFS 会随机导致崩溃,而 Win2k 上的 NTFS 在响应此类查询时偶尔会挂起。

因此,Filemon 必须利用一个技巧来获取元数据文件名。 当它看到针对 NTFS 卷上没有名称的文件对象的请求时,它会向 NTFS 发送文件索引查询。 这是 Win32 函数 GetFileInformationByHandle 返回的索引,对于 NTFS 卷上的文件,索引是文件的 MFT 索引。 MFT 中的前 16 个条目是为特定元数据文件保留的,因此给定该范围内的索引后,Filemon 只需在自己的表中查找元数据文件名。

遗憾的是,仍会看到目录元数据和文件分配表的 DASD (FAT) 对 FAT 卷的访问,因为 FAT 不存储目录元数据文件或 FAT 的名称。 你会对 NTFS 日志文件 ($LogFile) 的访问频率感到惊讶。 顺便一提,Whistler 上的 NTFS 会存储元数据文件的名称,因此在 Whistler 上没有必要使用这个技巧。

最终的 Filemon 增强功能使得 Filemon 能够以毫秒分辨率显示时间戳。 由于 Windows 9x/Me 内核中的定时函数存在错误,因此要支持这种功能,就必须在 Windows 9x/Me Filemon 驱动程序中进行一些难看的修改。 有关详细信息,请参阅源代码。

在 www.sysinternals.com/filemon.htm 下载包含源代码的 Filemon v4.32。

REGMON V4.32

Regmon 的更改并不像 Filemon 那样重大,但是现在 Regmon 支持与 Filemon 相同的更直观的筛选语法,并且像 Filemon 一样将过滤器应用于所有字段。 它还可以在时间戳上显示毫秒分辨率。

已经开始使用 Whistler(Windows 2000 的后续版本)Beta 1 的用户可能已经注意到,以前版本的 Regmon 在启动时会导致 Whistler 崩溃。 这是因为 Microsoft 将系统调用表放置在写保护内存中,而 Regmon 会修改该表以插入其钩子。 Regmon v4.32 通过使用一种技术来解决这个问题,我没有提供源代码是根据 Microsoft 的要求,因为这种技术在 Whistler 的最终版本中可能会失效,并且 Microsoft 正在探索支持系统调用挂钩的方法。 Windows NT 并不支持系统调用挂钩,这是我们在 1996 年中期首次发布 Regmon 时开创的一项技术。

下面是无文档记录的 Filemon/Regmon 提示。 我经常收到一些电子邮件,询问如何在 Windows NT/2000 上用非管理员账户运行 Regmon 或 Filemon。在许多情况下,用管理员账户运行某个应用程序时可以正常工作,但用非特权用户账户运行时就不行,这时 Regmon 和 Filemon 就能帮助确定应用程序失败的原因(通常是与文件或注册表键的安全设置有关的问题)。 但是,从无特权帐户运行 Regmon 和 Filemon 将失败,因为 Filemon 和 Regmon 都安装了设备驱动程序,这需要管理员权限。

但是,有一个技巧可以让你解决此问题:如果你以管理员身份登录并启动 Filemon 或 Regmon,你将能够随后从无特权帐户运行它们。 这是因为 Filemon 和 Regmon 在首次执行时安装驱动程序,并在后续执行中访问已加载的驱动程序。 由于我未在驱动程序中实现任何安全性,因此无特权用户可以在加载驱动程序后运行这些工具。 安全问题? 是的,但 Filemon 和 Regmon 旨在用作故障排除工具,因此我和询问如何从无特权帐户运行实用工具的人员将此视为一项功能。

在 www.sysinternals.com/regmon.htm 下载包含完整源代码的 Regmon v4.32。

DEBUGVIEW V4.02

我收到的用户反馈最多的应用程序之一是 DebugView,这有点出人意料。 新版本有一些重大改进,解决了我收到的许多特性和功能请求,使 DebugView 比以往任何时候都更加强大。

最明显的是,DebugView 现在最多支持五个不同的突出显示筛选器,每个筛选器都有自己的可自定义颜色。 这样,就可以在调试输出中同时驻留不同的关键字,并轻松区分它们。 此外,DebugView 实现了与 Filemon 和 Regmon 相同的新筛选语法,使通配符可用于子字符串匹配。

我收到的有关 DebugView 早期版本的投诉是,即使你只想捕获 Win32 调试输出,你仍然需要管理权限才能运行 DebugView,因为如果 DebugView 无法安装其设备驱动程序,则无法运行。 此新版本甚至从没有特殊权限的帐户运行。 如果无法安装或访问其驱动程序,则只需禁用其内核模式捕获相关的菜单项。

有两个功能可以让 DebugView 在登录时自动开始捕获输出,它们是最小化到托盘选项和对命令行开关的支持。 使用命令行开关,你可以让 DebugView 在系统托盘中启动,并将捕获的输出记录到文件中,启动 DebugView 后,你可以使用菜单选项在正常最小化和最小化到系统托盘之间切换最小化按钮行为。

对于在 Windows 2000 终端服务上的远程会话中运行 DebugView 的用户,DebugView 现在会捕获远程会话中运行的应用程序生成的 Win32 输出,也可以从控制台会话中捕获这些输出。 这对于远程调试 COM 服务器和 Win32 服务很有用,因为这些类型的程序在控制台会话中运行。

最后,DebugView 现在可以在 Whistler Beta 1 上运行,支持捕捉来自内核模式 DbgPrint 函数的多个新 Whistler 变体的输出。

在 www.sysinternals.com/dbgview.htm 下载 DebugView v4.02。

在 Windows 2000 中,第 3 版

Windows 2000 内部版本的官方书籍现已推出! 此版本由大卫·所罗门 (www.solsem.com) 和马克·鲁西诺维奇共同创作,范围比上一版本增大 40% 以上,新增网络、即插即用、电源管理、服务、注册表、WMI、启动和关闭以及存储部分。 它还包括一张 CD,其中包含多个功能强大的工具,这些工具在其他地方都不可用,用于调查 Windows 2000 内部版本。

LiveKd 是我专门为本书编写的工具之一,这个程序可以让你在实时系统上运行 i386kd 和 WinDbg 这两个 Microsoft 内核调试器,就像查看崩溃转储一样。 书中介绍的许多试验在使用 LiveKd 运行时适用于实时系统。 LiveKd 的工作原理是安装文件系统筛选器驱动程序,该驱动程序将计算机的物理内存呈现给 Microsoft 调试器,就像它是故障转储文件一样。 LiveKd 创建长度为 0 的伪转储文件,当调试器从该文件读取时,LiveKd 从物理内存返回数据。 请查看该书的勘误和更新页面,以获取修复 LiveKd v1.0 与多个实时病毒扫描器不兼容性的补丁。

通过 www.sysinternals.com/insidew2k.htm 查看该书的目录并立即订购。

Windows 2000 Magazine 11 月刊和冬季刊

想知道 NTFS v4 和 NTFS v5 之间的确切变化吗? 如果想,请查看我在 Windows 2000 Magazine 11 月刊和冬季刊上的两篇系列文章。 第 1 部分介绍重新分析点、目录交接点、卷装入点、配额支持和合并的安全设置。 第 2 部分最后仔细研究加密、流、分布式链接跟踪和更改日志。 这两篇文章比其他文章更深入,介绍了这些新功能的磁盘变化和内部行为。

我在文章中没有提到的一点是,Windows NT 4 的 NTFS 并不是真正意义上的版本。

在 www.sysinternals.com/publ.htm 查找所有出版物的链接。

WWW.MICROSOFT.COM 上的 SYSINTERNALS

自上一期新闻稿以来,Sysinternals 在几篇新的 Microsoft 知识库 (KB) 文章中出现,并且我还找到了一些提及 Sysinternals 的早期 KB 文章。

  • Q260513 PRB:安装 Visual Studio 产品时发生错误
    http://support.microsoft.com/support/kb/articles/Q260/5/13.ASP
    本文建议读者使用 Filemon 和 Regmon 来排查 Microsoft Visual Studio 安装问题。

  • Q202258 XADM:系统找不到指定路径 - ID No:0cx002003
    http://support.microsoft.com/support/kb/articles/Q202/2/58.ASP
    实际上,微软指导用户使用 Filemon 来排除 Exchange 5.0 服务包升级问题,并提供了 Filemon 输出行示例和设置筛选器的建议。

  • Q269383 PRB:显示 VB/VBA 引用时出现“访问系统注册表时出错”消息
    http://support.microsoft.com/support/kb/articles/Q269/3/83.ASP
    Regmon 从这篇文章中获得了推荐,该文章讨论了如何使用它来确定为什么 Visual Basic IDE 中的“引用”对话框在无法访问注册表键时会报告错误。原因是 Seagate Crystal Reports 存在一个错误,将不正确的权限应用于多个键。

  • Q269251 BUG:枚举产品时,自动执行 Windows Installer 可能会挂起
    http://support.microsoft.com/support/kb/articles/q269/2/51.asp
    这里再次强调了 Regmon,它被用来揭示 Windows 安装程序自动化的一个错误。

  • Q276525 当监视打开的句柄时,你的计算机可能会停止响应
    http://support.microsoft.com/support/kb/articles/Q276/5/25.asp
    NtHandle 负责显示 Windows NT 4 SP6a 中的 bug,其中使用 NtHandle 时内核在特定条件下会挂起。 Microsoft 与我合作解决了该问题,并且他们发布了修补程序。 如果在使用 NtHandle 时 NT 4 系统挂起,应获取指向本文的链接。

  • Q160660 tregmon.exe 导致新服务包出现 STOP 0x0000001E 错误。
    http://support.microsoft.com/support/kb/articles/Q160/6/60.asp
    最后一个虽然老旧,但是很棒。 Regmon 的第一个版本使用硬编码的系统调用号来修补系统服务表,以便挂接注册表 API。 由于系统调用号有时会在不同的服务包之间发生变化,因此这种技术非常脆弱,而且我没有为此编写防御性代码(这违背了 Andrew Schulman 的建议,他担心 Regmon 会崩溃)。 果然,SP3 引入了一些新的系统调用,而 Regmon 会在挂接不正确的系统调用时导致系统崩溃。 虽然这肯定会惹恼一些人,但我确实从中获得了自己的知识库文章!

SYSINTERNALS 许可

尽管从 Sysinternals 下载的软件是免费软件,即可以免费使用,但你不得对其进行再分发,也不得从 Sysinternals 源代码中衍生产品。 例如,如果你所在的公司有多个用户发现特定的 Sysinternals 工具非常有用,你不能将这些工具发布到内部共享或网站上。 相反,请在你的网站上放置一个链接,指向每个工具在 Sysinternals 上的主页。 这也有助于确保同事始终下载最新版本。

如果希望在内部、随商业产品或共享软件 CD 一起重新发布 Sysinternals 工具,或者希望将商业产品或可重新发布的程序建立在 Sysinternals 源代码的基础上,请发送电子邮件至 licensing@.... 并说明你希望使用的详细信息。

内部信息

NFI

几期前,我透露了 Microsoft 无意中在 NT 4 SP4 光盘上交付的 DiskEdit 工具的存在。 DiskEdit 是一款功能强大的文件系统结构查看器,虽然功能奇特,但你可以用它来检查 NTFS 和 FAT(不过有趣的是它支持 NTFS)磁盘上的数据结构。 如果你错过了 NT 4 SP 4 CD,并且有兴趣探索 NTFS 磁盘上结构,那么你并不完全一无所知。 Microfot 发布了一款名为 NFI(NTFS Information)的免费工具,它能理解并转储 NTFS 卷的内部结构。 虽然其输出不如 DiskEdit 的输出详细,但它很有趣且具有启示性。

可以在 http://support.microsoft.com/support/kb/articles/q253/0/66.asp. 下载 NFI 作为 OEM 支持工具的一部分 使用文件名运行 NFI 会转储该文件的 NTFS MFT 记录。 以下示例演示 NFI 转储 $Quota 元数据文件的 MFT 记录 ,该文件仅在卷上启用了配额管理时才存在:

C:\nfi c:\$extend\$quota
File 24
\$Extend\$Quota
$STANDARD_INFORMATION (resident)
$FILE_NAME (resident)
$INDEX_ROOT $O (resident)
$INDEX_ROOT $Q (resident)

输出显示,文件占据 MFT 中的第 24 个条目,(其文件索引为 24),并且它包含四个属性,包括标准信息、文件名和两个索引根(索引实质上是条目的整理列表,如目录)。 我在最新的 Windows 2000 Magazine 关于 NTFS v5 的系列文章中介绍了 NTFS 如何使用 $Quota 指数。

若要转储卷上的所有文件,请在 NFI 的命令行上指定驱动器号,而不指定文件名,例如 nfi c:。 你将看到每个 MFT 条目的列表,包括所有元数据文件。

NFI 具有一些其他才能,例如能够将扇区号转换为它所在的文件。 想知道驱动器 C: 上的 2345 号扇区位于哪个文件中吗? 使用 nfi c: 2345 命令。 请注意,在卷集和条带集等软件 RAID 卷上,该功能会失效。 NFI 适用于 NT 4 和 Windows 2000。

隐藏的 WIN9X 注册表项

两期前,我曾说过要在下一期通讯中介绍“隐藏的 Win9x 注册表项”,结果有几位朋友提醒我,说我忘了。 因此,本月我将向大家介绍 Windows 9x 中的隐藏注册表项。

几年前,我发现了一种在 Windows NT 中创建隐藏注册表项的方法。 所谓隐藏,是指虽然可以通过 Regmon 看到创建键值的应用程序访问键值,但无法编写 Win32 程序查看键值,也无法使用 Regedit 或 Regedt32 注册表编辑器查看键值。 隐藏键可用于存储不希望最终用户修改的数据,如试用产品的超时日期。

制作隐藏注册表键值的诀窍在于,我意识到本地 NT API(即 Win32 API 所依赖的系统调用接口)要求将注册表项指定为已计数的 Unicode 字符串。 计数的 Unicode 字符串是长度由长度字段指示的字符串,而不是 null 终止符的存在。 因此,使用本机 API 可以创建包含 null 字符的注册表项,例如 "test\0test"。 由于 Win32 API 的注册表项 API 基于以 null 结尾的字符串,因此无法使用 Win32 API 打开包含 null 终止符的注册表项。 如果尝试将前面的示例键名称传递给 RegOpenKeyRegCreateKey,则会将其视为 "test",字符串在 null 字符处被截断。 由于所有现有的注册表编辑器(包括与 Windows NT 和 Windows 2000 捆绑的编辑器)都使用 Win32 API,因此使用本机 API 创建空字符嵌入名称的应用程序会有效地生成隐藏项。

此方法适用于 Windows NT,但 Windows 9x 呢? 在有人向我发送了一个 Regmon 日志文件,显示 Internet Explorer (IE) 访问 Regedit 中未显示的密钥之前,我认为没有办法在 Windows 9x 上创建隐藏的注册表项。 若要自行查看此内容,请启动 Regmon 并设置以下包括筛选器:“policydata”。 然后启动 IE(此操作适用于所有版本的 IE 4 和 IE 5)并访问网站。 如果在 Regmon 中看不到任何输出,请转到 IE 的选项配置对话框,并确保已启用内容顾问。

如果内容顾问已启用或已在系统上启用,你将看到对 HKLM\PolicyDat 键及其子项的访问。 但是,在 Regedit 中查看时,不会在 下方 HKEY_LOCAL_MACHINE 找到 PolicyData 密钥。 花一点时间看看你能否弄清楚发生了什么事。

答案是,IE 使用 RegLoadKey Win32 API 动态加载注册表配置单元,读取所需的值,然后使用 RegUnloadKey 卸载该配置单元。 配置单元命名为 C:\Winows\System\Ratings.pol - 文件是隐藏且只读的,但可以通过键入 attrib –r –h c:\windows\system\ratings.pol 来显示它。

在 Regmon 中看到的跟踪显示内容顾问在配置单元中查找的信息。 如果要自行浏览其内容,请从 www.sysinternals.com/regload.zip 下载我的 Regload 实用工具,并使用以下语法运行它:regload test c:\windows\system\ratings.pol。 然后打开 Regedit 并浏览 HKLM\test。 你将找到的值对应于你在内容顾问中指定的设置,并与在注册表项中命名的 Users\FileName0 值相关联的配置文件。 值通常指向 C:\Windows\System\RSACi.rat,Internet 内容分级协会定义的分级文件。 顺便提一下,你可能会在内容顾问的注册表设置中看到一个名字有点幽默的值,叫做 "PleaseMom",例如在 HKLM\Test\Users\Default 下。 此值派生自内容顾问设置对话框的“常规”页上的“监督程序可以键入密码以允许用户查看受限内容”复选框。

Microsoft 混淆这些注册表值的原因显而易见。 但是,他们的设计存在一个相当严重的弱点。 请注意,启用内容顾问时,必须指定一个密码来保护内容顾问的设置对话框。 此密码存储在 HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Ratings\Key 中。 删除该值后,你就无需输入密码即可访问内容顾问设置了! 现在,如果 IE 开发人员费心对内容顾问设置进行混淆,为什么他们会把这个后门留在公开的地方? 我想,这就是典型的 Microsoft 安全设计。 顺便说一句,若要卸载用 Regload 载入的密钥,只需键入 regload test

即将推出

新的 Whistler 系统调用

Whistler 是 Windows 2000 操作系统的渐进式发展,侧重于提高可靠性和轻松从 Windows 9x 操作系统迁移用户。 但是,它确实包含一些内核更改。 最明显的是少数新的系统调用和导出(可供设备驱动程序使用)的内核函数。 下一次,我将为大家预览这些新的内核 API。


感谢阅读 Sysinternals 新闻稿。

ottoh 发布于 2000 年 11 月 30 日 星期四 晚上 7:05

[新闻稿存档 ^][< 第 2 卷第 4 号][第 3 卷第 1 号 >]