KOEI/신장의 야망 시리즈

신장의 야망 천하창세 MSG 파일에 숨겨진 암호화 기법에 관하여.

K66Google 2022. 5. 25. 20:00

이 글은 회고 시점으로 쓰는 글이다.

신장의 야망 천하창세 MSG 파일의 구조는 혁신, 천도, 창조, 대지와 동일하다. 심지어 폰트는 혁신 폰트에서 뒤의 확장자만 n11로 바꿔주면 호환도 가능하다.

그러나 지금까지 천하창세는 메시지 한글화의 삽조차도 뜨지 못했다. 그 이유는 다른 시리즈와 달리 천하창세의 MSG 파일은 암호화가 되어 있어서 Crystaltile2 같은 헥스 에디터로 열어도 일본어 문장을 확인할 수 없었기 때문이었다.

 

2022년 5월, 지금까지의 코에이 게임 한글화 경험을 바탕으로 나는 마침내 천하창세 MSG에 대한 해독을 이루어냈다. 지금은 예전에 제작한 대지PK MSG 에디터(링크)에서 천하창세 MSG 파일들의 복호화/암호화 기능을 지원하고 있다.

 

그러나, 해독은 불과 며칠만에 이루어낸 것이 아니었다.

이 이야기를 시작하려면 2019년까지 거슬러 올라가야 한다.

 

 

* 2019년

신장의 야망 혁신과 천도에는 Bfile01이라는 이름의 파일이 있다.

바로 무장열전이 기록된 MSG 파일인데, 이 파일은 천하창세에도 있다.

Bfile01의 맨 처음에 나오는 무장은 바로 려기계광(蠣崎季広, 가키자키 스에히로)이다.

혁신의 Bfile01에도, 천도의 Bfile01도 려기계광의 인물열전이 제일 맨 앞에 나온다.

그럼 천하창세의 Bfile01도 암호화때문에 알아볼 수는 없지만, 분명 려기계광의 무장열전이 맨 처음에 있을 것이 틀림없다... 라고 나는 생각했다.

그래서 Bfile01.n11에 대한 조사에 착수하기로 하였다.

 

 

파일 헤더값문장 파트 시작위치 값혁신, 천도의 MSG와 동일하였다. 이 부분은 암호화가 걸려있지 않았다.

 

 

그러나 문제는 문장 파트 시작지점부터였다.

문장을 가리키는 포인터들이 97 9E 79 E9... 이런 식으로 도저히 이해할 수 없는 바이트로 들어가있는 것이었다.

이때는 2019년 2월이었고, 내가 대지PK MSG 에디터를 만드느라 고생했을 때였다.

당시의 나는 NDS 게임 한글화만 경험이 있어서 Crystaltile2만 어느정도 다룰 줄 아는 수준이었다. 암호화를 해독하는 프로그램 제작 같은 건 꿈도 못 꿀 때였다.

 

 

그래도 집념만큼은 지금이나 그때나 똑같았는지, 당시의 나는 려기계광의 열전이 있을법한(!?) 곳을 아무렇게나 [수정하고 저장하고 실행하고 확인하는] 삽질을 해댔다. 그래서 대충 어느 글자가 어느 위치에 있는지 까지는 파악할 수 있었다.

 

 

맨 처음 문장 '려기가 4대 당주' 를 임의로 바꾸는 것까지는 성공했다.

다음은 어떤 바이트를 집어넣어야 내가 원하는 문자가 출력되는 지 알아내야 했다.

 

 

그걸 찾는 건 너무나도 고난의 과정이었다.

처음에는 대사 포인터 쪽을 뜯다가, 도저히 안되겠다 싶어서 대사 쪽에서 삽질을 하였다.

려기계광의 무장열전이 있는 위치는 알아냈으니까, 그 위치에서 계속 바이트를 바꿔가면서 게임 상에서 출력되는 글자들을 계속 옮겨 적었다.

 

---------------------------------

