본문 바로가기

게임 한글화/직전신장전

직전신장전 한글 띄우기 작업 - 6


오랜만이네요.

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


한동안 문제 없는 줄 알고 글 안 올리고 있다가 어떤 분의 덧글을 보고 문제가 있다는걸 알게 됐습니다.

이렇게 수정하고 게임을 실행해봤습니다.


'고' 라는 글자가 'o'('c'처럼 보이긴 하지만 'o'입니다) 라는 글자로 표현되더군요...

참 난감했습니다. 이건 또 어디서부터 시작해야 해결 할 수 있을지...;

아, 먼저 시작하기 전에 '고' 의 ASCII '0xB0ED', 'o'의 ASCII'0x6F' 입니다.

일단은 ollydbg 를 켜봅시다. 그리고 직전신장전 한글 띄우기 작업 - 4 에 나온 ADD ECX, EAX 를 찾아갑시다.


이 부분은 최종 ASCII 코드를 구하는 부분이였는데요. 먼저 '고'가 어떤 ASCII 코드로 출력되는지 확인해야하므로

ADD ECX, EAX 밑 명령어Breakpoint 를 걸고서  F9 눌러 실행해봅시다. 

직전신장전 한글 띄우기 작업 - 4 나온거와 같이 F9 5번, 4번, 1번 눌러줍시다.

그러면 '고' 의 ASCII 구하는 작업이 시작되고 PUSH ECX 에 걸리고 ECX를 보니... '0xB0ED'... 응?

별 문제가 없네요. -_-; 

아직은 모르니 F8로 진행해봅시다. 그런데 CALL 4058F5 명령어를 지나는 순간 EAX0x6F 로 변했습니다.

어라... 0x6F'o'... CALL 4058F5 가 문제였던거군요.

그러면 CALL 4058F5NOP 으로 만들면 되나? 그건 아닙니다. 만약 그렇게 하면 EAX가 아닌 ECX에 최종 ASCII 코드

의 값이 담기게 됩니다. 명령어들을 잘보면 [EBP-4]EAX 를 저장하는데 ECX에 담겨있으면 아무 쓸모가 없게 되고

엉뚱한 문자만 출력하게 되겠지요.

그러니까 수정해야할 명령어는 CALL 4058F5 뿐만 아니라 ADD ECX, EAX 도 수정해야합니다.

ADD ECX, EAX 는 본래 ECX = ECX + EAX 와 같은 기능입니다. 이걸 ADD EAX, ECX 로 바꾸게 되면

EAX = EAX + ECX 가 되므로 최종 ASCII 코드는 EAX에 담기게 됩니다. 그렇게 되면 아무 문제 없는 거죠~

그러면 결론적으로 CALL 4058F5 -> NOP, ADD ECX, EAX -> ADD EAX, ECX 로 수정합시다.


NOP 하는 방법은 2009/01/08 - [한글화 관련] - 직전신장전 한글 띄우기 작업 - 4

저장하는 방법은 2009/01/04 - [한글화 관련] - 직전신장전 한글 띄우기 작업 - 1

에 나와있습니다.


그리고 실행해보면...?

이런... 망할. 그런데...


여태까지 잘 나오던 '한글 테스트 ' 부분도 이상하게 나옵니다.


그래서 잘 생각해보니까 '고' 라는 글자만이 아닌 모든 ASCII 코드가 CALL 4058F5를 지나고 값이 바뀔텐데

왜 정상적으로 출력될까 하는 생각이 들어서 다시 수정한 명령어를 복구하고서 '한' 의 ASCII 코드 변화를 보니

0xC7D1 -> 0x2E53 이네요.

그러면 0x2E53 그대로 출력할 수는 없고 어디선가 반드시 값이 복구되어 출력될텐데....

노가다 하기는 시간이 없고 해서 생각 해보고 도저히 어떻게 해야할지 안 떠올라서 저번 글들을 살펴보면 뭔가 보이겠지

하고 살펴보다가 ADD EDX, 161, ADD EDX, 0E1 가 있더군요.

바로 보자마자 관련이 있을 것 같아 그 함수로 이동했습니다.

그 함수 맨 첫번째 명령어에 Breakpoint 걸고 실행해봤습니다. Breakpoint에 처음으로 걸리니까

EAX0x2E53이더군요. '한글 테스트 ' 부분에서 '한' 글자 처리 부분인 것 같네요.

F8 누르면서 명령어 진행하니 어느새 PUSH EAX 에서 EAX0xC7D1로 돌아와 있더군요.

그리고 CALL 477AF9... 이 함수는 대충 보니까 글자 출력 함수 같네요.

함수 확인하고서 다시 수정했습니다.

CALL 4058F5
-> NOP, ADD ECX, EAX -> ADD EAX, ECX

그리고 이에 맞게 함수를 수정했습니다.


글자 출력에 필요한 부분만 골라내서 쏙 뽑았습니다.

저 부분을 제외한 명령어들은 CALL 4058F5에 의해 변경된 ASCII 코드를 복구하는 기능이지만...

CALL 4058F5 를 없애고, 최종 ASCII 코드를 EAX에 저장하게했으니 그 명령어들은 다 필요없고,

오직 최종 ASCII 코드만 출력하면 되니까 이렇게 저렇게 수정하다보니 함수가 짦아졌네요.


그럼 다시 실행해보면...

여기까진 잘 나오고...!


와~ 잘 나옵니다. '나고야성입니다.' 라고 잘 뜨네요. ㅎ



작업하면서 쓴 글이라 뭔가 빠진 부분도 있을테지만

상관은 없을 것 같군요. 뭐 궁금하신게 있다면 덧글 남기시면 됩니다~

뭐 생각보다 오래걸리긴 했지만 해결하고 나니 뿌듯합니다. ㅋ