[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 是否可以用批处理终止指定路径的进程

目前被一个病毒所困扰,想用批处理去解决他,问题是这样的:

这个病毒与系统的正常进程lsass.exe同名,这样如果在批处理中写入taskkill lsass.exe,那么正常进程也杀掉了,怎么才能选择性的结束同名的进程呢?

我有一个思路,不知可行不可行,请大家指正

1.用一个命令列出符合要求的进程(符合病毒路径),同时获取此进程的PID,将此PID写入一个txt
2.用一个命令获取txt中病毒进程的PID,并终止此pid

大家一定要帮帮我!用什么命令行工具,如何写代码,或有更好的思路

怎样才是 符合病毒路径呢?  若是知道病毒路径,你直接删除它不就可以了么?
我想你那个系统的进程路径应该是绝对的吧,
不知道wmic可不可以通过进程名来获取路径。。。

[ 本帖最后由 随风 于 2008-3-25 16:49 编辑 ]
技术问题请到论坛发帖求助!

TOP

谢谢随风回帖
病毒路径是之前测试得知的,在进程管理器里面无法直接结束病毒进程,所以知道路径也无法直接删除文件,何况文件被隐藏,并且系统隐藏显示设置被锁定。
另外,做此批处理的一个目的是,批量简单的处理此病毒,而不是单台机器手动处理 ,举个例子:
c:
attrib /s  -s -h -r  lsass.exe    //去除文件属性
pskill lsass.exe                      //结束病毒进程(问题出在这里,这么写的话,结束的不仅仅是病毒进程,因为没有指明路径,把系统进程也结束了)
del /s lsass.exe                    //删除病毒文件

另外我知道好像不能直接结束指定路径的进程,那么换种思路。获取指定进程的pid是不成问题的,在获取的pid的同时获取进程的路径也不成问题,MT.EXE可以做到。但是获取之后如何比较两个进程路径的不同,然后提取病毒文件所在路径的进程的pid,再用PSKILL去结束此PID就ok了,那么思路如下
C:
attrib /s  -s -h -r  lsass.exe //去除文件属性
MT -pllist >l.txt                    //获取所有进程信息,包括路径和PID写入l.txt
????????                          //将l.txt中进程名为lsass.exe并且路径为%windir%\system32\com的pid提取到一个p.txt文件
Pskill pid                            //用pskill结束p.txt 中的pid


随风看看这样是否可行,指导一下,谢谢

TOP

我没看你的第二个回帖,不好意思,我现在去试一下

TOP

随风,我按你的去做了后,发现他会试图结束两个进程

TOP

谢谢楼上,那么如果我就要结束%windir%\system\com\smss.exe这个进程,但是不想结束正常的SMSS.exe呢

TOP

谢谢kclmx,但是出了个错误:

此时不应有 takens=*"。
请按任意键继续. . .

TOP

回复 10楼 的帖子

此时不应有 takens=*"。
是因为楼上匆忙中写错了,应该是  tokens=*
你再试试 3 楼的代码,已作更改。。

[ 本帖最后由 随风 于 2008-3-25 18:29 编辑 ]
技术问题请到论坛发帖求助!

TOP

现在还出了一个问题,不知道怎么回事

TOP

回KCLMX

还是不行

能不能同时获取smss的路径和pid写入文本,比较文本的第一行和第二行内容取指定内容的行,提取PID赋值,再用结束进程的命令或工具结束pid呢

TOP

回KCLMX

非常感谢你的耐心回答。

首先我现在测试的不是真的病毒环境。
我将一个正常程序改名为smss.exe,再运行它。这样系统中有两个smss.exe,然后运行你给的那个bat,结果显示:无可用范例。

我不知道是不是结束不了还是错误。关于IceSword,不是不想用,而是他已经被病毒禁掉了,大部分安全工具都被禁用了,何况我想批量的解决问题。针对这个病毒而言,用批处理要做的东西很多,比如修复注册表,修复安全模式,卸载dll等,现在唯一出问题的就是如何有针对性的结束同名的进程。

另外命令结束进程工具比较强的是PSKILL,你是否可以把此工具应用到上述BAT呢。
PsKill的命令格式  PsKill pid or name

如何可以,我想是能不能加MSN或QQ聊聊,再次感谢

TOP

高调感谢Kclmx,帮助我解决此问题,现将代码放出

@echo off
setlocal enabledelayedexpansion
set "str=wmic process where caption="smss.exe" get ExecutablePath^,Handle"
for /f "skip=1 tokens=*" %%i in ('!str!') do (
  for /f "tokens=1-2" %%a in ("%%i") do (
    if /i not "%%a"=="!systemroot!\system32\smss.exe" (call pskill %%b)
  )
)
pause

注:PsKill为结束进程工具

TOP

单条wmic命令不需要for 的
杀死除C:\WINDOWS\system32\lsass.exe以外的进程
wmic process where "name='lsass.exe' and ExecutablePath<>'C:\\WINDOWS\\system32\\lsass.exe'" call Terminate

杀死绝对路径C:\WINDOWS\system32\com\lsass.exe的进程
wmic process where "name='lsass.exe' and ExecutablePath='C:\\WINDOWS\\system32\\com\\lsass.exe'" call Terminate

[ 本帖最后由 fastslz 于 2008-3-26 12:55 编辑 ]

TOP

原帖由 fastslz 于 2008-3-26 12:50 发表
单条wmic命令不需要for 的
杀死除C:\WINDOWS\system32\lsass.exe以外的进程
wmic process where "name='lsass.exe' and ExecutablePath'C:\\WINDOWS\\system32\\lsass.exe'" call Terminate

杀死绝对路径C:\WIN ...

-----------------------------------------------------------------------------------------------------------------

谢谢。但是这样是不能终止进程了,我试过了。如果调用PSKILL的话,需给出pid

TOP

大神们有没有这方面的教程

TOP

返回列表