제1장 X68000 프로텍트의 기초 – 언데드라인(幻獣鬼)

언데드라인의 프로텍트 타입에 관해서

그럼 우선 언데드라인의 프로텍트에 대해서 살펴봅시다. 프로텍트가 걸려있는 트랙은 8입니다.

Drive 1 Track 8
Track Lenght = 28E4(10468)
Number of Preamble = 0092 Bytes
MFM C  H  R  N  BYTES STATUS
  1 04 00 F7 02 0059  DATA CRC
  2 04 00 09 01 015C 
  3 04 00 01 03 04BC
  4 04 00 02 03 04BC
  5 04 00 03 03 04C7
  6 04 00 04 03 04BB
  7 04 00 05 03 04BA
  8 04 00 06 03 04BD
  9 04 00 07 03 04BA
 10 04 00 08 03 04BA
 11 04 00 0A 02 014B  DATA CRC

이 프로텍트는 “Ys-3”, “Xak”, “Lagoon”등에도 이 타입의 포맷이 걸려있습니다.
그러므로, 이 타입의 프로텍트의 체커에서는 1, 2, 11 번째의 비정상 섹터를 제대로 읽어서 에러가 나오는가(2번째는 나오지 않는다)라는 것과 데이터의 체크섬이 있는가 아닌가라는 것을 조사하는 것입니다.
그런데, 이 체커 말인데, 어느 소프트웨어도 샘플 체커를 그대로 사용하고 있는듯 프로그램은 거의 똑같습니다. 그렇다는 것은 하나를 제거할 수 있다면 모두를 제거할 수 있게 되어버리는 것입니다. 실제로는 그렇게 간단하지는 않지만, 걸려있을 때와 OK일 때의 차이와 뒤의 체크에 주의하면 기본적으로는 같은 것이라고 할 수 있습니다.
그리고 이 타입의 체커의 특징으로

and.l   #$FAFFFF00,D0   (C0BC  FAFF  FF00)

이라는 명령이 반드시 나옵니다. 그러므로, 이 데이터를 서치하면 암호등이 걸려 있지 않은 한 찾을 수 있습니다. 이것을 기억해두면 꽤 편리하겠지요.
우선은 평범히 백업해서 기동해봅시다. 그러면, 어드레스 에러가 발생하면서 보기 좋게 멈춰버리고 맙니다. 또, 디스크의 디렉터리를 살펴봐도 아무것도 나오지 않지만, 이것은 파일의 속성이 바뀌어져 있는 것뿐으로 attrib.x를 사용해서 속성을 되돌려둡시다.

A:¥>attrib -H -R B:*.*

그러면, 다음으로 CONFIG.SYS를 살펴보면 LOADER.X를 실행하고 있으므로, 여기부터 추적하면 됩니다만, 앞에서 서치 데이터를 소개했으므로 그것을 찾아봅시다.
디스크 서치The Surgeon-68K등에 포함되어있는 파일 유틸리티

COBC  FAFF FF00

을 서치합니다. 그러면

《 Track 11 》 3/376  3/398  3/3BA
《 Track 31 》 7/198  7/1BA  7/1DC

인 부분이 있는 것을 할 수 있습니다.

PEC나 업활용 테크닉 12권부터 소개하는 The Surgeon-68K의 코드를 입력하거나, Super Surgeon-68K등을 구해서 실행할 수 있다. 여기서는 Super Surgeon-68K를 이용한다. Tool Box의 ディスク・エディター(디스크 에디터)를 선택한 뒤 [F1]키로 서치할 디스크 드라이브를 지정하고, [F6]키를 누른 뒤 위의 데이터를 입력하면 결과를 얻을 수 있다.

“C0BC FAFF FF00″은 Track 11의 3 섹터 376, 398, 3BA번지에 있음을 확인할 수 있다.(붉은색으로 표시)

다음으로 파일 체커를 사용해서 이 데이터가 어떤 파일 속에 있는지를 살펴봅시다.

           ⁞
A-----  WINDOW.M     8/1 ~ 11/6
           ⁞
A-----  OPENING.M   31/4 ~ 34/6
           ⁞

그러면, 위의 두개의 파일 속에 포함되어있는 것을 알았으므로, 이것들의 파일을 살펴보면 되는 것입니다. 다음으로 디버거에서 읽어봅시다.

마찬가지로Super Surgeon-68K의 디스크에디터에서 [F10]키를 누르면 해당 파일이 어떤 트랙/섹터에 걸쳐있는지 알 수 있다. WINDOW.M의 경우 8트랙 1섹터에서 11트랙 6섹터에 걸쳐 기록되어있다.

A:¥>DB
-R  B:¥WINDOW.M, 70000

