2014-08-30 2 views
4

Короче я хочу дать друг мой файл битой, который делает ниже (непроверенные)Xor строка в файле bat?

echo Your mother is so fat 
pause 
echo the recursive function computing her mass causes a stack overflow 

я мог бы скопировать/вставить его в файл битой, так что я не хочу изюминку быть разрушен. Как я могу скрыть текст? Я думал, что могу сохранить строку в переменной, и прежде чем я ее повторю, я должен XOR каждую букву с 32. Но я понятия не имею, как взять строку, XOR каждую букву, чем эхо, чтобы отобразить эту шутку. Как я могу скрыть текст? Я мог бы также BASE64 кодировать/декодировать его, но IDK, как это сделать, если я использую только файл bat.

+0

являются временные файлы беспокоить вас? – npocmaka

+0

@npocmaka ?? Дело в том, что пуанлинг не разрушен, и я использую слегка забавный кодовый трюк, чтобы скрыть оглавление. – 2014-08-30 13:00:29

ответ

10

1) Вот один из способов скрыть текст, используя mshta в качестве инструмента командной строки (в этом случае коды ascii):

@echo off 
mshta vbscript:execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(Chr(89) & Chr(111)& Chr(117) & Chr(114) & Chr(32) & Chr(109) & Chr(97) & Chr(109) & Chr(97) & Chr(32)):Close")|more 

2) Вы можете использовать CERTUTIL для кодирования/декодирования base64/шестигранные файлы, но это требует временный файл, который может быть удален беззвучно (more info):

echo 796f7572206d616d6120697320736f20666174>"%temp%\fat.hex" 
certutil -decodehex "%temp%\fat.hex" "%temp%\fat.txt" >nul 2>&1 
type "%temp%\fat.txt" 
del /q /f "%temp%\fat.txt" 

3) Dbenham's hex print function

@echo off 
setlocal 

::Define a Linefeed variable 
set LF=^ 


::above 2 blank lines are critical - do not remove. 


::Create a string variable with encoded TABs 
call :hexprint "0x790x6f0x750x720x200x6d0x610x6d0x610x200x690x730x200x730x6f0x200x660x610x74" var 
echo %var% 

exit /b 

:hexPrint string [rtnVar] 
    for /f eol^=^%LF%%LF%^ delims^= %%A in (
    'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(%~1"' 
) do if "%~2" neq "" (set %~2=%%A) else echo(%%A 
exit /b 

4) carlos' genCar function, который использует MAKECAB:

@echo off 
setlocal 


break>fat.txt 
for %%# in (121 111 117 114 32 109 97 109 97 32 105 115 32 115 111 32 102 97 116) do (
    call :genChar %%# 
    type %%#.chr>>fat.txt 
    del /q /f %%#.chr >nul 2>&1 
) 

type fat.txt 
del /q /f fat.txt 

goto :eof 

    :genChar 
    setlocal 
    set "USAGE=echo:Usage: Supply an integer 0-255& goto :EOF" 
    if "%~1" equ "" %USAGE% 
    set /a "val=%~1" 2>nul 
    if "%~1" neq "%val%" %USAGE% 
    if %~1 lss 0 %USAGE% 
    if %~1 gtr 255 %USAGE% 

    set tempfile=%~1.tmp 
    set "options=/d compress=off /d reserveperdatablocksize=26" 
    if %~1 neq 26 (type nul >"%tempfile%" 
    makecab %options% /d reserveperfoldersize=%~1 "%tempfile%" %~1.chr >nul 
    type %~1.chr | (
    (for /l %%N in (1 1 38) do pause)>nul&findstr "^">"%tempfile%") 
    >nul copy /y "%tempfile%" /a %~1.chr /b 
    del "%tempfile%" 
) else (copy /y nul + nul /a 26.chr /a >nul) 
    endlocal 

для более скрытом скрипт вы можете объединить hem.Only MSHTA и MakeCAB решения будут работать на каждой машине окна. Forfiles и CERTUTIL являются по умолчанию форма Vista, и выше я think.It можно создать еще несколько примеров ...

+0

Подождите, какие ограничения у вас есть? Работает ли он на окнах 8? Я не могу использовать powershell bc, он сказал, что система не имеет сценариев, и идея не должна была возиться с настройками. Будет ли это работать. -edit- Мне нравится решение certutil! – 2014-08-30 13:14:53

+0

