分节阅读 4(1 / 1)

黑客技术大宝库 佚名 5050 字 4个月前

所有的nt系统中运行oh并将设置打开并非什么重大问题,因而也不会引发严重后果,但这些工作也不是设定为默认的。因此,当你初次运行oh时,你会得到一个出错信息或一些关于你已经设定了特殊标志并应重新引导系统的提示。好的,鉴于我已在笔记本电脑上进行了上述工作,就让我们进入命令行方式中吧。我们将调出一个命令行方式。首先,我将键入oh/?,以便看到有关选项。oh有两个选项。在第一个选项中,你可以指定你所感兴趣的进程id。换言之,为我显示由第43号进程打开的句柄。第二个选项是查看特定种类的打开句柄。例如,文件可能是打开的文件、注册表键、由线程打开的线程等等。我将要强调的最后一个选项是转而寻找由具有特定名称的对象打开的句柄。我们举个例子就能把问题搞清楚。如果我想要查找为powerpoint(ppt)文件打开句柄的话,我应输入oh –t file,意思是只寻找文件对象的句柄,即那些包括.ppt扩展名的存在于对象名中的句柄名。答案是什么呢?是powerpoint。这儿有面向powerpoint文件的打开句柄,而这里的powerpoint文件还包含着我们正在运行的演示文稿——tnq400-02.ppt。如果你遇到了一个文件锁死错误,那么,这就是找出打开有关文件的处理器进程的快捷方法。然而,如果你看一下输出的话,会发现有一部分至关重要的文件信息没有被oh显示出来。在文件名之前漏掉了什么呢?是驱动器名。这就把我们带到了幻灯片上所示的第二个工具——handle.exe,该工具是一个图形用户界面工具,而它的命令行版本叫nt handle。这是我们所运行过的第一来自sys internals网站的工具。它是一个自由软件。请稍微记录一下,该工具如同来自sysinternals.com的大多数工具一样,也包括对设备驱动程序的使用。当你第一次运行handle.exe时,在系统中将装入一个驱动程序,正如我们先前所提到的,像其它驱动程序和windows nt系统一样,设备驱动程序也共享同一内存空间(或者叫沙箱),这就意味着如果该驱动程序中存在错误,它将有崩溃的可能。这对于任何设备驱动程序而言都是现实的。handle.exe需要使用设备驱动程序的原因是,该工具绕过nt的安全机制从进程句柄列表中找回打开文件的完整名字,而这就触及了通常从一般windows应用程序中所无法进行访问的信息。让我们看一看handle.exe工具是个什么的样子。这是图形用户界面版本,当它启动时,会显示一个关于系统中进程的列表。当我选中一个进程时,比如,我向下滚动列表并选中powerpoint,handle.exe会显示出该进程所打开的句柄表格。现在,该工具按句柄编号对表格进行排序,这并不是非常重要的信息。我将按句柄类型对表格重新进行排序。现在,我单击类型列,于是我们马上就看到了打开文件列表,并且还从中看到了包含当前演示文稿在内的powerpoint文件的完整路径名。这里,磁盘符c:被加入到路径名之中。可见,handle.exe是另一种查看打开句柄的方法。该工具并不像oh工具那样需要重新引导系统以使设定的特殊标志生效。而其消极的方面则是,它需要使用设备驱动程序,并会因此导致对调用驱动程序代码的常规限制和警告信息在你的系统上出现。仅就个人而言,我从未因此遇到过程序崩溃,但该工具的确将授权系统代码调入了操作系统沙箱。

使用handle exe来查看句柄信息的另一种方法是执行一个搜索。如果我单击搜索发现菜单项或直接按f3键,我将能够在随之出现的对话框中输入一个不完整的文件名(例如.ppt),接着,单击搜索按钮,handle exe便会对包括.ppt扩展名的全部句柄进行搜索。于是,我又一次找到了打开powerpoint文件的进程。这就是查看打开句柄的另一种方法。

