ntsd从2000开始就是系统自带的用户态调试工具。被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。使用ntsd自动就获得了debug权限,从而能杀掉大部分的进程。只有System、SMSS.EXE和CSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。ntsd会新开一个调试窗口,本来在纯命令行下无法控制,但如果只是简单的命令,比如退出(q),用-c参数从命令行传递就行了
【ntsd -c q -p pid】
如果能知道进程的pid,比如explorer.exe的pid为196,运行cmd后输入"ntsd -c q -p 136"即可杀掉
【ntsd -c q -pn 进程名】
只要知道了进程的名称,比如explorer.exe,运行cmd后输入"ntsd -c q -pn explorer.exe"即可杀掉
但是,如果同一个进程(比如iexplorer.exe)开了多个,就会出现错误
所以,ntsd 每次只能结束一个单独出现的进程
下面为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]
以下为翻译的帮助文件,仅供参考。需要源文件的,直接cmd下ntsd/?就可以了
【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同用
-d 只能在kernel(核心)debugger 可以用时才能使用
【-g】在debuggee下忽略初始化断点
【-G】忽略程序结束时的最终断点
【-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)
【-w】 指定在一个单独的VDM(DOS虚拟机)中debug 16位应用程序
【-x】 在AV排除项中设置第二个可选断点
-x{e|d|n|i} <event> 为指定的事件设置中断状态
【-2】 为debuggee创建一个单独核心的窗口