폰트로드시 일어폰트 이외 폰트 로드하기

//기본 설정은 폰트 로드시 '@'가 붙은 폰트명과 일어범위을 벗어나는 폰트명을 제외 시킨다.
004050AE . 0FBE08 MOVSX ECX,BYTE PTR DS:[EAX]
004050B1 . 83F9 40 CMP ECX,40
004050B4 . 74 6E JE SHORT MOP2_TRI.00405124
004050B6 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
004050B9 . 8B85 8CFEFFFF MOV EAX,DWORD PTR SS:[EBP-174]
004050BF . E8 64180900 CALL MOP2_TRI.00496928
004050C4 . 8B85 8CFEFFFF MOV EAX,DWORD PTR SS:[EBP-174]
004050CA . E8 59190900 CALL MOP2_TRI.00496A28
004050CF . 3C 80 CMP AL,80
004050D1 . 75 51 JNZ SHORT MOP2_TRI.00405124  //지점3
004050D3 . C785 A4FEFFFF>MOV DWORD PTR SS:[EBP-15C],1
004050DD . EB 18 JMP SHORT MOP2_TRI.004050F7
004050DF > 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004050E2 . 8B95 A4FEFFFF MOV EDX,DWORD PTR SS:[EBP-15C]
004050E8 . E8 0F1B3400 CALL MOP2_TRI.00746BFC
004050ED . 84C0 TEST AL,AL
004050EF EB 16 JNE SHORT MOP2_TRI.00405107  //점1
004050F1 . FF85 A4FEFFFF INC DWORD PTR SS:[EBP-15C]
004050F7 > 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004050FA . E8 190C0000 CALL MOP2_TRI.00405D18
004050FF . 3B85 A4FEFFFF CMP EAX,DWORD PTR SS:[EBP-15C]
00405105 .^ 7F D8 JG SHORT MOP2_TRI.004050DF
00405107 > 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040510A . E8 090C0000 CALL MOP2_TRI.00405D18
0040510F . 3B85 A4FEFFFF CMP EAX,DWORD PTR SS:[EBP-15C]
00405115 . 74 0D JE SHORT MOP2_TRI.00405124
00405107 > \8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
.
.
.
//폰트셋을 체크해서 자동으로 다시 만들도록 되어 있으니 이곳을 패스하도록 한다.
0040550A /74 13 JE SHORT MOP2_TRI.0040551F  //점2
0040550C |FFB5 80FEFFFF PUSH DWORD PTR SS:[EBP-180] ; /Arg1
00405512 |E8 6DD40B00 CALL MOP2_TRI.004C2984 ; \MOP2_TRI.004C2984
00405517 |59 POP ECX
00405518 |E8 BF590200 CALL MOP2_TRI.0042AEDC
0040551D |EB 65 JMP SHORT MOP2_TRI.00405584
0040551F \690D 00FA7D00>IMUL ECX,DWORD PTR DS:[7DFA00],2370


1. 점1 부분중 JNE를 JMP으로 바꿔서 일어명 폰트이외의폰트명을 읽을수 있게한다.
2. 점2 명령어 JE를 JMP로 변경시켜 재실행시 자동으로 문자셋체크후 다시 생성하는것을 막는다.
3. 지점3 부분을 NOP로 수정.

-주 항-
아랄로 훅후 폰트로드와 문자셋 변경을 체크후 게임 내 옵션에서 폰트를 바꿔주고 적용시키면 폰트셋을 다시 만들어 진다. 위본문대로 수정후 최초실행시 반드시 해줘야 한글이 나올수 있는 폰트셋이 만들지니 주의. 


게임내 옵션중 인터페이스 분류에 위 스샷과 가튼 버튼을 클릭.


한글 폰트를 선택하고 위스샷중 붉은 테두리로 강조된 문자(적용)를 클릭하면 폰트셋이 다시 만들어진다. (개조 이후의 스샷이라 폰트가 많이 보이는것뿐)


유니코드가 한국어일때와 노어플로켈일시 상태. 여전히 한글은 안보이지만 폰트리스트는 보인다. 어플로켈 실행시엔 "?"로 표시된다. 추후 개선해야할 부분.

                                               
                                         

반각문자 출력하기

00428CE4 |> /33C9 XOR ECX,ECX
00428CE6 |. |894D AC MOV DWORD PTR SS:[EBP-54],ECX
00428CE9 |. |8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]  
00428CEC |. |8B15 28F97D00 MOV EDX,DWORD PTR DS:[7DF928]
00428CF2 |. |E8 05DF3100 CALL MOP2_TRI.00746BFC
00428CF7 |. |84C0 TEST AL,AL
00428CF9 |. |74 3D JE SHORT MOP2_TRI.00428D38  //A
00428CFB |. |8B15 28F97D00 MOV EDX,DWORD PTR DS:[7DF928]
00428D01 |. |FF05 28F97D00 INC DWORD PTR DS:[7DF928]
00428D07 |. |8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00428D0A |. |E8 D9CFFDFF CALL MOP2_TRI.00405CE8
00428D0F |. |33DB XOR EBX,EBX
00428D11 |. |8A18 MOV BL,BYTE PTR DS:[EAX]
00428D13 |. |C1E3 08 SHL EBX,8         //치 (00000081->00008100) //B지점
00428D16 |. |8B15 28F97D00 MOV EDX,DWORD PTR DS:[7DF928]
00428D1C |. |FF05 28F97D00 INC DWORD PTR DS:[7DF928]
00428D22 |. |8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00428D25 |. |E8 BECFFDFF CALL MOP2_TRI.00405CE8
00428D2A |. |33C9 XOR ECX,ECX
00428D2C |. |8A08 MOV CL,BYTE PTR DS:[EAX]
00428D2E |. |03D9 ADD EBX,ECX        //2면  다.
00428D30 |> |895D BC MOV DWORD PTR SS:[EBP-44],EBX   //C지점

2바이트 체크같아 보이지만 1바이트씩 잘라서 체크하고 붙인후 다시 범위 체크하는곳으로 보내게 된다.
그래서 생각해낸게 합쳐지는 구간을 패스해서 1바이트를 보낼수 있게 하자는 것.


//우선 A의 분기문을 NOP로 수정 해야 합니다.
00428CF9 90 NOP
00428CFA 90 NOP

//B을 개조할 코드가 위치한곳을 쓸수 있도록 쿨문으로 바꿉니다.
00428D13 E8 88EC3100 CALL MOP2_TRI.007479A0
00428D18 90 NOP
00428D19 90 NOP
00428D1A 90 NOP
00428D1B 90 NOP

//반각문자(. ,?!)가 올 경우 C으로 점프하도록 합니다.
//7F까지 체크하도록 수정.
007479A0 83FB 7F CMP EBX,7F
007479A3 ^ 0F86 8713CEFF JBE MOP2_TRI.00428D30
007479A9 C1E3 08 SHL EBX,8
007479AC 8B15 28F97D00 MOV EDX,DWORD PTR DS:[7DF928]
007479B2 C3 RETN


사족1. 위 예제는 몬스터파크2 체험판을 기초로 작성되었습니다.

MED engine.asm728Bytes

올리디버거 플러그인 MUA를 사용한다면 첨부된 파일로 쉽게 수정할수 있습니다. 단, 체험판에서만 가능합니다.