ASSEM 강좌가 아니라서 ASSEM에 관한 명령어, 단축키 설명은 생략합니다.
전 이제부터 이걸 보는 사람들이 ASSEM을 어느 정도 한다고 생각하고 쓸겁니다.
일일히 ASSEM 사용법을 쓰는건 귀찮고, 그냥 제가 알아볼 정도면 되니까 ㅎ;
뭐 한글화에는 전혀 도움이 안될지 몰라도 언젠간 쓸모가 있을 것 같고, 잊어버리면 안되니까
저의 작업 일지라도 써놓고 잊어버리면 보는거죠. ㅋㅋ
----------------------------------------------------------------------------------------------------------------
저번 글에서 분명히 하라는대로 다 했는데!
한글은 잘 출력되는데!
왜 공백은 출력이 안되나!
그건 저도 모릅니다. -_-; 그래서 역시 검색을 해본바... 아무 것도 얻은 것이 없네요. (OTL...)
그래서 제 실력으로 해결하기로 했습니다. 잘 될지는 모르겠지만요.
일단은 언제나 그렇듯이 작업을 위해 ollydbg를 실행해서 ekd4.exe 파일을 열어야되겠죠.
그리고 뭐가 문제인지 브레이크 포인트(Breakpoint) 를 걸어야합니다.
어디다 Breakpoint 를 거냐고요? 일단은 정보가 없기 때문에
저번 글 에서 나온 검색 방법으로 cmp eax, 0A1 을 검색하고 좀만 위로 올라가보면 있는
cmp eax, 80에 F2를 누릅시다. (ASCII 코드 검사 함수 부분이기 때문에 일단 여기에 거는겁니다.)
그러면 위의 스샷처럼 주소 부분이 빨간색으로 칠해집니다. Breakpoint가 걸렸다는겁니다.
그리고 F9를 눌러 게임을 실행합시다.
실행하면 아무 것도 달라진 것이 보이지는 않지만 게임 시작버튼을 누르고서 글자가 뜨기 전에 갑자기
딱 저 주소에 걸리게됩니다.
글자들을 읽어오려는 작업을 하려고 ASCII 코드 검사를 위해 저 함수를 지나가다 Breakpoint에 걸린겁니다.
그러면 읽어오려는 글자는 뭘까요?
바로 '한글 테스트 ' 입니다. 어떻게 아냐고요?
그 글자들이 보여지기 전에 바로 브레이크 포인트에 걸렸으니까요. 참 단순한 이유죠? -_-;
그런데 지금의 목적은 공백의 ASCII 코드가 잘 나오는지 확인하는 것입니다.
공백의 ASCII 코드는 16진수로는 0x20, 10진수로는 32입니다.
그러면 ASCII 코드는 어떻게 확인하느냐?
저 레지스터 EAX 에 읽어오려는 글자의 ASCII 코드가 저장되어 있습니다.
아니 정확히 말하자면 EBP + 8 에 저장되어있지만요.
지금은 ASCII 코드가 'C7' 입니다. 그러므로 한글이죠.
저번 글에서 '80 ~ C8 사이이면 한글로 간주한다.' 라고는 말 안했지만 cmp 명령어를 아시는 분들은 대충 알아챘을겁니다.
여튼 ASCII 코드(EAX)가 '20'이 될 때까지 F9를 눌러줍시다.
'한글 테스트 '에는 공백이 두개 있으니까, '20' 이 2 번 보여야합니다.
F9 를 눌러 실행하면서 '20' 이 2 번 보였다면 정상입니다.
왜냐? 게임에서도 '한글 테스트 ' 라고 잘 출력됐으니까요. 공백도요.
그러면 뭐가 문제지? 일단 차근차근 진행해봅시다.
마지막 '20' 이 보이고 F9를 누르면 브레이크 포인트에 걸리기까지의 시간이 약간 길어집니다.
그리고 다시 걸리면 F9를 딱 4번만 눌러줍시다. 글자 처리 부분이긴한데 우리가 건드린 부분은 아니거든요.
그래서 그냥 넘어가고... 역시 브레이크 포인트에 걸리기까지의 시간이 약간 길어지고 다시 걸립니다.
그러면 이제 '여기도 한글 테스트' 글자들을 처리할 부분이 시작됩니다.
여기서 아마 공백이 제대로 출력이 안됐던 걸로 기억하는군요.
그런데 공백이 외계어로 출력됐다면... 공백 자리의 ASCII 코드가 1Byte가 아닌 2Byte로 인식됐다는 거군요.
일단은 F9 눌러서 진행해보니까...
'20'이... 전혀 보이지 않습니다. 왜 그런걸까요? 저도 아직까지는 모릅니다.
그러면 재차 확인을 위해 게임을 끄고 Ctrl + F2 (Restart) 를 누릅시다. 그리고 다시 F9를 눌러 게임을 실행합시다.
그리고 다시 브레이크 포인트에 걸립니다.
그런데.... 일일히 세고 계시지는 않았겠지만... '한글 테스트 ' 처리 하는 부분 때
F9를 2번째 눌렀을 때, 6번째 눌렀을 때에 '20'이 나왔습니다.
과연 무엇을 뜻하는걸까요? 눈치 빠르신분은 벌써 눈치채셨을겁니다.
F9를 누를 때마다 1Byte가 아닌 1글자씩 처리하는겁니다.
아니면 2Byte 문자일 때 두번째 1Byte는 다른 함수나 다른 주소에서 처리 될 수도 있죠.
'한글 테스트 '... 공백이 3번째, 7번째에 있네요.
처음 '한' 은 Breakpoint 때문에 걸리고요. F9를 한번 누르면 '글', 두번 누르면 ' '...
이해 가셨나요?
그래서 '여기도 한글 테스트' 처리 할 때는 F9를 3번 눌러야 공백 자리의 (첫번째) ASCII 코드를 볼 수 있는겁니다.
ollydbg로 들어가서 아직 Breakpoint에 걸린 상태입니다. 정확히 F9를 11번(7번, 4번) 눌러줍시다~
그러면 '여기도 한글 테스트' 처리 부분입니다. 위에서 말했듯이 여기서 F9를 3번 눌러줍시다.
헐... 왜 '20' 아니라 '82'가 저장된걸까요. 이 부분에 대해서 더 자세히 알기 위해 코드를 하나씩 진행시켜야합니다.
그렇다고 F9를 누르시면 안되고요. 코드를 한개씩 진행시키기 위해서는 F8을 누릅시다.
F8 누르시면서 EAX를 눈여겨보셔야합니다. 그러면서 명령어도 잘 보면서 이게 어떤건지는 대충 파악해두는 것이
좋겠죠. 계속 누르다가 Retn 8 까지 왔으면... 그냥 F8 누르면 됩니다. -_-;
그러면 Retn 됐기 때문에 한 개의 함수를 볼 수 있는데요. 이 함수는 기억해두시는 것이 좋을 것 같네요.
이 함수의 기능은 대충 본다면 ASCII 코드를 EBP+C에 저장되어있는 값(주소)에서 불러오는 것 같군요.
이번엔 함수에 들어가기 위해 F8 이 아닌 F7로 진행합시다.
F7로 진행해보시다보면 EAX(ASCII) 가 '9F' 로 됩니다. 뭔가 신경 쓰이는 부분이군요.
여튼 일단은 계속 진행해봅시다. 그러면... 0046DCD8에서 불러오는 함수(아까 그 함수)에 들어가게 되는데요.
계속 진행하다보면 '82' 를 ECX에 저장하고 16^2 (16진수로 100) 를 곱하고 '9F' 를 ECX에 더합니다.
그래서 ECX가 '829F' 가 됩니다. '829F'... 아까 공백 부분에서 첫번째 ASCII 코드가 '82' 나왔고,
아까 함수에서 두번째 ASCII 코드가 '9F' 가 나왔습니다. 그게 합쳐져서 '829F'가 된겁니다.
즉, '829F'도 ASCII 코드라고 할 수 있는거죠.
그래서 '829F'를 최종 ASCII 코드로 인식, 그리고 '82' 가 80 ~ C2 사이에 있기 때문에 한글로 인식하고
그냥 그대로 출력해버려서 이상한 글자가 나온 것입니다.
대충 외계어가 나오는 원인은 알게 됐지만.....
그런데 왜 '20' 이 어떻게 '829F'가 된 것일까요? 아직 그 것은 밝혀지지 않았습니다. -_-;
'직전신장전 한글 띄우기 작업 - 4' 로 이어집니다~
전 이제부터 이걸 보는 사람들이 ASSEM을 어느 정도 한다고 생각하고 쓸겁니다.
일일히 ASSEM 사용법을 쓰는건 귀찮고, 그냥 제가 알아볼 정도면 되니까 ㅎ;
뭐 한글화에는 전혀 도움이 안될지 몰라도 언젠간 쓸모가 있을 것 같고, 잊어버리면 안되니까
저의 작업 일지라도 써놓고 잊어버리면 보는거죠. ㅋㅋ
----------------------------------------------------------------------------------------------------------------
저번 글에서 분명히 하라는대로 다 했는데!
한글은 잘 출력되는데!
왜 공백은 출력이 안되나!
그건 저도 모릅니다. -_-; 그래서 역시 검색을 해본바... 아무 것도 얻은 것이 없네요. (OTL...)
그래서 제 실력으로 해결하기로 했습니다. 잘 될지는 모르겠지만요.
일단은 언제나 그렇듯이 작업을 위해 ollydbg를 실행해서 ekd4.exe 파일을 열어야되겠죠.
그리고 뭐가 문제인지 브레이크 포인트(Breakpoint) 를 걸어야합니다.
어디다 Breakpoint 를 거냐고요? 일단은 정보가 없기 때문에
저번 글 에서 나온 검색 방법으로 cmp eax, 0A1 을 검색하고 좀만 위로 올라가보면 있는
cmp eax, 80에 F2를 누릅시다. (ASCII 코드 검사 함수 부분이기 때문에 일단 여기에 거는겁니다.)
그러면 위의 스샷처럼 주소 부분이 빨간색으로 칠해집니다. Breakpoint가 걸렸다는겁니다.
그리고 F9를 눌러 게임을 실행합시다.
실행하면 아무 것도 달라진 것이 보이지는 않지만 게임 시작버튼을 누르고서 글자가 뜨기 전에 갑자기
딱 저 주소에 걸리게됩니다.
글자들을 읽어오려는 작업을 하려고 ASCII 코드 검사를 위해 저 함수를 지나가다 Breakpoint에 걸린겁니다.
그러면 읽어오려는 글자는 뭘까요?
바로 '한글 테스트 ' 입니다. 어떻게 아냐고요?
그 글자들이 보여지기 전에 바로 브레이크 포인트에 걸렸으니까요. 참 단순한 이유죠? -_-;
그런데 지금의 목적은 공백의 ASCII 코드가 잘 나오는지 확인하는 것입니다.
공백의 ASCII 코드는 16진수로는 0x20, 10진수로는 32입니다.
그러면 ASCII 코드는 어떻게 확인하느냐?
저 레지스터 EAX 에 읽어오려는 글자의 ASCII 코드가 저장되어 있습니다.
아니 정확히 말하자면 EBP + 8 에 저장되어있지만요.
지금은 ASCII 코드가 'C7' 입니다. 그러므로 한글이죠.
저번 글에서 '80 ~ C8 사이이면 한글로 간주한다.' 라고는 말 안했지만 cmp 명령어를 아시는 분들은 대충 알아챘을겁니다.
여튼 ASCII 코드(EAX)가 '20'이 될 때까지 F9를 눌러줍시다.
'한글 테스트 '에는 공백이 두개 있으니까, '20' 이 2 번 보여야합니다.
F9 를 눌러 실행하면서 '20' 이 2 번 보였다면 정상입니다.
왜냐? 게임에서도 '한글 테스트 ' 라고 잘 출력됐으니까요. 공백도요.
그러면 뭐가 문제지? 일단 차근차근 진행해봅시다.
마지막 '20' 이 보이고 F9를 누르면 브레이크 포인트에 걸리기까지의 시간이 약간 길어집니다.
그리고 다시 걸리면 F9를 딱 4번만 눌러줍시다. 글자 처리 부분이긴한데 우리가 건드린 부분은 아니거든요.
그래서 그냥 넘어가고... 역시 브레이크 포인트에 걸리기까지의 시간이 약간 길어지고 다시 걸립니다.
그러면 이제 '여기도 한글 테스트' 글자들을 처리할 부분이 시작됩니다.
여기서 아마 공백이 제대로 출력이 안됐던 걸로 기억하는군요.
그런데 공백이 외계어로 출력됐다면... 공백 자리의 ASCII 코드가 1Byte가 아닌 2Byte로 인식됐다는 거군요.
일단은 F9 눌러서 진행해보니까...
'20'이... 전혀 보이지 않습니다. 왜 그런걸까요? 저도 아직까지는 모릅니다.
그러면 재차 확인을 위해 게임을 끄고 Ctrl + F2 (Restart) 를 누릅시다. 그리고 다시 F9를 눌러 게임을 실행합시다.
그리고 다시 브레이크 포인트에 걸립니다.
그런데.... 일일히 세고 계시지는 않았겠지만... '한글 테스트 ' 처리 하는 부분 때
F9를 2번째 눌렀을 때, 6번째 눌렀을 때에 '20'이 나왔습니다.
과연 무엇을 뜻하는걸까요? 눈치 빠르신분은 벌써 눈치채셨을겁니다.
F9를 누를 때마다 1Byte가 아닌 1글자씩 처리하는겁니다.
아니면 2Byte 문자일 때 두번째 1Byte는 다른 함수나 다른 주소에서 처리 될 수도 있죠.
'한글 테스트 '... 공백이 3번째, 7번째에 있네요.
처음 '한' 은 Breakpoint 때문에 걸리고요. F9를 한번 누르면 '글', 두번 누르면 ' '...
이해 가셨나요?
그래서 '여기도 한글 테스트' 처리 할 때는 F9를 3번 눌러야 공백 자리의 (첫번째) ASCII 코드를 볼 수 있는겁니다.
ollydbg로 들어가서 아직 Breakpoint에 걸린 상태입니다. 정확히 F9를 11번(7번, 4번) 눌러줍시다~
그러면 '여기도 한글 테스트' 처리 부분입니다. 위에서 말했듯이 여기서 F9를 3번 눌러줍시다.
헐... 왜 '20' 아니라 '82'가 저장된걸까요. 이 부분에 대해서 더 자세히 알기 위해 코드를 하나씩 진행시켜야합니다.
그렇다고 F9를 누르시면 안되고요. 코드를 한개씩 진행시키기 위해서는 F8을 누릅시다.
F8 누르시면서 EAX를 눈여겨보셔야합니다. 그러면서 명령어도 잘 보면서 이게 어떤건지는 대충 파악해두는 것이
좋겠죠. 계속 누르다가 Retn 8 까지 왔으면... 그냥 F8 누르면 됩니다. -_-;
그러면 Retn 됐기 때문에 한 개의 함수를 볼 수 있는데요. 이 함수는 기억해두시는 것이 좋을 것 같네요.
이 함수의 기능은 대충 본다면 ASCII 코드를 EBP+C에 저장되어있는 값(주소)에서 불러오는 것 같군요.
이번엔 함수에 들어가기 위해 F8 이 아닌 F7로 진행합시다.
F7로 진행해보시다보면 EAX(ASCII) 가 '9F' 로 됩니다. 뭔가 신경 쓰이는 부분이군요.
여튼 일단은 계속 진행해봅시다. 그러면... 0046DCD8에서 불러오는 함수(아까 그 함수)에 들어가게 되는데요.
계속 진행하다보면 '82' 를 ECX에 저장하고 16^2 (16진수로 100) 를 곱하고 '9F' 를 ECX에 더합니다.
그래서 ECX가 '829F' 가 됩니다. '829F'... 아까 공백 부분에서 첫번째 ASCII 코드가 '82' 나왔고,
아까 함수에서 두번째 ASCII 코드가 '9F' 가 나왔습니다. 그게 합쳐져서 '829F'가 된겁니다.
즉, '829F'도 ASCII 코드라고 할 수 있는거죠.
그래서 '829F'를 최종 ASCII 코드로 인식, 그리고 '82' 가 80 ~ C2 사이에 있기 때문에 한글로 인식하고
그냥 그대로 출력해버려서 이상한 글자가 나온 것입니다.
대충 외계어가 나오는 원인은 알게 됐지만.....
그런데 왜 '20' 이 어떻게 '829F'가 된 것일까요? 아직 그 것은 밝혀지지 않았습니다. -_-;
'직전신장전 한글 띄우기 작업 - 4' 로 이어집니다~
'게임 한글화 > 직전신장전' 카테고리의 다른 글
직전신장전 한글 띄우기 작업 - 6 (4) | 2010.11.12 |
---|---|
직전신장전 한글 띄우기 작업 - 5 (2) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 4 (0) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 2 (1) | 2010.11.12 |
직전신장전 한글 띄우기 작업 - 1 (3) | 2010.11.12 |