@ acidzombie24 у вас нет ограничений с решением 'MSHTA', он может запускаться на всех машинах Windows. 'forfiles' и' certutil' не являются avaialbe на некоторых домашних версиях окон. Следующий пример будет с 'makecab' также доступный на всех машинах Windows, но также запрашивает временный файл ... – npocmaka

+1

+1 Я считаю, что CERTUTIL доступен на всех современных платформах Windows. Я отредактировал ваше сообщение, чтобы преобразовать 4. 4) из-за некоторых проблем с форматированием. Возможно, вы захотите посмотреть на мой ответ, который использует мое выборочное шифрование стиля Adventure. – dbenham

4

Этот код создает base64 закодированный файл:

@echo off 
set "var=the recursive function computing her mass causes a stack overflow" 
>file.tmp echo %var% 
certutil -f -encode file.tmp file.tmp2 >nul 
echo file.tmp2|find /v "-----" >file.txt 
del file.tmp? 
pause 

и вы можете использовать этот файл как так (добавление эха в начале каждой строки кодированного файла):

@echo off 
cls 
echo Your mother is so fat 
pause 
(
echo dGhlIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjb21wdXRpbmcgaGVyIG1hc3MgY2F1c2Vz 
echo IGEgc3RhY2sgb3ZlcmZsb3cNCg== 
)>file.tmp 
certutil -f -decode file.tmp file.txt >nul 
timeout /t 2 /nobreak >nul 
type file.txt 
timeout /t 5 /nobreak >nul 
5

Я думаю, вы можете просто заменить некоторые символы с другими в чистой BAT без каких-либо временных файлов, используя следующую строку, заменив скрипт.

% ул: old_char = new_char%

К примеру, я определил некоторые функции кодирования и декодирования. Здесь приводятся коды, и он будет печатать то, что вы хотите.

@echo off 

set str1=Y urke ohtrkmsks kfao 
set str2=ohtkrtcursmvtkfuncom nkc epuomngkhtrkeasskcaustskaksoacik vtrfl w 

call :decode "%str1%" 
call :decode "%str2%" 
pause 
goto :eof 

:decode 
set "str=%~1" 
set str=%str: =#% 
set str=%str:k= % 
set str=%str:i=k% 
set str=%str:m=i% 
set str=%str:e=m% 
set str=%str:t=e% 
set str=%str:o=t% 
set str=%str:#=o% 
echo %str% 
goto :eof 

Я также приложил сценарий кодирования ниже.

@echo off 

set str1=Your mother is so fat 
set str2=the recursive function computing her mass causes a stack overflow 

call :encode "%str1%" 
call :encode "%str2%" 
pause 
goto :eof 

:encode 
set "str=%~1" 
set str=%str:o=#% 
set str=%str:t=o% 
set str=%str:e=t% 
set str=%str:m=e% 
set str=%str:i=m% 
set str=%str:k=i% 
set str=%str: =k% 
set str=%str:#= % 
echo %str% 
goto :eof 
7

Эта тема близка и дорога моему сердцу, потому что я сделал что-то подобное в my implementation of the classic Colossal Cave Adventure game as a Windows batch file.

В игровом сценарии я выборочно шифровать отображения текста, имена переменных и комментарии. Код для декодирования зашифрованного текста встроен непосредственно в один и тот же скрипт! Я обычно пишу исходный код для игры и использую фигурные скобки для обозначения того, какая часть должна быть зашифрована. Функция внутри игры способна генерировать зашифрованную форму самого себя!

Я использовал простой симметричный ротационный шифр, так что это скорее обфускация, чем шифрование. Но это все, что необходимо как для игры, так и для вашей ситуации.

Я извлек упрощенную версию подпрограмм и предоставил их ниже.

Первый скрипт - это автономный скрипт, который выборочно шифрует текст в исходном файле и записывает результат в стандартный вывод. Просто переадресуйте вывод в новый файл, чтобы получить зашифрованную версию файла.

selectiveROT13.bat