n11msg - 한자 - Shift_JIS값
00 00 - 璃 - 97 9E
00 01 - 痢 - 97 9F
...
01 00 - 満 - 96 9E
01 01 - 漫 - 96 9F
...
02 00 - 服 - 95 9E
02 01 - 福 - 95 9F
...
03 00 - 麦 - 94 9E
03 01 - 函 - 94 9F
...
04 00 - 到 - 93 9E
04 01 - 董 - 93 9F
04 02 - 糖 - 93 9C
04 03 - 統 - 93 9D
04 04 - 答 - 93 9A
04 05 - 筒 - 93 9B
04 06 - 祷 - 93 98
04 07 - 等 - 93 99
04 08 - 当 - 93 96
04 09 - 痘 - 93 97
04 0A - 灯 - 93 94
04 0B - 燈 - 93 95
04 0C - 湯 - 93 92
04 0D - 涛 - 93 93
04 0E - 盗 - 93 90
04 0F - 淘 - 93 91
(1보 전진 3보 후퇴를 반복하는 패턴을 보이고 있다.)
04 10 - 梼 - 93 8E
04 11 - 棟 - 93 8F
...
04 1E - 凍 - 93 80
04 1F - 刀 - 93 81

04 20 - 得 - 93 BE (* 3D - 61바이트 앞으로 이동.)
04 21 - 徳 - 93 BF
......
04 40 - 奈 - 93 DE
04 41 - 那 - 93 DF
......
04 60 - 2byte 공백 - 93 FE
04 61 - 없음           - 93 FF
04 62 - 入               - 93 FC
04 63 - 2byte 공백 - 93 FD
...
04 7E - 内 - 93 E0
04 7F - 乍 - 93 E1

04 80 ~ 04 9F - 없음 (*93E, 93F 대역까지 다 하면 930~932대역으로 올라가는 걸로 추정됨)
04 A0 ~ 04 BF - 없거나 쓰레기 문자? (* 933~934 대역으로 추정)
......
04 C0 - 顛 - 93 5E
04 C1 - 点 - 93 5F
...
04 DE - 邸(@) - 93 40 (Locale Emulator로 실행하면 정상 출력.)
04 DF - 鄭 - 93 41

04 E0 - 冬              - 93 7E
04 E1 - 2byte 공백 - 93 7F
...
04 FE - 伝 - 93 60
04 FF - 殿 - 93 61

------------------------------------

 

이런 식으로 말이다.

삽질 끝에 암호화된 바이트의 원래 Shift-JIS 값이 무엇인지에 대한 매칭표를 만들 수가 있게 되었다.

 

 

매칭표를 통해 TBL 파일을 만들고, 그걸 Crystaltile2에 입력하니 몇몇 글자들의 일본어 문장이 제대로 보이게 되었다.

그러나 문제가 있었다. 이렇게 해도 여전히 몇몇 문장들은 제대로 보이지 않았다.

또한, 앞쪽 2바이트와 뒷쪽 2바이트가 서로 규격이 맞지 않는다는 점도 있었다.

 

1F 01 F1 76

 

똑같은 亜자를 입력하는데, 앞쪽에서는 1F 01로 입력해야 나오고, 뒷쪽에서는 F1 76으로 입력해야 게임 상에서 정상적으로 출력이 되는 것이었다.

글자 하나에 바이트 하나가 매칭되야 하는데 왜 두 개가 매칭되는 것일까?

그 당시의 나로서는 도저히 해답을 알 수가 없었다.

결국 나는 약간의 문장을 Crystaltile2에서 볼 수 있게 된 것에 만족하기로 하고, 천하창세 MSG 연구에서 손을 뗐다.

 

그리고 시간은 쏜살같이 지나갔다...

 

 

* 2022년

 

태합입지전5 DX의 발매가 며칠 남지 않았을때, 나는 불현듯 다시 천하창세 MSG가 떠올랐다.

이유는 간단했다.

 

