본문 바로가기

게임 한글화/직전신장전

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

벌써 4번째군요.

한글 띄우기가 잘 됐으면 좋겠다는... ㅎ

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

직전신장전 한글 띄우기 작업 - 3 에서 공백이 출력 안 되는 원인을 알아봤습니다.

공백의 ASCII 코드인 0x20 이 아닌 0x829F 로 출력되는 거였죠.


그런데 공백만 그렇게 출력되는걸까요? 1Byte의 모든 문자는 외계어로 출력되는 것이 아닐까요?

그건 아직 해보기전까지는 모르죠. 그럼 확인을 해봐야 하니 항상 그렇듯이 ollydbg -> ekd4.exe 열기~...

하고서 UltraEdit NB000.EEX를 열고,

'여기도 한글 테스트' 부분을 '여기도a한글b테스트' 라고 수정하고 저장 꾹 눌러줍시다.


ollydbg로 돌아가서 Breakpoint를 다시 설정해야합니다.


기존의 Breakpoint는 F2를 눌러 없애버리시고 위의 스샷과 같이 ADD ECX, EAX 밑에 Breakpoint를 겁시다.

ADD ECX, EAX <= 이게 바로 최종 ASCII 코드를 구하는 작업입니다. 그렇다고 ADD ECX, EAX 에 Breakpoint를 걸면

ADD 명령어가 진행되기 전에 걸리기 때문에 바로 그 밑의 명령어에 Breakpoint를 걸어주는 것입니다.

Breakpoint를 걸었으면 이제 F9를 눌러 직전신장전을 실행합시다.


게임 시작하고 Breakpoint에 걸리면 F9 를 5번, 4번 눌러주시고, 3번 눌러줍시다.

(이유는 직전신장전 한글 띄우기 작업 - 3에 나와있는 것과 같은 원리.)


그런데 왜 전 글 에서는 F97번, 4번 눌렀었는데 이번엔 F95번, 4번 눌러요? 하시는 분도 있을텐데...;

Breakpoint 걸린 주소는 2Byte 문자에 해당될 때만 저 주소를 지나갑니다.

'한글 테스트 '' ' (1Byte)가 2개 있으니, F9를 7번에서 5번 눌러야 되겠죠 ㅎ;

이해 못하시는 분은 그리 중요한 것은 아니기 때문에 그냥 훑어보시기만 하셔도 됩니다.


다시 본론으로 돌아와서... 3번 누르고나서 EAX 를 확인하니 'a'의 ASCII 코드가 0x82E0 이군요.

'b' 의 ASCII 코드도 확인하기위해서 F9를 다시 3번 누릅시다.

'b'의 ASCII 코드는 0x82E1 이네요.

이게 무슨 상관 있냐고요? 그럼 원래의 ASCII 코드와 비교해봅시다.

 문자  원래 ASCII EAX (최종 ASCII 코드)
 ' ' (공백)
 0x20
0x829F
 'a'
 0x61 0x82E0
 'b'  0x62 0x82E1

으음. 무슨 상관이 있을까요? 저는 머리를 굴리며 이것 저것 하다 보니 알아냈습니다.

0x829F - 0x20 = 0x82E0 - 0x61 = 0x82E1 - 0x62  !...

그러니까 공통점은 원래 ASCII 코드에 0x827F 가 더해집니다. 왜 이런 짓을 하는지는 모르겠지만

제 예상으로는 반각을 전각으로 처리할 때 하는 것 같기도 하지만...


여튼 0x827F 를 더한다... 그러면 명령어로는...?  ADD 레지스터, 827F 이겠죠.

Ctrl + F 로 레지스터에는 EAX, ECX, EDX 집어넣어서 찾아봅시다.


저는 ADD ECX, 827F 로 찾아졌군요.



그러면 여기에다 Breakpoint를 걸고 기존의 Breakpoint 는 제거합니다.

[스샷의 RedLine은 ECX에 원래의 ASCII 코드를 저장하는 명령어입니다.]

그리고 Ctrl + F2 (Restart) 하고 다시 F9로 실행~


Breakpoint에 걸리고서 ECX 값을 보니 'a' 의 ASCII 코드인 0x61이 보이네요.

그런데 '한글 테스트 ' 의 공백 0x20 값은 왜 없죠?

제 추측으로는 아마 그 '한글 테스트 ' 뜨는 부분은 Breakpoint 걸린 함수를 Call 하지 않는가 봅니다.

그렇기 때문에 공백도 잘 출력되는 것이고...



ADD ECX, 827F 명령어 수행을 못하게 하기 위해서는 아예 명령어를 없애면 되겠죠?

=> 첫번째 방법 (Space Bar 를 눌러 창을 띄우고 nop을 적고 수정한다. Fill with NOP's 는 Check 한다.)                        


=> 두번째 방법 (수정하고자 하는 명령어에다가 오른쪽 마우스를 누르고 위의 스샷처럼 하면 된다.)


그러면 ADD ECX, 827F 명령어가 NOP 5개로 변합니다.

당연히 저장해줘야겠죠. 저장 방법은 직전신장전 한글 띄우기 작업 - 1에 나와 있습니다.


저장하고서 ollydbg는 끄고 그냥 게임을 실행해봅시다.



-_-; 난감하군요. 이번엔 첫번째 공백 부분부터 다 잘리네요. 이건 뭐 -_-;




'직전신장전 한글 띄우기 작업 - 5' 에서 계속~