으아... 뭘 해도 해도 끝이 없는 작업 같군요.
뭐 될 때까지 하면 언젠간 끝나겠죠.
-----------------------------------------------------------------------------------------------------------------
ADD ECX, 827F 까지 찾아서 명령어를 없앴지만 이번엔 글자가 잘려서 출력되는 결과를 낳아버렸습니다. -_-;
뭐 지금은 해결할 방법을 모르니 원인을 찾기 위해 ollydbg -> ekd4.exe 파일 열고....
어느 문제가 있는지 일단 Breakpoint 를 걸어야 한다.
MOV WORD PTR SS:[EBP-8], CX 에다가 Breakpoint를 걸자.
그리고 언제나 그렇듯이 F9를 눌러 실행~
Breakpoint 에 걸리고 F8로 한 명령어씩 실행해봅시다.
대충 명령어를 보자하니... 1Byte ASCII 코드를 CL(ECX)에 저장하고 CX(ECX의 하위 2Byte)를 EBP-8에 저장.
그리고 EBP+C 의 값을 1 증가 시키고... EAX에 ASCII 코드 저장, ECX에 EBP + 8 값 저장하고..
여기가 포인트인 것 같군요. ECX(EBP+8) 주소에 AH(AX의 상위 1Byte)를 저장.
원래 EAX는 ADD ECX, 827F가 있을 때 2Byte까지 쓰였지만
ADD ECX, 827F 가 없어짐으로 인해 1Byte까지밖에 안 쓰입니다.
하지만 다른 명령어에선 ADD ECX, 827F 명령어가 없어졌다는 것을 알리가 없겠죠. -_-;
그래서 그냥 EAX(0x0020) 에서 상위 1Byte인(AH) 0x0 을 읽어서
EBP+8에 저장한겁니다.
결론은 대사 중간에 ASCII 코드 0x0이 들어가서 대사가 거기에서 그냥 잘리고 다음 대사로 넘어가는 것이죠.
뭐 여차저차 하다 원인은 알아냈습니다. 이제 해결하는 방법 뿐인데...
일단은 EBP+C와 EBP+8에 대해 더 자세히 알아봐야합니다.
EBP + 8 , EBP + C 값은 오른쪽 아래에 창 보시면 나와있습니다.
그럼 저 주소를 찾아가야하는데요. CPU 창이 아닌 밑에 있는 Dump 창에서 찾아갑시다
Ctrl + G 를 눌러 먼저 EBP + 8 의 값을 적고 'OK' 를 누릅시다.
그러면 알 수 없는 외계어가 뜨는데 위로 1칸만 올라갑시다.
위의 스샷처럼 '여기도' 문자가 보이고 바로 다음에 ASCII 0x00 값이 보이는군요.
'여기도' 까지만 있지, 다른 문자는 보이지 않는군요.
[참고] 만약 스샷처럼 ASCII dump가 아니라면 오른쪽 마우스 -> Text -> ASCII (64 chars) 선택하시면 됩니다.
이번엔 위에서 나온 방법대로 Ctrl + G 를 눌러 EBP + C 의 주소를 찾아갑시다.
찾아간다음에 역시 1칸 올라가면...
'여기도a한글b테스트' 문자가 보이고 마지막으로 0x00 으로 끝맺음이네요.
이걸로 짐작해보아 EBP +8 에서는 문자가 모두 다 저장되어 있지 않고, EBP + C 에는 모든 문자가 저장되어 있으니
EBP + C 의 에 있는 값을 저장해 EBP + 8 에 넣고
결과적으로는 EBP + 8 에 저장되어 있는 문자들을 읽는 것 같습니다.
EBP + 8 과 EBP + C에 대해서는 알아봤으니 다시 Breakpoint 가 걸려있던 주소로 이동.
(주소 이동까지는 아니고, CPU 창으로 이동.)
[참고]
0040ED0C . 66:894D F8 MOV WORD PTR SS:[EBP-8],CX
0040ED10 . FF45 0C INC DWORD PTR SS:[EBP+C]
0040ED13 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0040ED16 . 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
0040ED19 . 8821 MOV BYTE PTR DS:[ECX],AH
0040ED1B . FF45 08 INC DWORD PTR SS:[EBP+8]
0040ED1E . 8A45 F8 MOV AL,BYTE PTR SS:[EBP-8]
0040ED21 . 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
0040ED24 . 8801 MOV BYTE PTR DS:[ECX],AL
0040ED26 . FF45 08 INC DWORD PTR SS:[EBP+8]
이 명령어들을 해석하자면 ASCII 코드가 저장되어 있는 ECX를 EBP - 8에 저장하고
EBP + C 의 값을 1 증가 (즉, 다음 값을 읽을 준비 하는 것.)
EAX 에는 다시 ASCII 코드를, ECX 에는 EBP + 8의 값을 저장하고 ECX 주소에 AH 를 저장.
그리고 EBP + 8을 1 증가 (다음 값을 넣기 위해 주소 1증가.)
그리고 똑같은 작업 한 다음 AL 을 ECX에 저장합니다.
그리고 다시 EBP + 8을 증가시키죠. (다음 작업을 위한 준비.)
그러면 해결을 위해서는 어떤 명령어를 없애야 할까요?
INC DWORD PTR SS:[EBP+C] 명령어를?
이 명령어는 문자를 읽어오려는 주소를 1증가시키는 것뿐이지. 다음 명령어에는 영향을 주지 않는 것 같군요.
MOV ECX,DWORD PTR SS:[EBP+8], MOV EAX,DWORD PTR SS:[EBP-8] 이 명령어?
이 명령어도 역시 레지스터에 저장만 할 뿐이지, 다른 의미는 없죠. 없앨 필요는 없는 듯 하군요.
MOV BYTE PTR DS:[ECX],AH, INC DWORD PTR SS:[EBP+8] 그럼 이거?
이건... 없애야합니다. 원인을 볼 때 AH 때문에 일어난 현상이니, BYTE PTR DS:[ECX], AH
명령어는 없애버려야 합니다.
그리고 다음에 나오는 INC DWORD PTR SS:[EBP+8] 도 없애야하겠죠. 원래는 AH 를 저장했기 때문에
다음 값을 저장하기 위해 1을 증가시키는 건데 MOV BYTE PTR DS:[ECX],AH 명령어가 없어지는 이상
INC DWORD PTR SS:[EBP+8] 이 명령어는 필요가 없게되죠.
그렇다면 이 명령어들을 없애봅시다. (직전신장전 한글 띄우기 작업 - 4)
그리고 저장~ (직전신장전 한글 띄우기 작업 - 1)
기대를 하며 실행을 해보면....!
와와와와와와우~~~~~~~~~~!
드디어 잘 출력이 됩니다. 얼마나 고생을 했는지.. 흑흑.
이제 이걸로 직전신장전 한글 띄우기 작업도 끝난 것 같군요...
뭐 진행하다가 또 문제점 보이면 글 올려야겠죠. -_-;
여튼 끝~
뭐 될 때까지 하면 언젠간 끝나겠죠.
-----------------------------------------------------------------------------------------------------------------
ADD ECX, 827F 까지 찾아서 명령어를 없앴지만 이번엔 글자가 잘려서 출력되는 결과를 낳아버렸습니다. -_-;
뭐 지금은 해결할 방법을 모르니 원인을 찾기 위해 ollydbg -> ekd4.exe 파일 열고....
어느 문제가 있는지 일단 Breakpoint 를 걸어야 한다.
MOV WORD PTR SS:[EBP-8], CX 에다가 Breakpoint를 걸자.
그리고 언제나 그렇듯이 F9를 눌러 실행~
Breakpoint 에 걸리고 F8로 한 명령어씩 실행해봅시다.
대충 명령어를 보자하니... 1Byte ASCII 코드를 CL(ECX)에 저장하고 CX(ECX의 하위 2Byte)를 EBP-8에 저장.
그리고 EBP+C 의 값을 1 증가 시키고... EAX에 ASCII 코드 저장, ECX에 EBP + 8 값 저장하고..
여기가 포인트인 것 같군요. ECX(EBP+8) 주소에 AH(AX의 상위 1Byte)를 저장.
원래 EAX는 ADD ECX, 827F가 있을 때 2Byte까지 쓰였지만
ADD ECX, 827F 가 없어짐으로 인해 1Byte까지밖에 안 쓰입니다.
하지만 다른 명령어에선 ADD ECX, 827F 명령어가 없어졌다는 것을 알리가 없겠죠. -_-;
그래서 그냥 EAX(0x0020) 에서 상위 1Byte인(AH) 0x0 을 읽어서
EBP+8에 저장한겁니다.
결론은 대사 중간에 ASCII 코드 0x0이 들어가서 대사가 거기에서 그냥 잘리고 다음 대사로 넘어가는 것이죠.
뭐 여차저차 하다 원인은 알아냈습니다. 이제 해결하는 방법 뿐인데...
일단은 EBP+C와 EBP+8에 대해 더 자세히 알아봐야합니다.
EBP + 8 , EBP + C 값은 오른쪽 아래에 창 보시면 나와있습니다.
그럼 저 주소를 찾아가야하는데요. CPU 창이 아닌 밑에 있는 Dump 창에서 찾아갑시다
Ctrl + G 를 눌러 먼저 EBP + 8 의 값을 적고 'OK' 를 누릅시다.
그러면 알 수 없는 외계어가 뜨는데 위로 1칸만 올라갑시다.
위의 스샷처럼 '여기도' 문자가 보이고 바로 다음에 ASCII 0x00 값이 보이는군요.
'여기도' 까지만 있지, 다른 문자는 보이지 않는군요.
[참고] 만약 스샷처럼 ASCII dump가 아니라면 오른쪽 마우스 -> Text -> ASCII (64 chars) 선택하시면 됩니다.
이번엔 위에서 나온 방법대로 Ctrl + G 를 눌러 EBP + C 의 주소를 찾아갑시다.
찾아간다음에 역시 1칸 올라가면...
'여기도a한글b테스트' 문자가 보이고 마지막으로 0x00 으로 끝맺음이네요.
이걸로 짐작해보아 EBP +8 에서는 문자가 모두 다 저장되어 있지 않고, EBP + C 에는 모든 문자가 저장되어 있으니
EBP + C 의 에 있는 값을 저장해 EBP + 8 에 넣고
결과적으로는 EBP + 8 에 저장되어 있는 문자들을 읽는 것 같습니다.
EBP + 8 과 EBP + C에 대해서는 알아봤으니 다시 Breakpoint 가 걸려있던 주소로 이동.
(주소 이동까지는 아니고, CPU 창으로 이동.)
[참고]
0040ED0C . 66:894D F8 MOV WORD PTR SS:[EBP-8],CX
0040ED10 . FF45 0C INC DWORD PTR SS:[EBP+C]
0040ED13 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0040ED16 . 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
0040ED19 . 8821 MOV BYTE PTR DS:[ECX],AH
0040ED1B . FF45 08 INC DWORD PTR SS:[EBP+8]
0040ED1E . 8A45 F8 MOV AL,BYTE PTR SS:[EBP-8]
0040ED21 . 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
0040ED24 . 8801 MOV BYTE PTR DS:[ECX],AL
0040ED26 . FF45 08 INC DWORD PTR SS:[EBP+8]
이 명령어들을 해석하자면 ASCII 코드가 저장되어 있는 ECX를 EBP - 8에 저장하고
EBP + C 의 값을 1 증가 (즉, 다음 값을 읽을 준비 하는 것.)
EAX 에는 다시 ASCII 코드를, ECX 에는 EBP + 8의 값을 저장하고 ECX 주소에 AH 를 저장.
그리고 EBP + 8을 1 증가 (다음 값을 넣기 위해 주소 1증가.)
그리고 똑같은 작업 한 다음 AL 을 ECX에 저장합니다.
그리고 다시 EBP + 8을 증가시키죠. (다음 작업을 위한 준비.)
그러면 해결을 위해서는 어떤 명령어를 없애야 할까요?
INC DWORD PTR SS:[EBP+C] 명령어를?
이 명령어는 문자를 읽어오려는 주소를 1증가시키는 것뿐이지. 다음 명령어에는 영향을 주지 않는 것 같군요.
MOV ECX,DWORD PTR SS:[EBP+8], MOV EAX,DWORD PTR SS:[EBP-8] 이 명령어?
이 명령어도 역시 레지스터에 저장만 할 뿐이지, 다른 의미는 없죠. 없앨 필요는 없는 듯 하군요.
MOV BYTE PTR DS:[ECX],AH, INC DWORD PTR SS:[EBP+8] 그럼 이거?
이건... 없애야합니다. 원인을 볼 때 AH 때문에 일어난 현상이니, BYTE PTR DS:[ECX], AH
명령어는 없애버려야 합니다.
그리고 다음에 나오는 INC DWORD PTR SS:[EBP+8] 도 없애야하겠죠. 원래는 AH 를 저장했기 때문에
다음 값을 저장하기 위해 1을 증가시키는 건데 MOV BYTE PTR DS:[ECX],AH 명령어가 없어지는 이상
INC DWORD PTR SS:[EBP+8] 이 명령어는 필요가 없게되죠.
그렇다면 이 명령어들을 없애봅시다. (직전신장전 한글 띄우기 작업 - 4)
그리고 저장~ (직전신장전 한글 띄우기 작업 - 1)
기대를 하며 실행을 해보면....!
와와와와와와우~~~~~~~~~~!
드디어 잘 출력이 됩니다. 얼마나 고생을 했는지.. 흑흑.
이제 이걸로 직전신장전 한글 띄우기 작업도 끝난 것 같군요...
뭐 진행하다가 또 문제점 보이면 글 올려야겠죠. -_-;
여튼 끝~
'게임 한글화 > 직전신장전' 카테고리의 다른 글
직전신장전 한글 띄우기 작업 - 6 (4) | 2010.11.12 |
---|---|
직전신장전 한글 띄우기 작업 - 4 (0) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 3 (0) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 2 (1) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 1 (3) | 2010.11.12 |