另一类由那些给windows系统管理员带来麻烦的进程所调用的文件就是动态链接库。动态链接库冲突已成为许多系统管理员眼中的祸害。这一难题被windows 2000中的windows 安装器自适应应用程序支持和windows文件保护功能大大化解,windows 安装器自适应应用程序支持和windows文件保护功能可自动恢复被删除或被错误版本替换的系统动态链接库。因此,动态链接库冲突和替换问题将在windows 2000中得到整体改观,但是,能够查看进程并找出其所调用的动态链接库及其磁盘出处对于我们来说仍然非常重要。

在观察一个活的进程之前,首先让我们来观察静态视图。换句话说,指定一个可执行文件,告诉我当其运行时哪些动态链接库(dll)将被装入,为了观察到这些信息,我们将使用一个称为依赖关系浏览器(dependency walker)的工具。该工具包含于windows 2000资源工具包中,我将通过开始/运行/depends来启动它。dependency walker窗口出现后,现在我便可以打开一个可执行文件或一个可执行映像了。我将单击打开文件菜单项并且作为一个示例我将选择记事本程序。现在,dependency walker使用的缺省文件夹是win nt system 32文件夹,windows 2000和windows nt 4的大部分可执行映像都将被保存在这里。因此,我们已经定位在打开notepad.exe文件的正确目录下了。选择notepad并且单击打开。现在我并未创建任何进程,我所做的全部只是打开notepad.exe文件。此时dependency walker已经列出了记事本程序所链接的动态链接库的映像名称列表。换句话说,这八个动态链接库是包含记事本程序运行时所需支持例程的库。请记住,它们并不是记事本程序运行时将要用到的所有动态链接库的完整列表,而仅仅是程序启动时将被装入的动态链接库的列表,因为动态链接库可以在程序运行中动态地装入。因此这是一个非常有趣的显示,它并未真正告诉我们将使用什么,同时,因为当动态链接库装入后将产生一个使用情况的精确集合,它也未显示出dll文件在磁盘上的位置。首先将在可执行文件所在的目录中寻找相应的dll文件。其次将使用当前目录。最后使用记录搜索路径的环境变量,并且如果一个动态链接库是已知的,那么它将被覆盖,因为这意味着它已经在系统启动时被打开了。尽管这是一个很有意义的显示,当进程被实际运行时,一个更有意义的输出将向我显示动态链接库是从哪里装入的。这将我们带入了下一个主题:观察实际情况下活动的动态链接库的使用情况。

如果你遇到动态链接库冲突或由于一个错误版本的动态链接库的装入而导致应用程序失败的情况,如果你不知如何捕获进程或想在激活进程之前观察进程以便找到动态链接库被装入的完整路径,那么这部分或许能够帮助你诊断动态链接库冲突。

现在,windows 2000中的dependency walker有了一个新的选项用以简要描述一个进程。这个选项意味着通过实际创建一个进程或可执行程序的实例来检测和跟踪动态链接库的装入。因此我将回到dependency walker中并单击profile已启动配置文件。我将选择缺省设置。当我单击确定按钮时,dependency walker将创建一个测试进程来运行记事本程序并跟踪和监视在显示区域下部窗口中所有动态链接库的活动。让我们来做一下。现在有一个记事本,如果我回到dependency walker并观察显示区域的下部,会发现有一小部分关于摘要的日志记录产生。这里有一个列表记录了当进程启动时被装入的动态链接库。同样,它没有告诉我们将在下一个介绍的工具中看到的完整的文件名称,但至少我们可以看到被装入的动态链接库。现在,如果我回到记事本并尝试打开一个文件,当标准打开文件对话框被打开时,可以在背景中观察到有10到20个附加的动态链接库被装入。让我们来做一下。你能够在背景中看到吗?让我们回到dependency walker中,如果向上滚动,会发现作为显示标准打开文件对话框的结果,有许多以前未被装入的动态链接库已经被添加到进程中了。如果我们回到动态链接库列表,会发现动态链接库的数量已经在8个的基础上增加了很多。我还能够从显示区域的中部观察到装入的动态链接库列表,让我们统计一下添加的数量——为了显示标准打开文件对话框共有31个动态链接库被装入,但仍未看到完整路径。这将我们带入到下一个工具——前面使用过的tlist,但这次我们将使用一个前面没有介绍的参数以指定一个特定的进程名。

