오랜만이네요.
--------------------------------------------------------------------------------------------------------------
한동안 문제 없는 줄 알고 글 안 올리고 있다가 어떤 분의 덧글을 보고 문제가 있다는걸 알게 됐습니다.
'고' 라는 글자가 '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 명령어를 지나는 순간 EAX 가 0x6F 로 변했습니다.
어라... 0x6F 는 'o'... CALL 4058F5 가 문제였던거군요.
그러면 CALL 4058F5만 NOP 으로 만들면 되나? 그건 아닙니다. 만약 그렇게 하면 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에 처음으로 걸리니까
EAX 가 0x2E53이더군요. '한글 테스트 ' 부분에서 '한' 글자 처리 부분인 것 같네요.
F8 누르면서 명령어 진행하니 어느새 PUSH EAX 에서 EAX가 0xC7D1로 돌아와 있더군요.
그리고 CALL 477AF9... 이 함수는 대충 보니까 글자 출력 함수 같네요.
함수 확인하고서 다시 수정했습니다.
CALL 4058F5 -> NOP, ADD ECX, EAX -> ADD EAX, ECX
그리고 이에 맞게 함수를 수정했습니다.
글자 출력에 필요한 부분만 골라내서 쏙 뽑았습니다.
저 부분을 제외한 명령어들은 CALL 4058F5에 의해 변경된 ASCII 코드를 복구하는 기능이지만...
CALL 4058F5 를 없애고, 최종 ASCII 코드를 EAX에 저장하게했으니 그 명령어들은 다 필요없고,
오직 최종 ASCII 코드만 출력하면 되니까 이렇게 저렇게 수정하다보니 함수가 짦아졌네요.
그럼 다시 실행해보면...
와~ 잘 나옵니다. '나고야성입니다.' 라고 잘 뜨네요. ㅎ
작업하면서 쓴 글이라 뭔가 빠진 부분도 있을테지만
상관은 없을 것 같군요. 뭐 궁금하신게 있다면 덧글 남기시면 됩니다~
뭐 생각보다 오래걸리긴 했지만 해결하고 나니 뿌듯합니다. ㅋ
'게임 한글화 > 직전신장전' 카테고리의 다른 글
직전신장전 한글 띄우기 작업 - 5 (2) | 2010.11.12 |
---|---|
직전신장전 한글 띄우기 작업 - 4 (0) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 3 (0) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 2 (1) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 1 (3) | 2010.11.12 |