태합5 DX가 곧 발매된다. → 그러고보니 태합5 구판의 MSG/이벤트 파일은 암호화가 걸려있었는데? → 만약 DX판에서도 똑같이 암호화되어 있으면 어쩌지? → 그러고보니 천하창세 MSG도 암호화가 걸려있었는데? → 모처럼이니까 천하창세 MSG나 다시 들여다볼까?

 

...이런 생각의 흐름때문이었다.

 

 

이번에도 타겟은 Bfile01이다. 그러나 이번엔 천하창세와 혁신 양 쪽의 Bifle01을 열고, 바이트 위치부터 비교해보기로 하였다.

구조는 확실히 동일하다. 단지 천하창세는 코드가 암호화되고, 혁신은 그렇지 않은 것 뿐이다.

 

혁신에서 00 00 00 00인 것이 천하창세에선 E9 97 9E 79... 과연 무슨 비밀이 숨겨져있는 것일까?

고민하고 있는데, 갑자기 이러한 생각이 머리를 스치고 지나갔다.

 

혹시 이거... 바이트마다 고유코드를 쓰고 있는 것 아닌가?

예전같으면 이런 발상은 떠올리지도 못했을 것이다.

그러나 공교롭게도 삼국지1 한글화때 하도 고유코드에 시달리다보니 이젠 이런 발상까지도 할 수 있게 되었다.

 

어차피 지금 안 하면 나중에는 할 시간도 없을 것이다.

나는 2019년에 연구했던 자료를 다시 띄우고, 각 바이트별 예상 고유코드표를 만들어보기로 하였다...

그 코드표는 다음과 같다.

 

 

총 4개의 고유코드 타입을 예상해보았다.

바이트들은 '문장 파트 시작 지점'부터 [첫번째/두번째/세번째/네번째] 코드로 암호화되고, 4바이트씩 계속 파일 끝까지 반복되는 형태로 보여진다.

2019년 조사때는 내가 '2바이트' 라는 관점에 너무 빠져있었다.

한자나 한글이 2바이트니까, 2바이트씩 짝지어서 암호화를 이루는 것으로 착각하고 있었던 것이다.

 

아무튼 내 고유코드 예상이 맞는지 간단하게 테스트해보기로 하였다.

신장의 야망 혁신, 천도 등의 MSG 파일에는 맨 처음에 'Error'라는 문장이 들어가있다. 어쩌면 천하창세에도 있지 않을까하는 생각이 들어서, 그런 MSG가 있는지 찾아보기로 하였다.

 

문자 ASCII 암호화
E 0x45 D2 (첫번째 고유코드)
r 0x72 EC (두번째 고유코드)
r 0x72 0B (세번째 고유코드)
o 0x6F 86 (네번째 고유코드)
r 0x72 E5 (다시 첫번째 고유코드 - 반복)

 

고유코드표를 통해 알아낸 예상 암호화 값은 D2 EC 0B 86 E5... 그걸 Crystaltile2 상에서 검색해보니까...

 

 

 

있었다.

아무래도 정답에 도달한 모양이다.

이제 이 분석을 토대로 복호화/암호화 기능을 프로그램으로 구현하는 일만 남았다.

그러나 다음날 태합5 DX가 발매되는 바람에 잠시 그쪽으로 한 눈을 팔게 되면서 기능 구현은 4일 후에 이루어졌다.

 

 

'대지PK MSG 에디터'에 천하창세 복호화/암호화 기능을 구현하기로 하였다. 기법은 그냥 무식하게 if문으로 비교해서 일치하면 교체하는 방식으로 만들었다.

 

 

그리고...

마침내 천하창세의 복호화된 메시지도 대지PK MSG 에디터에서 편집할 수 있게 되었다.

3년만에 여기까지 이루어냈다... 이제 천하창세 한글화의 길도 열리게 된 것이다.

다만 천하창세 MSG 중 yabou.n11은 구조가 약간 다르게 되어있어서 이에 대한 대응책이 필요할 것 같다.

 

이상으로 신장의 야망 천하창세 MSG 파일에 대한 회고를 마친다.

그럼 이만...