라떼군 이야기
40년 전 하드웨어 동글을 뚫어라: 레거시 소프트웨어 고고학의 승리
TL;DR 윈도우 98과 병렬 포트 동글에 묶여 있던 40년 된 회계 소프트웨어를 구출하기 위한 리버스 엔지니어링 여정입니다. 저자는 동글이 복잡한 연산 없이 단순히 ‘고정된 값’만 반환한다는 사실을 발견하고, 단 4바이트의 바이너리 패치로 하드웨어 제약을 완벽히 제거했습니다.
2026년에도 여전히 윈도우 98과 도스(DOS) 기반의 회계 프로그램을 사용하는 기업이 있다면 믿으시겠습니까? 이 글은 40년 묵은 레거시 시스템을 현대화하기 위해, 이제는 잊혀진 기술인 ‘병렬 포트 동글’의 복사 방지 기술을 역설계하는 흥미진진한 소프트웨어 고고학 탐사기입니다. 물리적 하드웨어가 없으면 데이터조차 꺼낼 수 없는 상황에서 엔지니어가 어떻게 문제를 해결했는지 살펴봅니다.
핵심 내용
핵심은 RPG II 컴파일러가 실행 파일에 동글 체크 로직을 주입한다는 사실을 발견한 데서 시작했습니다. 저자는 Reko 디컴파일러를 통해 I/O 명령어가 숨겨진 별도의 코드 세그먼트를 찾아냈고, 해당 루틴이 외부 입력값 없이 항상 동일한 결과값(매직 넘버)을 레지스터(BX)에 반환한다는 결정적 단서를 포착했습니다. 하위 바이트(06h)는 코드 분석으로, 상위 바이트(76h)는 브루트 포싱으로 찾아내어 최종값 7606h를 하드코딩함으로써 동글 없이도 프로그램이 실행되도록 만들었습니다.
기술적 인사이트
기술적 관점에서 이 사례는 초기 DRM(디지털 저작권 관리) 구현의 허술함과 ‘Security by Obscurity(은닉을 통한 보안)‘의 한계를 명확히 보여줍니다. 하드웨어 동글이 암호화 연산 장치가 아니라 단순한 ‘하드웨어 상수’ 역할만 수행했기 때문에, 소프트웨어적으로 쉽게 에뮬레이션이 가능했습니다. 또한, 컴파일러가 보호 로직을 단순히 복사-붙여넣기 식으로 주입하는 구조였기에, 컴파일러 바이너리 하나만 패치하면 그 컴파일러로 빌드된 모든 애플리케이션의 락이 해제되는 ‘파급 효과’가 발생했습니다. 이는 정적 분석(어셈블리 독해)과 동적 분석(에뮬레이터 실행)을 결합한 디버깅의 정석을 보여줍니다.
시사점
이 프로젝트는 레거시 시스템 마이그레이션에서 ‘하드웨어 종속성’이 소프트웨어 수명에 얼마나 치명적인지 시사합니다. 실무 개발자들에게는 로우 레벨(Assembly) 지식이 단순히 과거의 유물이 아니라, 블랙박스 시스템을 이해하고 데이터를 구출하는 데 필수적인 도구임을 일깨워줍니다. 또한, 오래된 소프트웨어를 가상화 환경으로 옮길 때 하드웨어 에뮬레이션이나 바이너리 패치가 유일한 해결책이 될 수 있음을 보여주는 실전 사례입니다.
과연 우리가 지금 만들고 있는 보안 시스템은 40년 뒤 후배 개발자들에게 어떤 평가를 받게 될까요? 이 글은 단순히 락을 해제하는 기술적 쾌감을 넘어, 사라져가는 소프트웨어 유산을 어떻게 보존하고 접근 가능하게 만들 것인가에 대한 중요한 질문을 던집니다.