요즘 고전 게임이나 구형 게임기의 한글패치가 정말 많이 나오고 있습니다.
불과 1~2년 전만 해도 제가 관심 있는 게임이 하나 한글화됐다는 소식을 보면 신기하고 반가웠는데, 최근에는 오히려 새로 공개되는 한글화 게임을 따라가기가 어려울 정도라는 느낌도 듭니다.
AI 기술이 발전하면서 번역이나 이미지 처리 같은 작업에 도움을 받을 수 있는 방법도 많아졌고, 여기에 기존부터 한글화를 만들어오던 분들의 노하우까지 더해지면서 예전보다 다양한 게임을 한글로 접할 수 있게 된 것 같습니다.
아무튼 한글패치를 받아보면 거의 항상 따라오는 말이 있습니다.
원본 ROM이 필요합니다.
처음에는 원본 게임이면 다 같은 것 아닌가 생각할 수 있는데, 실제로 패치를 해보면 그렇지 않습니다.
같은 게임이어도 ROM은 하나가 아닙니다
예를 들어 똑같은 게임이라도
미국판, 일본판, 유럽판처럼 국가가 다를 수 있고,
초기 버전과 수정판처럼 게임 자체의 리비전이 다를 수도 있습니다.
겉으로 보기에는 게임 제목도 같고 실행도 잘 되지만 파일 내부의 데이터는 조금씩 다를 수 있습니다.
한글패치는 보통 제작자가 가지고 있는 특정 버전의 원본 ROM을 기준으로 만들어집니다.
그래서 우리가 가지고 있는 파일도 그 원본과 동일해야 합니다.
제작자가 일본판 1.0을 기준으로 패치를 만들었는데 내가 미국판을 가지고 있거나, 같은 일본판이어도 다른 리비전이라면 패치가 실패할 수 있습니다.
운이 나쁘면 패치 프로그램에서는 완료된 것처럼 보이는데 실제 게임을 실행하면 글자가 깨지거나 실행 자체가 되지 않는 경우도 생길 수 있습니다.
결국 한글패치에서 말하는 원본 ROM은
게임 제목이 같은 파일
이 아니라
패치 제작자가 사용한 것과 데이터가 동일한 파일
이라고 이해하는 것이 더 정확합니다.
파일명만 보고는 알 수 없습니다
여기에서 문제가 하나 생깁니다.
ROM 파일 이름은 얼마든지 바꿀 수 있습니다.
예를 들어
Game (Japan).nds
라는 파일이 있다고 해도 이 이름만 보고 실제로 일본판인지, 어떤 버전인지, 데이터가 변형되지 않았는지 확신할 수 없습니다.
누군가 이름을 바꿨을 수도 있고,
압축을 풀거나 변환하는 과정에서 파일 형태가 달라졌을 수도 있고,
기종에 따라 헤더가 포함되거나 빠진 파일일 수도 있습니다.
실제로 ROM 패처 중에는 패치 전에 헤더를 제거하는 기능을 따로 제공하는 경우도 있습니다. Rom Patcher JS도 CRC32, MD5, SHA-1 확인과 함께 ROM 헤더 제거 기능을 제공합니다.
그래서 파일명이 아니라 파일 자체를 기준으로 비교할 방법이 필요합니다.
이때 나오는 것이 해시입니다.
해시는 파일의 지문 같은 것
해시는 어렵게 생각하면 복잡한데, 사용할 때는 파일의 지문 정도로 생각하면 편합니다.
ROM 파일 전체 데이터를 계산해서 일정한 형태의 값으로 만들어줍니다.
예를 들면 이런 것들입니다.
CRC32MD5SHA1
한글패치 제작자가
CRC32 : 12345678
MD5 : ABCD…
SHA1 : 1234…
처럼 값을 적어두었다면,
내가 가진 ROM의 해시를 계산해서 같은지 비교하면 됩니다.
같다면 제작자가 지정한 파일과 동일한 데이터를 가지고 있을 가능성이 매우 높습니다.
반대로 게임 제목도 같고 용량도 비슷한데 해시가 다르다면 일단 같은 원본이라고 생각하지 않는 것이 안전합니다.
왜 아주 조금만 달라도 문제가 될까?
패치 파일은 완성된 게임 전체를 다시 배포하는 방식이 아닙니다.
쉽게 설명하면
원본 ROM의 어느 부분을 어떻게 바꿀 것인지
에 대한 차이 정보라고 생각하면 됩니다.
예를 들어 제작자가 사용한 ROM에서 어떤 문장이 A 위치에 있다고 가정합니다.
한글패치는 그 위치에 있는 데이터를 한글 데이터로 교체하도록 만들어집니다.
그런데 다른 버전의 ROM에서는 같은 데이터가 B 위치에 있거나 주변 구조가 달라질 수 있습니다.
그러면 패치가 기대하는 위치와 실제 ROM의 구조가 맞지 않게 됩니다.
그래서 같은 게임이라도 원본이 달라지면 패치가 정상적으로 적용되지 않을 수 있습니다.
패치 프로그램이 알아서 확인해주는 경우도 있습니다
패치 형식에 따라서는 원본이 맞는지 어느 정도 검증할 수 있는 기능도 있습니다.
예를 들어 BPS처럼 체크섬을 포함하는 형식도 있고, xdelta 계열에서도 잘못된 소스를 사용했을 때 체크섬 불일치와 같은 오류가 나타날 수 있습니다.
최근 xdelta3 구현에는 원본과 결과 파일의 전체 해시를 확인하는 검증 기능도 포함되어 있습니다.
하지만 모든 패치 형식이 동일하게 원본을 검증해주는 것은 아닙니다.
그래서 패치 프로그램이 오류를 내지 않았다고 해서 반드시 올바른 ROM이라고 단정할 수도 없습니다.
결국 가장 확실한 방법은 패치를 하기 전에 제작자가 알려준 원본 해시와 직접 비교하는 것입니다.
CRC32, MD5, SHA1 중 무엇을 확인해야 할까?
한글패치 배포 글을 보다 보면 제작자마다 적어둔 해시가 다릅니다.
어떤 분은 CRC32만 적어놓기도 하고,
어떤 분은 MD5,
또는 SHA1까지 함께 적어두기도 합니다.
일반적인 ROM 확인 용도라면 제작자가 적어둔 값을 그대로 확인하면 됩니다.
ROM 패칭 도구에서도 이 세 가지를 함께 표시하는 경우가 많습니다. Rom Patcher JS 역시 ROM을 불러오면 CRC32, MD5, SHA-1을 확인할 수 있도록 만들어져 있습니다.
보안 용도로는 CRC32나 MD5, SHA1에 각각 한계가 있지만, 여기에서는 암호 보안이 아니라 내 파일이 제작자가 지정한 파일과 같은지 식별하는 용도이므로 여전히 많이 사용됩니다.
저는 가능하면 제작자가 여러 값을 제공했다면 여러 개를 같이 확인하는 편입니다.
해시가 다르면 바로 다른 ROM이라고 보면 될까?
대부분은 그렇게 접근하면 됩니다.
다만 조금 애매한 경우도 있습니다.
기종에 따라 ROM 앞쪽에 별도의 헤더가 붙어 있는 경우가 있고, 같은 게임 데이터를 다른 형식으로 저장하는 경우도 있습니다.
그래서 제작자가
헤더 없음
Headered ROM
Deheadered
같은 조건을 따로 적어두는 경우도 있습니다.
이런 상황에서는 실제 게임 데이터가 같아도 파일 전체 해시는 달라질 수 있습니다.
결국 해시 숫자만 보는 것보다 제작자가 적어둔
국가 / 버전 / 파일 크기 / 헤더 여부 / 해시
를 같이 확인하는 것이 좋습니다.
제가 한글패치를 하면서 가장 많이 막힌 부분
저도 한글패치를 적용하면서 가장 많이 막혔던 부분이 바로 이것이었습니다.
패치파일도 있고,
패치 프로그램도 있고,
게임도 실행되는 ROM이 있는데
패치만 하면 오류가 납니다.
특히 xdelta에서
target window checksum mismatch
같은 메시지를 만나면 처음에는 패치 프로그램이 잘못된 것처럼 생각하기 쉽습니다.
그런데 실제로 확인해보면 패치 프로그램보다 원본 ROM이 제작자가 사용한 파일과 다른 경우가 많았습니다.
원본의 해시부터 비교하면 문제를 훨씬 빨리 찾을 수 있습니다.
그런데 해시 확인도 은근히 귀찮습니다
문제는 여기서 또 생깁니다.
CRC32 하나만 보면 간단하지만 기종이나 패치에 따라 MD5, SHA1도 확인해야 합니다.
패치 형식도 IPS, BPS, xdelta, PPF 등 다양합니다.
기종도 늘어나면 필요한 프로그램도 계속 달라집니다.
온라인 패처 중에는 IPS, UPS, BPS, PPF, xdelta 등을 한 곳에서 지원하면서 ROM의 CRC32, MD5, SHA-1도 함께 보여주는 프로그램도 있습니다.
그래도 여러 게임을 관리하다 보면
ROM을 찾고,
해시를 확인하고,
제작자 정보를 찾아 비교하고,
맞는 패치 프로그램을 찾아 실행하는 과정 자체가 점점 번거로워집니다.
저는 여기서 조금 다른 생각을 하게 됐습니다.
그냥 이걸 한 프로그램에서 하면 안 될까?
그래서 별도로 툴을 만들고 있습니다
현재는 제가 가지고 있는 ROM을 정리하면서 이런 작업을 조금 더 편하게 하기 위한 프로그램을 따로 만들고 있습니다.
물론 프로그래머는 아니기 때문에 AI의 도움을 많이 받고 있습니다.
ROM을 등록하면
어떤 게임인지 확인하고,
CRC32, MD5, SHA1 같은 해시를 계산하고,
가지고 있는 패치가 요구하는 원본과 맞는지 확인하고,
가능하면 패치까지 한 곳에서 처리하는 방향입니다.
처음에는 단순히 게임 목록을 정리하려고 시작했는데,
한글패치를 하나씩 적용하다 보니 결국 패치 관리 기능까지 들어오게 됐습니다.
아직 만드는 중이라 완성됐다고 하기는 어렵지만, 실제로 제가 불편했던 부분을 하나씩 해결하면서 기능을 추가하고 있습니다.
한글패치가 실패하면 원본부터 확인해보자
한글패치를 처음 해보면 프로그램 사용법이나 패치 파일부터 의심하기 쉽습니다.
하지만 패치 자체에 문제가 없다면 가장 먼저 확인해볼 것은 원본 ROM이 맞는가입니다.
파일명이 같다고 같은 ROM은 아닙니다.
용량이 같다고 같은 ROM도 아닐 수 있습니다.
국가와 버전이 같아 보여도 실제 파일이 다를 수도 있습니다.
그래서 제작자가 해시를 알려줬다면 그 값부터 확인하는 것이 가장 빠릅니다.
결국 한글패치에서 해시는
복잡한 컴퓨터 용어라기보다 내가 가진 파일이 제작자가 사용한 원본과 같은지 확인하는 번호
정도로 이해하면 충분한 것 같습니다.
저도 예전에는 해시라는 단어가 나오면 조금 복잡하게 느껴졌는데,
한 번 패치 실패를 겪고 나니 왜 제작자들이 굳이 CRC32나 MD5, SHA1 값을 적어두는지 이해가 됐습니다.
아무튼 한글패치를 준비한다면
패치파일보다 먼저 원본 ROM의 해시부터 확인해보는 것.
생각보다 많은 오류를 여기에서 걸러낼 수 있습니다.

