벌써 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에 나와있는 것과 같은 원리.)
그런데 왜 전 글 에서는 F9를 7번, 4번 눌렀었는데 이번엔 F9를 5번, 4번 눌러요? 하시는 분도 있을텐데...;
저 Breakpoint 걸린 주소는 2Byte 문자에 해당될 때만 저 주소를 지나갑니다.
'한글 테스트 ' 는 ' ' (1Byte)가 2개 있으니, F9를 7번에서 5번 눌러야 되겠죠 ㅎ;
이해 못하시는 분은 그리 중요한 것은 아니기 때문에 그냥 훑어보시기만 하셔도 됩니다.
다시 본론으로 돌아와서... 3번 누르고나서 EAX 를 확인하니 'a'의 ASCII 코드가 0x82E0 이군요.
'b' 의 ASCII 코드도 확인하기위해서 F9를 다시 3번 누릅시다.
'b'의 ASCII 코드는 0x82E1 이네요.
이게 무슨 상관 있냐고요? 그럼 원래의 ASCII 코드와 비교해봅시다.
으음. 무슨 상관이 있을까요? 저는 머리를 굴리며 이것 저것 하다 보니 알아냈습니다.
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' 에서 계속~
한글 띄우기가 잘 됐으면 좋겠다는... ㅎ
-----------------------------------------------------------------------------------------------------------------
직전신장전 한글 띄우기 작업 - 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에 나와있는 것과 같은 원리.)
그런데 왜 전 글 에서는 F9를 7번, 4번 눌렀었는데 이번엔 F9를 5번, 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 명령어 수행을 못하게 하기 위해서는 아예 명령어를 없애면 되겠죠?
=> 두번째 방법 (수정하고자 하는 명령어에다가 오른쪽 마우스를 누르고 위의 스샷처럼 하면 된다.)
그러면 ADD ECX, 827F 명령어가 NOP 5개로 변합니다.
당연히 저장해줘야겠죠. 저장 방법은 직전신장전 한글 띄우기 작업 - 1에 나와 있습니다.
저장하고서 ollydbg는 끄고 그냥 게임을 실행해봅시다.
-_-; 난감하군요. 이번엔 첫번째 공백 부분부터 다 잘리네요. 이건 뭐 -_-;
'직전신장전 한글 띄우기 작업 - 5' 에서 계속~
'게임 한글화 > 직전신장전' 카테고리의 다른 글
직전신장전 한글 띄우기 작업 - 6 (4) | 2010.11.12 |
---|---|
직전신장전 한글 띄우기 작업 - 5 (2) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 3 (0) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 2 (1) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 1 (3) | 2010.11.12 |