40년 된 복제 방지 동글 해제하기

12 hours ago 2

  • 1990년대 회계용 RPG II 컴파일러가 요구하던 병렬 포트 동글을 분석해 동작을 복원한 사례
  • 원본 소프트웨어는 Windows 98 환경의 DOS 콘솔에서 실행되며, 동글이 없으면 작동하지 않음
  • 디스크 이미지를 에뮬레이터로 옮겨 분석한 결과, RPGC.EXE와 SEU.EXE 등 실행 파일 내부에 동일한 복제 방지 루틴이 삽입되어 있음
  • 어셈블리 분석을 통해 루틴이 항상 일정한 상수값(7606h) 을 반환함을 확인하고, 4바이트 패치로 동글 검증을 우회
  • 이로써 Software West사의 RPG II 컴파일러가 동글 없이도 실행 가능해졌으며, 고전 소프트웨어 보존 측면에서 의미 있는 성과

고대 회계 소프트웨어와 동글의 발견

  • 40년간 사용된 회계용 RPG 기반 소프트웨어가 Windows 98 PC에서 여전히 운용 중이었음
    • RPG는 IBM System/3, System/32, AS/400 등 중형 컴퓨터용 언어로, 이후 MS-DOS로 이식됨
  • 해당 프로그램은 실행 시 병렬 포트에 하드웨어 복제 방지 동글을 요구
    • 동글에는 “Stamford, CT”와 “Software Security Inc.” 로고가 희미하게 남아 있었음
    • “RUNTIME”이라는 단어가 표시되어 있었으며, 이후 분석에서 의미가 드러남

디스크 이미지 분석과 RPG 컴파일러 구조

  • Windows 98 시스템의 디스크 이미지를 추출해 에뮬레이터에서 실행
    • RPG II 컴파일러(Software West Inc. 제작) 두 버전과 회계 소프트웨어의 전체 RPG 소스 코드를 발견
    • 여러 RPG 모듈과 DOS 배치 파일로 구성된 메뉴 시스템 형태
  • 컴파일러 자체가 동글 검증을 수행하며, 생성된 실행 파일에도 동일한 보호 루틴을 삽입함

병렬 포트 통신 루틴의 역공학

  • Reko 디스어셈블러를 이용해 SEU.EXE를 분석
    • 초기에는 in/out 명령이 보이지 않았으나, 다른 세그먼트(0800h)에서 발견
    • 해당 루틴은 병렬 포트 주소를 BIOS 데이터 영역에서 읽고, LPT1 포트를 통해 데이터를 송수신
    • 결과값을 BX 레지스터에 저장하며, 입력값은 없고 항상 동일한 결과를 반환

상수값 추론과 패치

  • 루틴의 마지막에서 BH 값이 76h로 고정되어 있음을 확인
    • BL 값만 미지수로 남았고, 0~255 범위를 브루트포스로 탐색
    • 올바른 조합은 BL=06h, 즉 BX=7606h로 확인
  • 루틴의 첫 4바이트를 MOV BX,7606h와 RETF로 교체해 동글 검증을 우회
    • 이후 프로그램은 즉시 실행되며, 동일한 루틴을 가진 다른 실행 파일에도 동일한 수정 적용 가능

결과와 의의

  • 모든 RPG II 컴파일러 구성요소에서 동일한 복제 방지 코드가 발견되어 일괄 수정 가능
  • 동글이 단순히 상수값을 반환하는 구조로, 4바이트 패치만으로 무력화 가능
  • 수정된 컴파일러는 동글 없이도 정상 작동하며, 향후 개인 정보 제거 후 역사적 소프트웨어 아카이브로 공개 예정
  • Software West Inc. 관련 자료가 온라인에 거의 남아 있지 않아, 제작자와의 추가 접촉을 희망함

Read Entire Article