@echo off 
:selectiveROT13 InFile 
:: 
:: Selectively applies the simple "rotate alphabet 13 places" cipher 
:: to the contents of file InFile. Only text between curly braces 
:: is affected. The affected content can span multiple lines. 
:: 
:: Writes the results to stdout. 
:: Percent completion is continuously written to stderr. 
:: 
setlocal enableDelayedExpansion 
set "upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
set "lower=abcdefghijklmnopqrstuvwxyz" 
for /l %%A in (0 1 25) do (
    set /a "B=(%%A+13)%%26" 
    for /f %%B in ("!B!") do (
    set "upper!upper:~%%A,1!=!upper:~%%B,1!" 
    set "lower!lower:~%%A,1!=!lower:~%%B,1!" 
) 
) 
setlocal disableDelayedExpansion 
>&2 cls 
set "active=" 
for /f %%N in ('type %1^|find /c /v ""') do set /a "lnCnt=%%N, pct=-1" 
for /f "skip=2 tokens=1,* delims=[]" %%a in ('find /v /n "" %1') do (
    set "ln=%%b" 
    setlocal enableDelayedExpansion 
    set "str=A!ln!" 
    set "len=0" 
    for /L %%A in (12,-1,0) do (
    set /a "len|=1<<%%A" 
    for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A" 
) 
    set /a len-=1 
    set rtn= 
    for /l %%n in (0,1,!len!) do (
    set "c=!ln:~%%n,1!" 
    if "!c!" equ "{" set "active=1" 
    if "!c!" equ "}" set "active=" 
    if defined active if defined upper!c! for /f %%c in ("!c!") do (
     if "!upper:%%c=%%c!" equ "!upper!" (
     set "c=!upper%%c!" 
    ) else (
     set "c=!lower%%c!" 
    ) 
    ) 
    set "rtn=!rtn!!c!" 
) 
    echo(!rtn! 
    for %%A in ("!active!") do (
    endlocal 
    set "active=%%~A" 
) 
) 
exit /b 0 

Ниже ваша шутка программа с упрощенной версией кода, чтобы декодировать зашифрованный текст. Мой исходный код работал со строковыми переменными, но эта версия работает со строковыми литералами. Исходный скрипт написан нормально, без шифрования. Скобки указывают, какой код должен быть зашифрован. Помимо вашей шутки, я включил документацию и примеры, чтобы продемонстрировать некоторые функции.

joke_src.bat

@echo off 
setlocal enableDelayedExpansion 
call :init 

:: Disable delayed expansion to protect ! within string literals 
setlocal disableDelayedExpansion 

:: Curly braces are used to denote text that should be encrypted. 
:: Encryption can span multiple lines 
:: { 
:::Line1 
:::Line2 
:::Line3 
:: } 

:: I defined a simple SHOW macro that expands to CALL :SHOW 
:: Use the %show% macro to display encrypted text. 
:: The braces can be hidden by using the undefined %{% & %}% variables 
%show% %{%"Quote literals ("") must be doubled ("""") in the source"%}% 

:: Here I use a FOR loop to show all encrypted lines within this script 
:: that begin with ::: 
echo(
for /f "delims=: tokens=*" %%A in ('findstr /b ":::" "%~f0"') do %show% "%%A" 

echo(
echo And now it is time for a little joke. 
echo(
echo Your mother is so fat... 
pause 
%show% %{%"the recursive function computing her mass causes a stack overflow!"%}% 
exit /b 


:show Str 
::{ 
:: Applies the simple "rotate alphabet 13 places" cipher to string Str 
:: and writes the result to stdout. Consecutive quotes ("") are converted 
:: into a single quote ("). 
::} 
    setlocal disableDelayedExpansion 
    set "str=%~1" 
    setlocal enableDelayedExpansion 
    set "str=!str:""="!^" 
    if defined {obfuscated} (
    set "len=0" 
    set "str2=.!str!" 
    for /L %%A in (12,-1,0) do (
     set /a "len|=1<<%%A" 
     for %%B in (!len!) do if "!str2:~%%B,1!"=="" set /a "len&=~1<<%%A" 
    ) 
    set /a len-=1 
    set rtn= 
    for /l %%n in (0,1,!len!) do (
     set "c=!str:~%%n,1!" 
     if defined {upper}!c! for /f %%c in ("!c!") do (
     if "!{upper}:%%c=%%c!" equ "!{upper}!" (
      set "c=!{upper}%%c!" 
     ) else (
      set "c=!{lower}%%c!" 
     ) 
    ) 
     set "rtn=!rtn!!c!" 
    ) 
) else set "rtn=!str!" 
    echo(!rtn! 
exit /b 0 


:init 
    set "}=" 
    set "{="} 
    set "{upper}=ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    set "{lower}=abcdefghijklmnopqrstuvwxyz" 
    for /l %%A in (0 1 25) do (
    set /a "B=(%%A+13)%%26" 
    for /f %%B in ("!B!") do (
     set "{upper}!{upper}:~%%A,1!=!{upper}:~%%B,1!" 
     set "{lower}!{lower}:~%%A,1!=!{lower}:~%%B,1!" 
    ) 
) 
    set "{obfuscated}=" 
    set "{obfuscationTest}={A}" 
    if "!{obfuscationTest}:A=!" equ "!{obfuscationTest}!" set {obfuscated}=1 
    set "show=call :show" 
exit /b 

Следующая команда создаст зашифрованную версию сценария:

selectiveROT13 joke_src.bat >joke.bat 

Ниже зашифрованном виде. Это то, что вы послали бы своему другу. (Без дополнительной документации и примеры конечно)

joke.bat

@echo off 
setlocal enableDelayedExpansion 
call :init 

:: Disable delayed expansion to protect ! within string literals 
setlocal disableDelayedExpansion 

:: Curly braces are used to denote text that should be encrypted. 
:: Encryption can span multiple lines 
:: { 
:::Yvar1 
:::Yvar2 
:::Yvar3 
:: } 

:: I defined a simple SHOW macro that expands to CALL :SHOW 
:: Use the %show% macro to display encrypted text. 
:: The braces can be hidden by using the undefined %{% & %}% variables 
%show% %{%"Dhbgr yvgrenyf ("") zhfg or qbhoyrq ("""") va gur fbhepr"%}% 

:: Here I use a FOR loop to show all encrypted lines within this script 
:: that begin with ::: 
echo(
for /f "delims=: tokens=*" %%A in ('findstr /b ":::" "%~f0"') do %show% "%%A" 

echo(
echo And now it is time for a little joke. 
echo(
echo Your mother is so fat... 
pause 
%show% %{%"gur erphefvir shapgvba pbzchgvat ure znff pnhfrf n fgnpx biresybj!"%}% 
exit /b 


:show Str 
::{ 
:: Nccyvrf gur fvzcyr "ebgngr nycunorg 13 cynprf" pvcure gb fgevat Fge 
:: naq jevgrf gur erfhyg gb fgqbhg. Pbafrphgvir dhbgrf ("") ner pbairegrq 
:: vagb n fvatyr dhbgr ("). 
::} 
    setlocal disableDelayedExpansion 
    set "str=%~1" 
    setlocal enableDelayedExpansion 
    set "str=!str:""="!^" 
    if defined {boshfpngrq} (
    set "len=0" 
    set "str2=.!str!" 
    for /L %%A in (12,-1,0) do (
     set /a "len|=1<<%%A" 
     for %%B in (!len!) do if "!str2:~%%B,1!"=="" set /a "len&=~1<<%%A" 
    ) 
    set /a len-=1 
    set rtn= 
    for /l %%n in (0,1,!len!) do (
     set "c=!str:~%%n,1!" 
     if defined {hccre}!c! for /f %%c in ("!c!") do (
     if "!{hccre}:%%c=%%c!" equ "!{hccre}!" (
      set "c=!{hccre}%%c!" 
     ) else (
      set "c=!{ybjre}%%c!" 
     ) 
    ) 
     set "rtn=!rtn!!c!" 
    ) 
) else set "rtn=!str!" 
    echo(!rtn! 
exit /b 0 


:init 
    set "}=" 
    set "{="} 
    set "{hccre}=ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    set "{ybjre}=abcdefghijklmnopqrstuvwxyz" 
    for /l %%A in (0 1 25) do (
    set /a "B=(%%A+13)%%26" 
    for /f %%B in ("!B!") do (
     set "{hccre}!{hccre}:~%%A,1!=!{hccre}:~%%B,1!" 
     set "{ybjre}!{ybjre}:~%%A,1!=!{ybjre}:~%%B,1!" 
    ) 
) 
    set "{boshfpngrq}=" 
    set "{boshfpngvbaGrfg}={N}" 
    if "!{boshfpngvbaGrfg}:A=!" equ "!{boshfpngvbaGrfg}!" set {boshfpngrq}=1 
    set "show=call :show" 
exit /b 

Красота этой системы является то, что оба joke.bat и joke_src.bat формирующий тот же вывод:

Quote literals (") must be doubled ("") in the source 

Line1 
Line2 
Line3 

And now it is time for a little joke. 

Your mother is so fat... 
Press any key to continue . . . 
the recursive function computing her mass causes a stack overflow! 

Еще одна приятная особенность заключается в том, что selectiveROT13.bat может быть применен к joke.bat для восстановления исходного незашифрованного источника.

Смежные вопросы