您的位置:首页 > 其它

Windows 系统debug级 进程调试工具 ntsd 详解

2012-09-09 13:30 405 查看
     ntsd从Windows 2000开始就是系统自带的进程调试工具,在system32目录下。NTSD的功能非常的强大,用法也比较复杂,但如果只用来结束一些进程,那就比较简单了。在Windows中只有System、SMSS.EXE和CSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。lsass.exe也不要杀掉,它是负责本地账户安全的。被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。

打开cmd 后输入以下命令就可以结束进程:

方法一:利用进程的PID结束进程

命令格式:ntsd -c q -p pid

命令范例: ntsd -c q -p 1332 (结束explorer.exe进程)

范例详解:explorer.exe的pid为1332,但是如何获取进程的pid呢?在CMD下输入TASKLIST就可以获取当前任务管理器所有进程的PID。或者打开任务管理器,在菜单栏,选择“查看”—“选择列”,在打开的选择项窗口中将“PID(进程标识符)”项选择钩上,这样任务管理器的进程中就会多出PID一项了。

(PID的分配并不固定,是在进程启动是由系统随机分配的,所以进程每次启动的进程一般都不会一样。)

方法二:利用进程名结束进程

命令格式:ntsd -c q -pn ***.exe (***.exe 为进程名,exe不能省)

命令范例:ntsd -c q -pn explorer.exe

如果同一个进程(比如iexplorer.exe)开了多个,就会出现错误 所以,ntsd 每次只能结束一个单独出现的进程。

-c   表示执行debug命令

q   表示执行结束后退出(quit)

-p   表示后面紧跟着是你要结束的进程对应的PID

-pn 表示后面紧跟着是你要结束的进程名

另外的能结束进程的DOS命令还有taskkill和tskill命令:

命令格式: taskkill /pid 1234 /f ( 也可以达到同样的效果。)

有一些高等级的进程,tskill和taskkill也可能无法结束,这时就得使用系统debug级的ntsd.准确的说,ntsd是一个系统调试工具,只提供给系统开发级的管理员使用,但是对我们杀掉进程还是很爽的.基本上除了WINDOWS系统自己的管理进程,ntsd都可以杀掉。

当然,有些rootkit级别的超级木马,还是无能为力,幸好这种牛牛级别的木马还是很少的。

键入 NTSD -p pid 来调试这个进程。NTSD 命令行使用如下的句法:

NTSD [options] imagefile

其中,imagefile 是要调试的映像名称,options 是选项参数;以下为ntsd的用法和帮助:

ntsd

usage: ntsd [-?] [-2] [-d] [-g] [-G] [-myob] [-lines] [-n] [-o] [-s] [-v] [-w]

[-r BreakErrorLevel] [-t PrintErrorLevel]

[-hd] [-pd] [-pe] [-pt #] [-pv] [-x | -x{e|d|n|i} <event>]

[-- | -p pid | -pn name | command-line | -z CrashDmpFile]

[-zp CrashPageFile] [-premote transport] [-robp]

[-aDllName] [-c "command"] [-i ImagePath] [-y SymbolsPath]

[-clines #] [-srcpath SourcePath] [-QR \\machine] [-wake <pid>]

[-remote transport:server=name,portid] [-server transport:portid]

[-ses] [-sfce] [-sicv] [-snul] [-noio] [-failinc] [-noshell]

【command-line】 在dubugger模式下运行

【--】 默认为执行【-G -g -o -p -1 -d -pd】参数

【-aDllName】设置默认的扩展dll

【-c】执行后面的dubugger命令

【-clines】 number of lines of output history retrieved by a remote client

【-failinc】失败时产生不完全的符号和模型

【-d】 通过DbgPrint向kernel(核心)发送debugger输出信息,并重定向到调试终端

注: -d 不可与debugger remoting同用,只能在kernel(核心)debugger 可以用时才能使用

【-g】在debuggee下忽略初始化断点,使执行自动通过第一个断点

【-G】忽略程序结束时的最终断点,使NTSD 在子程序终止时立即退出;

【-hd】规定debug命令集不能用于(dubuggee)创建的程序。该参数只能作用在Windows Whistler(windows xp的测试版本)系统上

【-o】 debug所有由debuggee载入的程序,启用多个进程的调试,默认值为由调试程序衍生的一个进程

【-p pid】指定要绑定的进程的十进制ID(就是pid)

【-pd】 指定debugger自动与绑定的程序分离

【-pe】 规定任何绑定都要对应一个存在的debug端口

【-pt #】指定中断超时时间

【-pv】 指定任何绑定都是封闭的,不对外共享

【-r】 指定0-3等级的中断(SeeSetErrorLevel)

【-robp】允许在只读内存中设置断点

【-t】 指定显示0-3级的错误(SeeSetErrorLevel)

【-v】 产生详细的输出

【-w】 指定在一个单独的VDM(DOS虚拟机)中debug 16位应用程序

【-x】 在AV排除项中设置第二个可选断点

-x{e|d|n|i} <event> 为指定的事件设置中断状态

【-2】 为debuggee创建一个单独核心的窗口,用于调试字符模式的应用程序;

例如:假设inetinfo.exe的进程ID为104。键入以下命令将 NTSD 调试程序连接到 inetinfo 进程 (IIS) “NTSD -p 104 ”

也可使用 NTSD 启动一个新进程来进行调试。“NTSD notepad.exe ”将启动一个新notepad.exe 进程,并与它建立连接。

一旦连接到某个进程,您就可以用各种命令来查看堆栈、设置断点、转储内存,等等。

~显示所有线程的一个列表KB 显示当前线程的堆栈轨迹

~*KB显示所有线程的堆栈轨迹

R显示当前帧的寄存器输出

U反汇编代码并显示过程名和偏移量

D[type][< range>]转储内存BP[#]

设置断点BC[ ]清除一个或多个断点BD[]禁用一个或多个断点BE[< bp>]启用一个或多个断点BL[ ]列出一个或多个断点

有一个非常重要的参数就是-v参数,我们可以通过它发现一个进程下面挂接了哪些连接库文件.有很多病毒,木马,或者恶意软件,都喜欢把自己做成动态库,然后注册到系统正常程序的加载库列表中,达到隐藏自己的目的.

首先我们需要设置一下ntsd的输出重定向,最好是重定向到一个文本文件,方便我们分析研究.

c:\>set _NT_DEBUG_LOG_FILE_APPEND=c:\pdw.txt

注意,虽然输出重定向了,但是我们的输出依然会继续显示在屏幕上,而且会进入到debug模式,我们使用-c q参数,就可以避免这个问题.

c:\>ntsd -c q -v notepad.exe

现在我们的pdw.txt文件中,就可以看见notepad.exe文件的调试信息.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息