科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道ntsd--windows进程的终结

ntsd--windows进程的终结

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们经常会发现在任务管理器里有一些莫名其妙的进程无法终止;一些病毒进程终止不掉,病毒就永远无法杀干净。而ntsd可以帮助我们终止绝大多数顽固进程,当然像System、SMSS.EXE和CSRSS.EXE不能杀。

作者:zdnet安全频道 来源:论坛整理 2008年6月3日

关键字: 病毒 ntsd 进程

  • 评论
  • 分享微博
  • 分享邮件

ntsd--windows进程的终结者 ntsd.exe是win2k里的自带的进程调试工具,在system32目录下。
我们经常会发现在任务管理器里有一些莫名其妙的进程无法终止,因而不能卸载一些我们不需要的程序;一些病毒进程终止不掉,病毒就永远无法杀干净。而ntsd可以帮助我们终止绝大多数顽固进程,当然像System、SMSS.EXE和CSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。lsass.exe也不要杀掉,它是负责本地账户安全的。我们可以在CMD窗口下执行如下命令:
ntsd -c q -p {PID}
其中 “-c q”表示命令随被杀进程的退出而退出;“-p {PID}”指被杀进程ID,PID在任务管理器中可以查到。
ntsd的使用方法,可以直接运行这个文件(不带参数),得到帮助,只不过全是英文的。

xp下还有两个好东东tasklist和tskill。tasklist能列出所有的进程,和相应的信息。tskill能查杀进程,语法很简单:tskill程序名

应该有很多人知道windows 中ntsd 命令的应用,它是一个进程调试程序,我今天要讲的是它的很小一个应用——配合del命令手工对付顽固病毒文件。
我已经碰到过好几个这样的病毒:杀毒软件不能运行,病毒程序进程结束后马上又运行了,因为病毒程序还在,可能有其它的进程监视着它,每隔几秒检测进程,没有发现它就立刻运行这个病毒程序(这是理想的情况)或创建并运行它(这个就麻烦了),我下面会介绍一般情况下的解决方法。

关于ntsd的强制结束进程的命令前面一篇随笔(进程结束命令及应用)中已经介绍过了,这里简单提一下:
ntsd -c q -p pid  (pid 为进程标识号,在任务管理器中可以调出这一属性列)

ntsd -c q -pn ***.exe (***.exe 为进程名,exe不能省)

对于只有一个病毒进程的,找到病毒文件(看你的眼睛够不够亮了,可以通过它在注册表run中创建的键值判断它的位置,也可以通过查看[系统信息]-[软件环境]-[正在运行的任务]找到它的位置)。
然后我们要做的就是建立一个.bat或.cmd文件_它们都是可以直接在win32下运行的批处理文件,用notepad(记事本)建好了,输入内容:

ntsd -c q -p 病毒程序的pid
del 病毒程序的完整路径

例如:已确认c:\windows下的services.exe为病毒程序,并且进程号pid为2233(推荐使用PID结束进程,因为有的病毒名和系统进程名相同,用ntsd -c q -pn会出错),应输入内容为:

ntsd -c q -p 2233
del /a/f c:\windows\services.exe

保存文本为.bat或.cmd文件,双击运行即可。
一般情况下病毒文件都是隐藏属性的,所以del要加/a,有的还有只读属性所以加/f.

因为是批处理文件,后面可以追加类似命令(如果有多个病毒文件的话):
ntsd -c q -p 病毒程序的pid1
del 病毒程序的完整路径1
ntsd -c q -p 病毒程序的pid 2
del 病毒程序的完整路径2
..
..
..

一般可以解决问题,但还是要用更新病毒库后的杀毒软件复查(如果这个时候查毒软件可用了的话,否则只能把硬盘挂到别人的机子上查杀或DOS下查杀或——重装了)。
 
 

使用调试程序

使用 NTSD

NTSD 调试程序在启动时要求用户指定一个要连接的进程。使用 TLIST 或 PVIEWER,您可以获得某个现有进程的进程 ID,然后键入 NTSD -p pid 来调试这个进程。NTSD 命令行使用如下的句法:

NTSD [options] imagefile

其中,imagefile 是要调试的映像名称,options 是下面选项之一:

表 1. NTSD 映像文件选项

选项 说明
-2 打开一个用于调试字符模式的应用程序的新窗口
-d 将输出重定向到调试终端
-g 使执行自动通过第一个断点
-G 使 NTSD 在子程序终止时立即退出
o 启用多个进程的调试,默认值为由调试程序衍生的一个进程
-p 指定调试由进程 ID 标识的进程
-v 产生详细的输出


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

NTSD -p 104

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

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

表 2. 常用命令