실행형식이 아니므로 어드레스를 지정해서 읽어들입니다. 다음으로 아까전의 데이터를 서치합니다.

-S.A0  .A1  COBC FAFF FF00
00076B76  00076B98  00076BBA

주위를 살펴보면 체커를 찾을 수 있습니다.

-L76B70
00076B70  moveq  #$01,D7       *리트라이 횟수 2
00076B72  bsr.w  $00076D08     *읽기 서브
00076B76  and.l  #$FAFFFF00,D0
00076B7C  bne.s  $00076B8C     *에러가 나오면 안됨
00076B7E  lea    %00076D5C,A3  *썸 데이터
00076B84  move.w #$00FF,D5     *썸을 취하는 갯수
00076B88  bsr.s  $00076BF6     *체크썸 계산
00076B8A  beq.s  $00076B92     *같다면 다음으로
00076B8C  dbf    D7,$00076B72  
00076B90  bra.s  $00076BDA     *걸렸다!로

00076B92  moveq  #$01,D7       *위와 같다
00076B94  bsr.w  $00076D24
00076B98  and.l  #$FAFFFF00,D0
00076B9E  bne.s  $00076BAE     
00076BA0  lea    %00076D5D,A3  
00076BA6  move.w #$01BF,D5     
00076BAA  bsr.s  $00076BF6     
00076BAC  beq.s  $00076BB4     
00076BAE  dbf    D7,$00076B94  
00076BB2  bra.s  $00076BDA     *걸렸다!로

00076BB4  moveq  #$02,D7       *역시 같다
00076BB6  bsr.w  $00076D40
00076BBA  and.l  #$FAFFFF00,D0
00076BC0  beq.s  $00076BD6
00076BC2  lea    $00076D5E,A3

00076BC8  move.w #$004F,D5
00076BCC  bsr.s  $00076BF6
00076BCE  bne.s  $00076BD6
00076BD0  bsr.s  $00076C0A     *읽은 데이터의 체크
00076BD2  bne.s  $00076BD6     *다르다면 아웃
00076BD4  rts

00076BD6  dbf    D7,$00076BB6
00076BDA  lea    $0007693C,A0  *걸렸다!
00076BE0  lea    $0007000E,A1
00076BE6  move.w #$8000,D0
00076BEA  move.l (A1)+,(A0)+
00076BEC  def    D0,$00076BEA
00076BF0  jmp    $00000000

D0 레지스터에 0을 넣고 돌아오면 99%는 OK가 되는 것입니다. (위의 경우는 되돌아가는 것으로 괜찮습니다)

-L76B70
00076B70  moveq  #$01,D7       (7E01)
00076B72  bsr.w  $00076D08     (6100  0194)
00076B76  and.l  #$FAFFFF00,D0 (C0BC  FAFF FF00)
                   ↓
00076B70  rts                  (4E75)

이것으로, 이 체커는 무용지물이 되어버렸습니다. 다음으로 혹시 모르니 나머지 파일도 살펴봅시다.

A:¥>DB
 -R B:¥OPENING.M, 70000
 -S.A0  .A1  C0BC  FAFF  FF00
 00070D98  00070DBA  00070DDC

 -L70D92
 00070D92  moveq  #$01,D7
 00070d94  bsr.w  $0070f18
 00070D98  and.l  #$FAFFFF00,D0
 00070D9E  bne.s  $00070DAE
 00070DA0  lea    $00070F6C,D5
 00070DA6  move.w #$00FF,D5
             ⁞
         (중간 생략)
             ⁞
 00070DF4  bne.s  $00070DFC
 
 00070DF6  clr.l  D0
 00070DF8  bra.w  $00070F72      *OK!
 00070DFC  dbf    D7,$00070DD8
 00070E00  moveq  #$FF,D0
 00070E02  bra.w  $00070F74      *걸렸다!
             ⁞

이것도 앞의 체커와 같습니다.

00070D92  moveq  #$01,D7       (7E01)
00070D94  bsr.w  $00070F18     (6100  0182)
00070D98  and.l  #$FAFFFF00,D0 (C0BC  FAFF FF00)
                   ↓
00070D92  moveq  #$00,D0       (7000)
00070D94  rts                  (4E75)

선두를 이렇게 바꾸는 것으로도 이미 제거되어버렸습니다. 그러면 마지막으로 모아봅시다. 우선, 프로그램 디스크에서

7E01  6100  0194

를 서치합니다. 그러면,

《 Track 11 》 3/370

이 되므로, 여기를 디스크 에디터로

4E75

로 바꿔줍니다. 다음으로

7E01  6100  0182

를 서치합니다. 그러면,

《 Track 31 》 7/192

이 되므로, 여기를 디스크 에디터로

7000  4E75

로 바꿔주면 OK입니다.

댓글 남기기