在下一个演示中,我们将使用tlist工具显示一个进程中装入的动态链接库列表,并且查看它所显示的信息。切换到一个同时运行命令行、tlist和powerpoint的状态,并查看由powerpoint进程装入的动态链接库列表,这些动态链接库的内存地址位于进程地址段中。我们确实得到了一些有用信息,但还遗漏了什么数据呢?对,正是动态链接库的完整路径名。这张幻灯片上提到最终将向我们显示完整路径名的工具是我们从sysinternals.com网站上得到的第二个工具list dll。list dll工具可以显示每个动态链接库的完整路径,同时它也将顺便显示正在运行的执行程序的完整路径。这是对nt系统上正在运行的内容进行分析的另一个重要方面。像我们前面所说的那样,一个可执行文件的名称未必总能使你立即了解它的作用,但是如果你知道该文件所在的目录,至少它可能让你迅速地知道该文件是哪个软件包的一部分。因此,我们使用list dll工具不仅仅是为了查看动态链接库的细节,更重要的是应当牢记它是查看一个可执行文件完整路径的快捷方式。

我们将回到命令行方式,现在,让我们从我们的演示目录中尝试list dll工具,我们将继续使用前面记事本的例子——即我们从dependency walker中启动的那个进程。现在如果查看表中的路径名一列,我们可以获得包含驱动器符号、目录名和文件名在内的完整路径名,这正是我们在这个示例中试图达到的目的。让我们针对power point进行这个操作。

同样,这也显示了在windows 2000中进行基本的进程错误处理或分析时获取可执行文件以及动态链接库完整路径的重要性。

系统和进程活动的另一个角度是io操作。通常,一个服务器系统上的主要负载来源于由服务器应用程序产生的网络间或针对磁盘的io活动。因此,当系统看上去很忙并且磁盘在不停的旋转和震动时,你怎么才能确定io操作是针对哪个文件的以及是由哪个进程产生的呢?换句话说,在一个繁忙的系统上我们怎样才能追踪到io活动是遵循哪个进程、文件名或文件进行工作呢?好的,在nt 4中,象我们以前提到的那样,没有一种可以基于每个进程将io活动独立出来的方法。但是,在windows 2000中,加入了一些新的计数器从而使你能够基于每个进程观察单独的io活动。因此,在我们的第一个演示中,将使用性能监视器来查看这些新的计数器以便快速了解如何能够确定在windows 2000系统中哪个或哪些进程正在产生io操作。

我们将切换到命令行状态并从这里通过命令perfmon启动性能监视器。点击加入标记或添加计数器按钮,因为我们只对进程级的计数器感兴趣,所以选择进程对象,向下滚动列表会发现新添加的io计数器——每秒io数据字节数量和每秒io数据操作数量。

每秒io数据操作数量是读和(或)写组合操作的总数。虽然分别存在用于记录读操作和写操作的计数器,但是在这里,针对这一级别的分析,我们仅关心谁正在进行io操作而不在乎它是读操作还是写操作。现在我们选择每秒io数据操作数量。此外通过按住ctrl键同时选择每秒其他io操作数量。其他io操作代表那些不进行数据读写的io操作。例如,打开一个文件或读取一个诸如文件大小的文件属性。如果你想要看到由一个进程产生的所有io操作——包括数据操作和其他io操作,那么必须同时选中上述的两个计数器。接下来,我们要将选中的计数器插入到哪个进程中呢?答案是所有进程。因此单击实例列表框中的第一个进程。请记住,_total选项并不是一个进程。按住鼠标不放,拖动到列表框的底部以便选中所有进程,按添加按钮,之后按应用或关闭按钮。

现在我们正通过性能监视器的显示区域观察