(파시스트가 될랍니다. Waiting For The Worms)





지난번에는 바이오하자드 2를 통해서 고유코드에 할당된 폰트를 교체하는 것으로
한글화하는 방법을 알려드렸는데 이번에는 실행 파일을 디버거를 통해 디스어셈블해서
한글화하는 방법을 살펴 보겠습니다. 대상 게임은 어드밴스드 대전략 2001 + PK
분석도 저번과는 달리 좀더 어드밴스드한 과정을 거칩니다ㅋ

사실 이 게임은 개인적인 이유가 있어서 비공개로 한글화 중이었습니다.
하지만 완성이 되더라도 공개할 예정은 없으니 뜻 있는 분들이 새로 진행하시면 좋겠군요.


일단 세이프디스크가 적용된 게임이라 세이프디스크를 제거해야 디버깅할 수 있습니다.
시디의 실행 파일은 버전이 2.03에 세이프디스크 2
업데이트 파일은 버전이 2.15에 세이프디스크 3으로 되어 있는데
세이프디스크 3은 현재 제대로 제거가 안 되는지라 2.15 업데이트 설치 후
프로텍터가 제거된 2.03 실행 파일을 덮어씌우면 2.15 환경으로 실행할 수 있습니다.
세이프디스크 제거는 각자 구글링을 통해서~






역공학에서 일반적으로 많이 쓰이는 ollydebuger 입니다. olly로 실행 파일을 열어 보면
이렇게 어셈블리로 뭔가가 주르륵 나오는데 다른 건 필요 없고 폰트를 정의하는 함수를
찾아서 Charset(캐릭터셋: 언어 지정)을 수정하는 겁니다.

CreateFontA
CreateFontIndirectA

이 두 가지 함수가 일반적으로 쓰이는데 대전략은 CreateFontIndirectA 사용하는군요.
CreateFontA와는 달리 CreateFontIndirectA는 로그폰트라는 구조체를 호출하는데
CreateFontA보다는 값을 찾기가 조금 까다롭습니다.


참고로 이스 6가 CreateFontA 함수를 사용합니다. 찾기도 쉽죠 :D

이스 6

PUSH ys6_win.0053A66C           ; /FaceName = "MS Pゴシック"
PUSH 12                                  ; |PitchAndFamily = VARIABLE_PITCH|FF_ROMAN
PUSH 2                                   ; |Quality = PROOF_QUALITY
PUSH 0                                   ; |ClipPrecision = CLIP_DEFAULT_PRECIS
PUSH 4                                   ; |OutputPrecision = OUT_TT_PRECIS
PUSH 80   <- 81로 수정          ; |CharSet = 128.
PUSH 0                                   ; |StrikeOut = FALSE
PUSH 0                                   ; |Underline = FALSE
PUSH 0                                   ; |Italic = FALSE
PUSH 190                                ; |Weight = FW_NORMAL
PUSH 0                                   ; |Orientation = 0
PUSH 0                                   ; |Escapement = 0
PUSH 0                                   ; |Width = 0
PUSH ESI                                ; |Height
CALL DWORD PTR DS:[<&GDI32.CreateFontA>] ; \CreateFontA


*캐릭터셋 128(16진수 80)은 일본어, 129(16진수 81)은 한국어입니다.


FaceName에 대해선 언급을 안 했는데 사용할 폰트를 지정하는 겁니다.
한글 폰트인 Gulim이나 batang 등으로 수정해 주면 되지만 윈도의 fontlink 때문에
굳이 수정하지 않아도 굴림으로 출력되지만 안정적인 실행을 위해서 수정을 해주는 편이
좋을 겁니다. fontlink에 대해선 다음 포스팅에서 다루도록 하겠습니다.






어쨌든 브레이크포인트니 뭐니 해서 지지고 볶아 값을 추적하면 스샷과 같은 부분이
나옵니다. 이 부분을 아래와 같이 수정합니다. 아까 81이 한국어라고 했죠?
 

00403361  |. C605 C7B84A00 >MOV BYTE PTR DS:[4AB8C7],80 <-81로 수정


중간에 jmp 시켜서 코드를 추가하는 방법도 있지만 그 방법을 이해하시는 분이라면
제 글을 보고 있을 필요가 없기 때문에 생략하겠습니다. 사실은 그렇게 하다 망했어요.






성공하면 이렇게 한글이 출력됩니다. S-JIS 코드와 한글 확장완성형 코드가 겹치는
부분이 있기 때문에 한국어 Charset으로 바꾸면 일본어 대신 이렇게 확장완성형 글자가
출력됩니다. 일명 '뷁어'






게임의 메뉴는 이런 과정을 거치지 않고 리소스 에디터로 그냥 수정하면 됩니다.
유틸리티 한글화에 많이 사용하는 프로그램이죠. 당연히 메뉴가 아닌 게임 내
텍스트는 수정할 수 없습니다 :)