命令 含义
~ 显示所有线程的一个列表
KB 显示当前线程的堆栈轨迹
~*KB 显示所有线程的堆栈轨迹
R 显示当前帧的寄存器输出
U 反汇编代码并显示过程名和偏移量
D[type][] 转储内存
BP[#]

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

 

 

杀进程很容易,随便找个工具都行(IceSword),关键是找到这个进程的启动方式,不然下次重启它又出来了。但是有些陌生进程,用任务管理器又不能结束掉,一般的任务察看软件也无法杀掉,这该怎么办呢?其实用Windows自带的工具就能杀大部分进程:这里我教你两招,保证能结束掉陌生进程。

方法一:用tasklist(列出所有的进程及相应的信息)和taskkill(结束掉顽固进程)命令
            Windows XP的任务管理器,大家一定不会陌生,利用它就可以查看到本机完整的进程列表,可以通过手工定制进程列表的方式获的更多的进程信息(会话ID、用户名等),但查看不到进程提供的系统服务,用 tasklist 命令能实现上面的功能。“Tasklist”命令是一个用来显示运行在本地或远程计算机上的所有进程的命令行工具,带有多个执行参数。

使用格式为:
TASKLIST [/S system [/U username [/P [password]]]]
             [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
描述:
        这个命令行工具显示应用程序和本地
        或远程系统上运行的相关任务/进程的
        列表。
参数列表:
       /S         system               指定连接到的远程系统。
       /U         [domain\]user        指定应该在哪个用户上下文执行这个命令。
       /P         [password]           为提供的用户上下文指定密码。如果忽略,提示输入。
       /M         [module]             列出所有其中符合指定模式名的 DLL 模块的所有任务。如果没有指定模块名,则显示每个任务加载的所有模块。
       /SVC                        显示每个进程中的服务。
       /V                          指定要显示详述信息。
       /FI        filter               显示一系列符合筛选器指定的标准的任务。
       /FO        format               指定输出格式,有效值: "TABLE"、"LIST"、"CSV"。
       /NH                         指定栏标头不应该在输出中显示。只对 "TABLE" 和 "CSV" 格式有效。
       /?                          显示帮助/用法。
筛选器:
        筛选器名                                 有效操作符                                有效值
        -----------                               ---------------                               --------------
        STATUS                               eq, ne                                     正在运行 | 没有响应
        IMAGENAME                        eq, ne                                      图像名
        PID                                       eq, ne, gt, lt, ge, le                  PID 值
        SESSION                              eq, ne, gt, lt, ge, le                  会话编号
        SESSIONNAME                    eq, ne                                      会话名
        CPUTIME                             eq, ne, gt, lt, ge, le                   CPU 时间,格式为
                                                    hh:mm:ss。
                                                    hh - 时,
                                                    mm - 分,ss - 秒
        MEMUSAGE                         eq, ne, gt, lt, ge, le                   内存使用量(KB)
        USERNAME                          eq, ne                                      用户名,格式为 [domain\]user
        SERVICES                           eq, ne                                      服务名
        WINDOWTITLE                    eq, ne                                      窗口标题
        MODULES                           eq, ne                                      DLL 名

例如:
        TASKLIST
        TASKLIST /M
        TASKLIST /V
        TASKLIST /SVC
        TASKLIST /M wbem*
        TASKLIST /S system /FO LIST
        TASKLIST /S system /U domain\username /FO CSV /NH
        TASKLIST /S system /U username /P password /FO TABLE /NH
        TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"

★      使用“Tasklist”命令查看本机进程
在命令提示符窗口中输入:tasklist,就显示本机的所有进程。显示结果由五部分组成:图像名(进程名)、PID、会话名、会话#、内存使用。
★       查看远程系统的进程
在命令提示符下输入:tasklist      /s      IP      /u      username      /p      password   
其中/s参数后的 IP 指要查看的远程系统的IP地址,/u后的 username 指 tasklist 命令使用的用户帐号,它是远程系统上的一个合法帐号,/p后的“password”指username帐号的密码。通过上面的命令,我们就可以查看到远程系统的进程了。
提示:使用tasklist命令查看远程系统的进程时,需要远程机器的RPC 服务器的支持,否则,该命令就不能正常使用。
★       查看系统进程提供的服务
tasklist命令不但可以查看系统进程,而且还可以查看每个进程提供的服务。
如查看本机的进程“SVCHOST.EXE”提供的服务,在命令提示符下输入:tasklist      /svc,发现有四个“SVCHOST.EXE”进程,有二十几项服务使用这个进程;对于远程系统来说,查看系统服务使用 tasklist      /s      IP      /u      username      /p      password      /svc就可以查看IP地址为“IP”的远程系统进程所提供的服务。
★       查看调用DLL模块文件的进程列表
在命令提示符下输入:    tasklist      /m      shell32.dll可以查看本地系统中哪些进程调用了shell32.dll DLL模块文件,这时系统将显示调用进程列表。
★       使用筛选器查找指定的进程
在命令提示符下输入:TASKLIST    /FI    "USERNAME ne NT AUTHORITY\SYSTEM"    /FI "STATUS eq running",这样就列出了系统中正在运行的非“SYSTEM“状态的所有进程,其中“/FI“为筛选器参数,” ne“和”eq“为关系运算符”不相等“和”相等“。
        taskkill命令,顾名思义,它是用来杀死进程的。如要杀死本机的“notepad.exe”进程,首先使用Tasklist查找它的PID,系统显示“notepad.exe”进程的PID值为“1132“,然后输入taskkill      /pid 1132或者输入 taskkill      /IM      notepad.exe即可,其中“ /pid ”后面跟要终止进程的PID值,“/IM”后面为进程的图像名。

如果用上面的方法仍然结束不了,那么就试试下面的这个杀手锏吧!
方法二:用ntsd命令
ntsd -c q -p PID
  把最后那个PID,改成你要终止的进程的ID。如果你不知道进程的ID,可以通过以下方法查看:任务管理器-—>进程选项卡-—>查看-—>选择列-—>勾上"PID(进程标识符)",同样也可以使用tasklist查看。更多的使用方法可以在命令提示符状态下输入ntsd /?查看。
         使用ntsd命令除了不能杀掉System、SMSS.EXE 和 CSRSS.EXE进程外,其他的都可以结束掉。前两个进程是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。ntsd从WIN 2K开始就是系统自带的用户态调试工具,被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。使用ntsd自动就获得了debug权限,从而能杀掉大部分的进程。ntsd会新开一个调试窗口,本来在纯命令行下无法控制,但如果只是简单的命令(退出(q)),用-c参数从命令行传递就行了。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章