- 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. 관련 자료가 온라인에 거의 남아 있지 않아, 제작자와의 추가 접촉을 희망함