@echo off
SetLocal EnableExtensions EnabledelayedExpansion
mode con cols=150 lines=40
title WinLock Kill Utility ver. 0.2 alpha
Call :GetSystemVersion "OSVer" "Core" "Build"
Echo Your operating system: %OSVer% %Core% %Build%
Call :CheckPrivileges
::Stady 1
::Сравнение с эталоном и исправление неверных записей в системном реестре
::Stady 1.1
set param1.key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
set param1.name=shell
set param1.value=Explorer.exe
set param1.valueType=REG_SZ
Call :CheckNReplace_RegValue "%param1.key%" "%param1.name%" "%param1.value%" "%param1.valueType%"
::Stady 1.2
set param2.key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
set param2.name=userinit
set param2.value=C:\WINDOWS\system32\userinit.exe,
set param2.valueType=REG_SZ
Call :CheckNReplace_RegValue "%param2.key%" "%param2.name%" "%param2.value%" "%param2.valueType%"
::Stady 1.3
set param3.key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
set param3.name=UIHost
set param3.value=logonui.exe
set param3.valueType=REG_EXPAND_SZ
if "%OSVer%"==Windows 2000 Set Task_XP=true
if "%OSVer%"==Windows XP Set Task_XP=true
if "%OSVer%"==Windows 2003 Set Task_XP=true
if defined Task_XP (
if "%OSVer%"==Windows 2003 set SpecialFlag=true
rem //TODO: Сделать, чтобы тип параметра REG_SZ для этой системы при чтении являлся нормой
Call :CheckNReplace_RegValue "%param3.key%" "%param3.name%" "%param3.value%" "%param3.valueType%"
)
::Stady 2.1
::Сканирование реестра на схожие значения ключей и удаление с подтверждением
::Stady 2.2
::Сканирование системного диска на приложения, соответствующие фейковым значениям ключей и удаление с подтверждением
::Stady 3
::Проверка целостности некоторых системных файлов и их замена в случае обнаружения проблем
echo.
echo Scanning for system files integrity
sfc /Scanfile="%windir%\system32\userinit.exe"
sfc /Scanfile="%windir%\explorer.exe"
if defined Task_XP sfc /Scanfile="%windir%\system32\logonui.exe"
echo.
pause
goto :eof
:CheckNReplace_RegValue
:: %1.вх-Ключ реестра ... например: HKCU\Console
:: %2.вх-Имя параметра ... например: FaceName
:: %3.вх-Правильное значение параметра ... например: Lucida Console
:: %4.вх-Тип параметра. Если задано ключевое слово "default", будет использован тип, считанный с реестра
SetLocal
Echo.
call :Reg_Read "%~1" "%~2" "_value" "_value.type"
if %errorlevel% neq 0 Exit /B
::Проверяем соответствие значения
if /i "%_value%" neq "%~3" (
echo DAMAGED = %_value% in %~1 "%~2"
set _needReplace=true
) else (
echo Okay - %~1 "%~2"
)
::Проверяем соответствие типа параметра
if /i "%~4" neq "default" (
if /i "%_value.type%" neq "%~4" (
echo WRONG type = %_value.type% - %~1 "%~2"
set _needReplace=true
)
set _value.trueType=%~4
) else set _value.trueType=%_value.type%
::Переписываем ключ, сделав бекап
if Defined _needReplace (
Echo.
Echo ===^> ReWriting...
Echo Starting Backup to %~dp0
rem // TODO: Здесь будет бекап
Call :Reg_Write "%~1" "%~2" "%_value.trueType%" "%~3"
if !errorlevel!==0 echo New Value was set: %~3
)
EndLocal
Exit /B
:Reg_Read
:: %1-вх.Ключ
:: %2-вх.Имя параметра
:: %3-исх.Переменная для хранения значения
:: %4-исх.(опционально)-Переменная для хранения типа параметра
Reg.exe query "%~1" /v "%~2" 1>nul
if %errorlevel% neq 0 (
echo Error Code %errorlevel%: Reg_Read %~1 "%~2"
set %~3=& if "%~4" neq "" set %~4=
Exit /B %errorlevel%
)
For /f "tokens=2*" %%a In ('Reg.exe query "%~1" /v "%~2"^|Find "%~2"') do set "%~3=%%~b"& if "%~4" neq "" set "%~4=%%~a"
Exit /B 0
:Reg_Write
:: %1-вх.Ключ
:: %2-вх.Имя параметра
:: %3-вх.Тип параметра { REG_SZ, REG_BINARY, REG_DWORD, REG_QWORD, REG_MULTI_SZ, REG_EXPAND_SZ }
:: %4-вх.Значение
reg.exe add "%~1" /v "%~2" /t "%~3" /d "%~4" /f
(if %errorlevel%==0 (Exit /B 0) else (echo Error Code %errorlevel%: Reg_Write %~1 "%~2"& Exit /B %errorlevel%))
:GetSystemVersion
:: Определить версию ОС
:: %1-исх.Переменная для хранения названия ОС
:: %2-исх.Переменная для хранения разрядности ОС
:: %3-исх.Переменная для хранения версии сборки ОС
If /i "%PROCESSOR_ARCHITECTURE%"=="x86" (set %~2=x32) else (set %~2=x64)
For /F "delims=" %%a in ('ver') do set _ver=%%a
Set _ver="%_ver: =" "%"
For %%a in (%_ver%) do set _ver=%%~a
for /F "delims=]" %%a in ("%_ver%") do set %~3=%%a
set _ver=%_ver:~0,3%
SET %~1=Unknown
if "%_ver%"=="5.0" SET %~1=Windows 2000
if "%_ver%"=="5.1" SET %~1=Windows XP
if "%_ver%"=="5.2" SET %~1=Windows 2003
if "%_ver%"=="6.0" (
Reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "ProductName"|Find /i "Vista"&&(
SET %~1=Windows Vista) || (SET %~1=Windows 2008)
)
if "%_ver%"=="6.1" SET %~1=Windows 7
if "%_ver%"=="6.2" SET %~1=Windows 8
set _ver=
Exit /B
:CheckPrivileges
:: Проверка, запущена ли утилита с повышенными правами
sfc /? |>nul find /i "/scannow"&& set errorlevel=0
if %errorlevel% neq 0 (
echo.
echo You need elevated privileges in order to run all recover actions properly.
set /p "ch=Would you like to restart this utility now? (Y/N) "
if /i "!ch!"=="N" (Exit /B) else (
Echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"1","","runas",1 >"%~dp0Elevating.vbs"
cscript.exe //nologo "%~dp0Elevating.vbs" "%~dpnx0"
Exit
)
) else (if exist "%~dp0Elevating.vbs" del "%~dp0Elevating.vbs")
Exit /B