本文中的代码不一定能适应所有种类的Windows系统

请自行测试后再做出结论,你可以在评论区留言



以下代码可能因操作系统版本不同导致差异,并不保证完美运行

代码内容

这是一个简单的示例:

@echo off
set "password=c61ab46721af26e11112e5e272e93d46"
:PassCheck
set /p "typestr=输入密码进行校验: "
echo.%typestr% > "%temp%\pass.iL"
for /f "delims=" %%a in (
'certutil -hashfile "%temp%\pass.iL" MD5 ^| findstr /v "[^^0-9a-z]"'
) do (
set "typemd5=%%a"
del /f /q "%temp%\pass.iL" 2>nul >nul
)
if "%typemd5%"=="%password%" (goto :next) else (call :PassCheckError)
goto :PassCheck

:PassCheckError
cls
echo 密码错误!
goto :eof

:next
cls
echo.继续你的其他命令
pause&exit

虽然批处理没有什么好的加密的办法,并且也很容易就被逆向,但如果你有需求的话可以试试

计算MD5值需要certutil工具,这个工具似乎从Win7开始就内置了,如果你不能使用,请留下一个评论

解析

其中,先设定代表密码的变量password的值为12345在.iL文件中的MD5值
然后进入循环:PassCheck,用户会被要求输入密码,输入的密码会被保存到变量%typestr%并存临时文件%temp%\pass.iL
接着使用certutil计算临时文件%temp%\pass.iL的MD5值,过滤后将结果保存到变量%typemd5%中并删除临时文件
然后与预设密码的哈希值进行比较,如果两者匹配,跳转到:next并继续执行其他命令
如果不匹配,调用:PassCheckError显示“密码错误!”的消息并回到最开始

样例

这是一个样例,使用mshta调用vbs内容生成弹窗并进行验证
以下内容截自我的一个很早之前的脚本中的片段
因为是一个不完整的片段,所以你需要自行添加上下文,不过你可以参考我的弹窗设计


:iLPassCheck
set typestr=
for /f "delims=" %%a in ('mshta vbscript:Execute("On Error Resume Next:Dim str,fso:str=InputBox(""输入Battroll的启动密码"",""Battroll_PassCheck"",""""):Set fso=CreateObject(""Scripting.FileSystemObject""):fso.GetStandardStream(1).Write str:Set fso=Nothing:close"^)') do (set "typestr=%%a")
if "%typestr%"=="" exit
echo.%typestr% > %here%\Pass.iL
for /f "delims=" %%a in ('certutil -hashfile "%here%\Pass.iL" MD5 ^| findstr /v "[^^0-9a-z]"') do (set "typemd5=%%a")
del /f /q Pass.iL>nul 2>nul
if %typemd5%==%iLPassword% (goto warn) else (call :iLPassCheckError)
goto iLPassCheck
:iLPassCheckError
mshta vbscript:msgbox("密码错误!",16,"Battroll_PassCheck")(window.close)
goto :eof

样图

battroll-passcheck

界面

battroll-passerror

错误界面