只要是XP的系统模块,文件的生产厂商必定是Microsoft Corporation(当然也出现过极少的例外),所以我可以通过判断文件的生产厂商来排除模块列表中的大部分,另外一些比较知名的厂商也加入了我的列表,比如Symantec Corporation、Adobe Systems Incorporated等。
set log=日志.txt
set bad=可疑.txt
del %log% >nul 2>nul
del %bad% >nul 2>nul
rem >nul是1>nul的简写,1=STD_OUT,2=STD_ERR
rem 1>nul表示把输出信息隐藏,2>nul表示把错误信息隐藏
rem 一般在for循环里需要使用重复赋值的变量时
rem 都需要在for循环外声明setlocal
rem 另外,这些重复赋值的变量在声明了setlocal后,就只能使用
rem 感叹号来引用了
setlocal enabledelayedexpansion
rem for的使用很复杂,skip表示忽略第一行,pv返回的内容第一行对我们是没意义的
rem tokens表示for变量的使用范围,这里指定pv返回内容的第一项赋值给%%i
rem 默认地,根据tokens的个数,for会自动把第二项赋值给%%j....
rem 注意|号需要转义
for /f "skip=1 tokens=1,2,3,4,*" %%i in ('pv.exe -s^|find /v ""') do (
rem %%i=模块名称 %%j=计数 %%k=基址 %%l=大小 %%m=文件路径
set mypname=%%i
set myfname=%%m
rem 下面获取进程文件的属性,WMIC的文件路径表示和windows不一样,\\和\的区别
rem 可以查看set命令的帮助,这里斜杠的转换很简单,但你无法直接在%%m里转换
set oo=%%m
set oo=!oo:\=\\!
rem 新手要格外注意这里单引号和双引号的是用
rem wmic外面的单引号是不能去掉的,这是for关键字要求的
rem 而wmic的name外面的双引号是必须的,name的值需要单引号
rem get指令的值如果包含空格则需要单引号
rem 最好要注意的就是,逗号需要转义
rem /format:csv.xsl表示输出的格式用csv格式,也就是逗号分隔各项
for /f "delims=, tokens=1,2,3,4,5" %%a in (
'wmic datafile where "name='!oo!'" get
"creation date"^,
lastmodified^,
manufacturer^,
version /format:csv.xsl'
) do (
set mycdate=%%b >nul
set mymdate=%%c >nul
set mymanu=%%d >nul
set myver=%%e >nul
set mycdate=!mycdate:~0,8!
set mymdate=!mymdate:~0,8!
)
rem ** 判断是否为可疑进程
rem 可疑进程判别规则:
if not "!mymanu!"=="Microsoft Corporation " (
if not "!mymanu!"=="Symantec Corporation " (
if not "!mymanu!"=="Adobe Systems Incorporated " (
rem 这里我会把模块拷贝出来并压缩
rem 因为是演示,我没有把压缩的写出来
rem copy !myfname! %baddir% >nul 2>nul
rem if not errorlevel 1 (
rem echo ** 可疑 ** 该文件已复制到 %baddir%>>%log%
rem ) else (
rem echo ** 可疑 ** 复制文件失败!!>>%log%
rem )
echo ** 可疑 ** >>%log%
rem **这段代码有一定的危险性,除非你确认病毒文件列表中的文件是可疑文件,
rem 否则不要尝试,一旦误删除正常文件,有可能会造成系统损坏或者应用软件损坏
rem 最好在测试之前做一个备份,夏克杀毒助手会预先备份
rem 但这里的代码没有备份的部分,你可以手动备份
rem 加载unlocker
call install.cmd
rem eol=;表示分号在这里是行注释符号,注释的行不被处理
for /f "eol=; tokens=*" %%i in (病毒文件列表.txt) do (
unlocker.exe "%%i" /D /S
rem echo*>的用法只能在批处理中,在cmd中不行
rem 它是用来生成一个空文件的
echo*>"%%i"
attrib +r +s +h "%%i"
)
rem 卸载unlocker
call uninstall.cmd