이제 '뷁어'가 나오는 걸 확인했으니 뷁어에 해당하는 원문 대사를 찾아서 헥스에디터
등을 이용해 한글로 수정합니다. 대사 포인터 구조가 아주 친절하게 되어 있어서
대사 확장에도 어려움이 없습니다. 다만 공간이 부족할 뿐이죠ㅋ

전반적인 스크립트는 AD3Data.dll 파일에 들어 있으며 SCENARIO 폴더에 있는 파일에도
일부가 각각 들어 있습니다. 지형이나 인명 등이 누락되어 있는 걸 봐선 다른 파일에도
스크립트가 있을 텐데 아직 확인해 보지는 않았습니다. 한번 찾아보세요 :)

다만 한 가지 난감한 점이라면 문장을 조합해서 사용합니다. 복잡한 조합은 아니고

私は学生 + です
               ですよ
               ですね
               ですわ
               だな
               だぞ

이런 식으로 조합이 됩니다. 동일한 말을 인물에 따라 다른 뉘앙스로 표현하려고
저렇게 한 것 같습니다. 큰 문제는 없지만 必要です처럼 우리말과는 안 맞는 경우가 있으니
머리를 굴려봐야겠지요. 조합되는 뒷 부분을 없애고 전문에 다 붙여 버리는 방법도
생각할 수 있는데 실제 출력되는 문장을 보지 않으면 어떻게 조합되는지 모르고
포인터 수정이 많아져서 좀 귀찮아지는 면도 있습니다.  






짠~ 이제 제대로 된 한글이 출력이 됩니다. 물론 폰트가 아닌 그래픽으로 된 부분도 있어서
완전 한글화하려면 그래픽 수정도 함께 해야 하지만 일단은 잘 출력되는군요.



.
.
.
00404105  |. 81E2 FF000000     ||AND EDX,0FF
0040410B  |. 81FA 81000000     ||CMP EDX,81
00404111  |. 7C 12                 ||JL SHORT ad3game.00404125
00404113  |. 8B85 D4FDFFFF   ||MOV EAX,DWORD PTR SS:[EBP-22C]
00404119  |. 25 FF000000         ||AND EAX,0FF
0040411E  |. 3D 9F000000        ||CMP EAX,9F
00404123  |. 7E 28                  ||JLE SHORT ad3game.0040414D
00404125  |> 8B8D D4FDFFFF  ||MOV ECX,DWORD PTR SS:[EBP-22C]
0040412B  |. 81E1 FF000000     ||AND ECX,0FF
00404131  |. 81F9 E0000000      ||CMP ECX,0E0
00404137  |. 7C 51                  ||JL SHORT ad3game.0040418A
00404139  |. 8B95 D4FDFFFF    ||MOV EDX,DWORD PTR SS:[EBP-22C]
0040413F  |. 81E2 FF000000      ||AND EDX,0FF
00404145  |. 81FA FC000000     ||CMP EDX,0FC
.
.
.

어드밴스드 대전략 같은 경우, Charset 수정만으로도 쉽게 한글이 출력되었지만
1, 2바이트 필터링 구문이 존재해서 수정을 안 하면 제대로 출력되지 않는 경우가
많습니다. 거기에 이상한 연산까지 붙어 있으면 사람 미치죠-_- 상기의 것은
어드밴스드 대전략의 것인데 수정을 안 해도 잘 출력이 되는군요. 다행입니다.



이렇게 해서 어드밴스드 대전략의 한글화 테스트가 끝났습니다.
지금 소개한 방법은 일본 18금 게임, 그러니까 소위 말하는 미연시 한글화에 많이
사용되는 방법입니다. 영문 게임의 일본어판을 이용해서 한글을 출력하는 방법에도
응용할 수 있겠네요. (일본판을 직접 구할 필요 없이 해당 업데이트 패치의
아카이브를 풀어 버리면 필요로 하는 것을 대부분 구할 수 있습니다ㅎㅎ)
자체 폰트를 사용하는 경우는 좀 더 어려워서 불가능한 건 아니지만 이 방법을 적용하기
어렵습니다. 1바이트 영문 게임에도 해당이 안 되는군요. 요즘 영문 게임이야 유니코드를
지원하는 경우가 많아 폰트 교체만으로도 손쉽게 해결되지만요 :)



중국 사이트를 돌아다니면서 1바이트 영문 게임을 2바이트가 지원되게 하는
강좌(?) 비슷한 걸 몇 개 보긴 했는데 case by case라 그런지 잘 안 되는군요.
뭐, 궁극적으로 가자면 로더를 통해 함수 후킹하는 쪽으로 가야겠지만
아직은 그럴 실력이ㅋ 사람들이 노하우 공개를 많이 했으면 좋겠습니다 :D
기회가 돼서 제대로 분석해 볼 시간이 마련되면 좋겠네요.

다음번 포스팅에선 중간에 잠깐 언급한 것처럼 fontlink를 이용해 한글화하는
방법을 살펴보겠습니다. 요게요게 또 재미있습니다.
바이오하자드에 이어 외도가 계속되는군요ㅋ

그럼.



어때요, 참 쉽죠?


Posted by NSM53 Project