본문 바로가기

게임 한글화/직전신장전

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

으아... 뭘 해도 해도 끝이 없는 작업 같군요.

뭐 될 때까지 하면 언젠간 끝나겠죠.

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

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+CEBP+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)



기대를 하며 실행을 해보면....!



와와와와와와우~~~~~~~~~~!

드디어 잘 출력이 됩니다. 얼마나 고생을 했는지.. 흑흑.



이제 이걸로 직전신장전 한글 띄우기 작업도 끝난 것 같군요...

뭐 진행하다가 또 문제점 보이면 글 올려야겠죠. -_-;


여튼 끝~