:ChooseFunction
title %TT%-选择功能
cls
echo.&echo.
echo 本程序具有两大功能:获取染毒文件列表和修复染毒文件。
echo.
echo 若您仅需获取染毒文件列表,可以选择直接显示在当前屏幕上,或是保存到相应
echo 的文本文件中,以方便您掌握SOLA病毒感染情况,从而有利于您做出合适的后续选择。
echo.
echo 修复染毒文件支持两种方式:通过直接扫描硬盘上的文件获取染毒文件列表,或
echo 是读取上一次保存的染毒文件列表。修复时也可以选择是否保存染毒文件列表。
echo.
echo 请选择您需要的功能。
echo.&echo.
echo 1 仅获取染毒文件列表
echo.
echo 2 修复染毒文件
echo.&echo.&echo.
set Mode=
set /p Mode= 请选择功能(1/2):
if not defined Mode goto Main
if /i "%Mode%"=="1" goto ScanVirus
if /i "%Mode%"=="2" goto ScanVirus
goto Main
:ScanVirus
cls
title %TT%-扫描病毒
set "ScanRoute=%cd%"
echo.&echo.
echo 请输入要扫描的路径,或是把要处理的文件夹直接拖曳到本窗口中,程序将扫描
echo 指定路径及其所有子目录下的所有染毒文件。
echo.
echo 直接回车将扫描当前目录及其所有子目录。
echo.&echo.
set /p ScanRoute= 请输入需要扫描的路径:
set "ScanRoute=%ScanRoute:"=%"
if /i "%Mode%"=="2" (
findstr /ic:"扫描项目:Sola病毒染毒文件扫描" "%ScanRoute%">nul 2>nul&&goto RepairFromList
)
set OutPut=
set /p OutPut= 是否导出染毒文件列表(Y=是 其他键=否):
if /i "%OutPut%"=="y" (
set OutPut=染毒文件列表.txt
) else set OutPut=
if defined OutPut (
echo 请在下面指定保存路径(支持文件夹拖曳,直接回车将保存在当前目录下)
set "SaveRoute=%cd%"
set /p SaveRoute=
if defined SaveRoute call set "SaveRoute=%%SaveRoute:"=%%"
call md "%%SaveRoute%%" 2>nul
call set "Output=%%SaveRoute%%.\%OutPut%"
(
echo 扫描项目:Sola病毒染毒文件扫描
echo 扫描时间:%date% %time%
echo 扫描目录(含子目录): "%ScanRoute%"
echo -------------------------------------------------------
echo.
)>"%OutPut%"
set OutPut=^>^>"%OutPut%"
)
if /i "%Mode%"=="2" goto RepairFiles
:ChooseScanMode
cls
title %TT%-选择扫描模式
for /f "delims==" %%i in ('set num_ 2^>nul') do set %%i=0
echo.&echo.
echo 本工具提供了三种扫描模式,分别应对不同的情况,请视情况选择最适合的扫描
echo 模式。
echo.
echo 最快模式:只验证exe压缩包中是否存在Function.dll,速度最快,精确度较低
echo ,并且导出的染毒文件列表不能按照原始文件类型进行统计,但是能适应文件中毒后
echo 只改文件名不改后缀名的情况。
echo.
echo 快速模式:只验exe证压缩包中是否存在与exe文件同名的doc、jpg、txt或com文
echo 件,速度较快,精度较高,导出的染毒文件列表能按照原始文件类型进行统计,但是
echo 不能适应文件中毒后改名的情况。
echo.
echo 精确模式:同时验证exe压缩包中是否存在Function.dll文件、是否存在与exe文
echo 件同名的doc、jpg、txt或com文件,精确度极高,速度较慢,导出的染毒文件列表能
echo 按照原始文件类型进行统计,但是不能适应文件中毒后改名的情形。
echo.
echo 1、最快模式
echo.
echo 2、快速模式
echo.
echo 3、精确模式
echo.
set ScanMode=
set /p ScanMode= 请选择扫描模式(1/2/3):
if not defined ScanMode goto ChooseScanMode
if "%ScanMode%"=="1" goto ScanQuickly1
if "%ScanMode%"=="2" goto ScanQuickly2
if "%ScanMode%"=="3" goto ScanExactly
goto ScanMode
:ScanQuickly1
:: 快速扫描并列出所有被感染文件的路径
:: 只验证压缩包中是否存在Function.dll,最快速,最不精确,不能按照文件类型进行统计,
:: 但是能适应文件中毒后只改文件名不改后缀名的情况
cls
title %TT%-最快扫描模式
echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 正在扫描以下目录及其所有子目录,请耐心等待...
echo.
echo "%ScanRoute%"
echo.
set num=0
for /f "delims=" %%i in ('dir /a-d /b /s "%ScanRoute%.\*.exe"') do (
title 正在扫描"%%i"
for /f "delims=" %%j in ('rar lb "%%i"^|findstr /beic:"Function.dll"') do (
set /a num+=1
call echo .exe| "%%i"%OutPut%
)
)
(
echo.
echo -------------------------------------------------------
echo 被感染的文件总计 %num% 个
)%OutPut%
goto End
:ScanQuickly2
:: 快速扫描并按照文件类型列出所有被感染文件的路径
:: 只验证压缩包中是否存在与exe文件同名的.doc、.jpg、.txt或.com文件,不够精确,不能
:: 适应文件中毒后改名的情形
:: 因为文件名中可能存在空格,所以,findstr不能精确匹配首尾
cls
title %TT%-快速扫描模式
echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 正在扫描以下目录及其所有子目录,请耐心等待...
echo.
echo "%ScanRoute%"
echo.
for /f "delims=" %%i in ('dir /a-d /b /s "%ScanRoute%.\*.exe"') do (
title 正在扫描"%%i"
set type=
for /f "delims=" %%j in ('rar lb "%%i"^|findstr /ei "\.doc \.jpg \.txt \.com"') do (
if /i "%%~ni"=="%%~nj" (
set /a num_%%~xj+=1
set type=%%~xj
call echo %%type%%| "%%i"%OutPut%
)
)
)
goto Count
:ScanExactly
:: 用最精确的方法判断染毒文件,并按照文件类型列出所有被感染文件的路径
:: 先验证压缩包中是否存在Function.dll文件,再验证压缩包中是否存在与exe文件同名的doc
:: jpg、txt或com文件,比较精确,不能适应文件中毒后改名的情形
:: 因为文件名中可能存在空格,所以,不能用findstr /be同时匹配首尾
cls
title %TT%-精确扫描模式
echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 正在扫描以下目录及其所有子目录,请耐心等待...
echo.
echo "%ScanRoute%"
echo.
for /f "delims=" %%i in ('dir /a-d /b /s "%ScanRoute%.\*.exe"') do (
title 正在扫描"%%i"
for /f "delims=" %%j in ('rar lb "%%i"^|findstr /beic:"Function.dll"') do (
set type=
for /f "delims=" %%k in ('rar lb "%%i"^|findstr /ei "\.doc \.jpg \.txt \.com"') do (
if /i "%%~ni"=="%%~nk" (
set /a num_%%~xk+=1
set type=%%~xk
call echo %%type%%| "%%i"%OutPut%
)
)
)
)
:Count
set Total=0
(
echo.
echo -------------------------------------------------------
)%OutPut%
for /f "tokens=2,3 delims=_=" %%i in ('set num_ 2^>nul') do (
echo 被感染的%%i文件 %%j 个%OutPut%
set /a Total+=%%j
)
echo 被感染的文件总计 %Total% 个%OutPut%
:: 按类型罗列被感染文件
if defined OutPut (
cls
echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 正在按照文件类型整理被感染的文件,请稍候...
for %%i in (doc jpg txt com) do (
(
echo 扫描项目:Sola病毒染毒文件扫描(仅.%%i格式)
echo 扫描时间:%date% %time%
echo 扫描目录(含子目录): "%ScanRoute%"
echo -------------------------------------------------------
echo.
)>.%%i格式染毒文件列表.txt
)
for /f "tokens=1* delims=| " %%i in ('findstr /b "\." "%OutPut:~3,-1%"') do (
echo %%i| "%%~fj">>"%SaveRoute%.\%%~xi格式染毒文件列表.txt"
)
for /f "tokens=2,3 delims=_=" %%j in ('set num_ 2^>nul') do (
(
echo.
echo -------------------------------------------------------
echo 被感染的%%j文件总计 %%k 个
)>>"%SaveRoute%.\%%j格式染毒文件列表.txt"
)
)
:End
echo.
echo 按任意键退出...
pause>nul
exit
:RepairFiles
:: 恢复染毒文件
:: 先探测哪些是染毒文件,然后从染毒文件中解压出原始文件,并把染毒文件加上.rar后缀名做备份
:: 并去掉原始文件可能存在的各种属性
:: 若原始文件是exe,还需要把解压出来的com改名为exe
:: 因为病毒作者提取文件名的时候,把第一个点号之前的字符串认为是完整的文件名
:: 因此,当文件名中含有多个点号的时候,恢复出来的文件名只保留第一个点号之前的字符串
findstr /ic:"扫描项目:Sola病毒染毒文件扫描" "%ScanRoute%">nul 2>nul&&goto RepairFromList
:: 通过扫描染毒文件来确定要修复的文件
:: 为了能适应扫描大量文件对速度的要求,同时也为了适应中毒后手工修改文件名的极端情况
:: 按照最快扫描模式判断染毒文件
cls
title %TT%-通过扫描染毒文件确定要修复的文件
echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 正在修复以下目录及其所有子目录中的染毒文件,请耐心等待...
echo.
echo "%ScanRoute%"
echo.
for /f "delims=" %%i in ('dir /a-d /b /s "%ScanRoute%.\*.exe"') do (
for /f "delims=" %%j in ('rar lb "%%i"^|findstr /beic:"Function.dll"') do (
echo .exe| "%%i"%OutPut%
rar e -c- -idq "%%i" "%%~dpi" n "%%~ni.*"&&(
ren "%%i" "%%~nxi.rar"
attrib -s -h -r "%%~dpni.*"
ren "%%~dpni.com" "*.exe" 2>nul
)
)
)
echo.
echo 按任意键退出...
pause>nul
exit
:RepairFromList
:: 从染毒文件列表中获取要修复的文件
:: 以点号打头的行为文件路径所在的行
cls
title %TT%-从染毒文件列表获取要修复的文件
echo.&echo.&echo.&echo.&echo.&echo.&echo.
echo 正在修复以下文件中所列出的染毒文件,请耐心等待...
echo.
echo "%ScanRoute%"
echo.
for /f "tokens=1* delims=| " %%i in ('findstr /b "\." "%ScanRoute%"') do (
echo 正在处理 %%j
rar e -c- -idq %%j "%%~dpj" n "%%~nj.*"&&(
ren %%j "%%~nxj.rar"
attrib -s -h -r "%%~dpnj.*"
ren "%%~dpnj.com" "*.exe" 2>nul
)
)
echo.
echo 按任意键退出...
pause>nul
exit
[/code]