如何在无外部工具的Batch混淆器中单独输出空格?
解决Batch混淆器空格丢失问题
你的问题根源在于set /p命令的特性:当用<nul set /p= 空格时,空格会被忽略无法输出;同时for /f "tokens=*"会自动截断行首空格,也会导致部分空格丢失。以下是针对性的修改方案:
修改后的完整脚本
@echo off setlocal enabledelayedexpansion set /a N=0 :file set /p "file=Enter filename: " if not exist "%file%" ( echo Please try again. The file you specified does not exist. pause>nul cls goto file ) cls echo Please wait. set /a overallfirst=1 set /a double=0 for /F "usebackq tokens=*" %%f in ("%file%") do goto start :start set /a "tamp=%random%" set /a loop2=0 set /a rand=%random% %%5 +1 if %rand%==1 echo #> %tamp% if %rand%==2 echo $> %tamp% if %rand%==3 echo ?> %tamp% if %rand%==4 echo z> %tamp% if %rand%==5 echo j> %tamp% :chars if %loop2%==100 goto next set /a rand=%random% %%5 +1 if %rand%==1 <nul set /p=#>> %tamp% if %rand%==2 <nul set /p=$>> %tamp% if %rand%==3 <nul set /p=?>> %tamp% if %rand%==4 <nul set /p=z>> %tamp% if %rand%==5 <nul set /p=j>> %tamp% set /a loop2+=1 goto chars :next for /f "usebackq tokens=*" %%f in ("%tamp%") do set chars=%%f set "start=^<nul set /p=%chars%^>^> Obfuscated.bat" del %tamp% set /a loop=-1 set /a first=1 for %%i in ("%file%") do @set count=%%~zi echo @echo off> Chars.bat echo setlocal enabledelayedexpansion>> Chars.bat if %double%==0 echo echo.> Obfuscated.bat>> Chars.bat echo for /f "usebackq delims=" %%a in ("%file%") do set id=%%a ^& call :processline %%a >> Chars.bat echo cls>>Chars.bat echo echo Obfuscated code:>>Chars.bat echo echo -------------------------->>Chars.bat echo type Obfuscated.bat>>Chars.bat echo pause>nul>>Chars.bat echo exit >> Chars.bat echo goto :eof >> Chars.bat echo :processline >> Chars.bat :loop set /a loop=%loop%+1 if %loop%==%count% goto end if %first%==1 ( set first=0 goto other ) :: 修改:生成字符判断逻辑 echo set "char=%%id:~%loop%,1%%">> Chars.bat echo if "!char!"==" " (>> Chars.bat echo ^<nul set /p=" "^>> Obfuscated.bat>> Chars.bat echo ) else (>> Chars.bat echo ^<nul set /p=!char!^>> Obfuscated.bat>> Chars.bat echo )>> Chars.bat goto next1 :other set "command=%start%" echo %command%>> Chars.bat set /a loop=%loop%-1 goto loop :next1 set /a "tamp=%random%" set /a loop2=0 set /a rand=%random% %%5 +1 if %rand%==1 echo #> %tamp% if %rand%==2 echo $> %tamp% if %rand%==3 echo ?> %tamp% if %rand%==4 echo z> %tamp% if %rand%==5 echo j> %tamp% :chars if %loop2%==100 goto next2 set /a rand=%random% %%5 +1 if %rand%==1 <nul set /p=#>> %tamp% if %rand%==2 <nul set /p=$>> %tamp% if %rand%==3 <nul set /p=?>> %tamp% if %rand%==4 <nul set /p=z>> %tamp% if %rand%==5 <nul set /p=j>> %tamp% set /a loop2+=1 goto chars :next2 for /f "usebackq tokens=*" %%f in ("%tamp%") do set chars=%%f set "command=^<nul set /p=%chars%" echo %command%^>^> Obfuscated.bat>> Chars.bat del %tamp% goto loop :end echo echo. >> Obfuscated.bat>> Chars.bat echo goto :eof >> Chars.bat echo :eof >> Chars.bat start Chars.bat if %overallfirst%==1 ( set /a overallfirst=0 set /a double=1 ) endlocal
关键修改说明
启用延迟扩展:
- 在主脚本和生成的
Chars.bat开头都添加setlocal enabledelayedexpansion,确保循环中变量能正确动态取值。
- 在主脚本和生成的
保留行首空格:
- 将
for /f "tokens=*"改为for /f "delims=",避免for /f自动截断行首空格,确保整行内容完整读取。
- 将
正确输出空格:
- 增加字符判断逻辑:当字符是空格时,用
<nul set /p=" "输出(带引号的空格会被set /p正确识别);非空格字符保持原有方式输出。
- 增加字符判断逻辑:当字符是空格时,用
代码优化:
- 合并重复的文件存在性判断为块结构,提升可读性;给文件名添加引号,支持含空格的文件名。
现在运行修改后的脚本处理输入文件,手动移除随机字符后,空格会被完整保留,不会出现@echooff或echotest的情况。
内容的提问来源于stack exchange,提问作者John Davis
相关产品推荐
相关产品推荐

