关于这个话题再多说一句话。
无法避免其他人有权访问您的批处理文件;但是,如果您想避免其他人可以查看批处理文件内容(因此他们不能修改其中的任何部分),那么有几种方法可以做到这一点,包括将文件转换为 .exe 格式,尽管这些方法中没有一种可以完全保护确定的用户。
这里的重点是使用对您来说足够简单的方法,因此您可以毫无问题地实施它,但对其他人来说足够复杂,因此它会阻止您的用户尝试破坏它。我提出了一个基于 JScript 源程序的 Encode 过程的解决方案,这种方法不是广为人知的方法,因此它甚至可以针对没有适当信息的高级用户提供保护。这里是:
@if (@CodeSection == @Batch) @then
@echo off
setlocal DisableDelayedExpansion
REM Obfuscate.bat: Obfuscate Batch files
REM Antonio Perez Ayala
if "%~1" equ "" echo Usage: Obfuscate filename.bat & goto :EOF
if not exist "%~1" echo File not found: "%~1" & goto :EOF
set "at=@"
set "pass=%random%"
(
echo %at%if (@Pass == @X%pass%^) @begin
echo @echo off
echo CScript //nologo //E:JScript.Encode "%%~F0" ^> %pass%.bat
echo call %pass%
echo del %pass%.bat
echo exit /B
echo %at%end
echo //**Start Encode**
echo var a = new Array(^);
set "i=0"
for /F "usebackq delims=" %%a in ("%~1") do (
set /A i+=1
set "line=%%a"
setlocal EnableDelayedExpansion
echo a[!i!] = '!line:'=\x27!';
endlocal
)
setlocal EnableDelayedExpansion
echo for ( var i=1; i^<=!i!; ++i ^) WScript.Stdout.WriteLine(a[i]^);
) > "%~N1.tmp"
CScript //nologo //E:JScript "%~F0" "%~N1.tmp"
del "%~N1.tmp"
goto :EOF
@end
// Encode a JScript source file
// Antonio Perez Ayala
var fileToEncode = WScript.Arguments(0);
// Read the source file
var oFSO = WScript.CreateObject("Scripting.FileSystemObject");
var oFile = oFSO.GetFile(fileToEncode);
var oStream = oFile.OpenAsTextStream(1);
var sSourceFile = oStream.ReadAll();
oStream.Close();
// Encode the file
var oEncoder = WScript.CreateObject("Scripting.Encoder");
var sDest = oEncoder.EncodeScriptFile(".js",sSourceFile,0,"")
// Write the encoded version
var sFileOut = fileToEncode.slice(0,-3)+"obf.bat";
var oEncFile = oFSO.CreateTextFile(sFileOut);
oEncFile.Write(sDest);
oEncFile.Close();
将此程序复制为 Obfuscate.bat 并使用它在参数中提供您的批处理文件;之后,将创建一个扩展名为 .obf.bat 的新文件,该文件的工作方式与原始文件相同,但其内容以不可读的方式编码。例如:
C:\> type test.bat
@echo off
echo Hello World
C:\> Obfuscate test.bat
C:\> type test.obf.bat
@if (@Pass == @X20203) @begin
@echo off
CScript //nologo //E:JScript.Encode "%~F0" > 20203.bat
call 20203
del 20203.bat
exit /B
@end
//**Start Encode**#@~^kQAAAA==@#@&\CMPmP',x⌂APzD.lH`bI@#@&l]qT,'PE@$nm4W,WW0vI@#
@&C$yDP{Pvn1tW~u⌂VsW, KDs9Bp@#@&6WM~`,\CD,kxqpPk@!x pP_3r~#,⌂Um.k2Oc?ONK;Yc⌂.r
D+SrU⌂`C$bD*i@#@&kiYAAA==^#~@
C:\> test.obf.bat
Hello World
我在 Windows XP 和 Windows 8 中测试了这种方法。