폰트와 2바이트문에 관해서는 포럼게시판에 있는 AIR님 글을 참고해보면


[엔진] MED엔진 일어 이외의 폰트 허용과 반각문자 표시하기 1 fileAir




//한글 폰트확장

//CRT+F

CMP AL,80

아래분기문 NOP
아래 TEST EAX,EAX 아래 분기문 JMP


//CRT+B

83 C4 0C 85 C0

처음 검색된지점 아래분기문 JMP

OR


내려보다보면 "rb" 와 "_FONTSET.MED" 콜문 아래쪽 에보이는 JE 문 JMP 로정해주면된다.



+요부분이 폰트재생성 억제인듯한데 요놈은 아랄 바이너리패치 (b코드) 로 수정해주면

아랄이 덮치고 바이너리 수정하는게 막을수없어서 패치나 실행파일 수정을 해줘야한다.



//위 내용은 MedFontExtend.exe 로 가능하다.


3C 80 75 51 > ?? ?? 90 90

84 C0 75 16 > ?? ?? EB ??

83 C4 0C 85 C0 ?? > ?? ?? ?? ?? ?? EB


위와같이 검색해서 바이트수정을 해주는 유틸인데 보면 알겠지만 검색 바이트가 몇자 안되서 오작동 일어날 가능이 매우크다.

한번 올리디버거로 확인후 위 바이너리로 처음검색된 지점이 맞다면 코드게시글에 활용하면 될듯싶다.


문자열 변경유틸




//반각문자 출력하기


00428D1C  /XOR ECX,ECX
00428D1E  |MOV DWORD PTR SS:[EBP-54],ECX
00428D21  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D24  |MOV EDX,DWORD PTR DS:[7DF964]
00428D2A  |CALL monpa2.00746BAC
00428D2F  |TEST AL,AL
00428D31  |JE SHORT monpa2.00428D70
00428D33  |MOV EDX,DWORD PTR DS:[7DF964]
00428D39  |INC DWORD PTR DS:[7DF964]
00428D3F  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D42  |CALL monpa2.00405D70
00428D47  |XOR EBX,EBX
00428D49  |MOV BL,BYTE PTR DS:[EAX]
00428D4B  |SHL EBX,8
00428D4E  |MOV EDX,DWORD PTR DS:[7DF964]
00428D54  |INC DWORD PTR DS:[7DF964]
00428D5A  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D5D  |CALL monpa2.00405D70
00428D62  |XOR ECX,ECX
00428D64  |MOV CL,BYTE PTR DS:[EAX]
00428D66  |ADD EBX,ECX
00428D68  |MOV DWORD PTR SS:[EBP-44],EBX
00428D6B  |JMP monpa2.00428E7C
00428D70  |MOV EDX,DWORD PTR DS:[7DF964]
00428D76  |INC DWORD PTR DS:[7DF964]

//

초록색 부분을 긁은다음 > 우클릭 > ExtraCopy > Copy



00428D1C  /XOR ECX,ECX
00428D1E  |MOV DWORD PTR SS:[EBP-54],ECX
00428D21  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D24  |MOV EDX,DWORD PTR DS:[7DF964]
00428D2A  |CALL monpa2.00746BAC
00428D2F  |TEST AL,AL
00428D31  |JE SHORT monpa2.00428D70
00428D33  |MOV EDX,DWORD PTR DS:[7DF964]
00428D39  |INC DWORD PTR DS:[7DF964]
00428D3F  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D42  |CALL monpa2.00405D70
00428D47  |XOR EBX,EBX
00428D49  |MOV BL,BYTE PTR DS:[EAX]
00428D4B  |SHL EBX,8
00428D4E  |MOV EDX,DWORD PTR DS:[7DF964]
00428D54  |INC DWORD PTR DS:[7DF964]
00428D5A  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D5D  |CALL monpa2.00405D70
00428D62  |XOR ECX,ECX
00428D64  |MOV CL,BYTE PTR DS:[EAX]
00428D66  |ADD EBX,ECX
00428D68  |MOV DWORD PTR SS:[EBP-44],EBX
00428D6B  |JMP monpa2.00428E7C
00428D70  |MOV EDX,DWORD PTR DS:[7DF964]
00428D76  |INC DWORD PTR DS:[7DF964]



//

분홍색 부분을 긁은다음 > 우클릭 > Binary > Fill with NOPs > 우클릭 > ExtraCopy > Past


Past 한 밑부분에 명령추가 (스페이스바 누르면 입력창 뜬다)


CMP EBX,7F

JBE 428D68           // 파란색 부분 으로 JBE문 (점프위쪽 주소 즉 EBX 값을 MOV 명령으로 넣는곳) 





//완성된 모습


00428D1C  /XOR ECX,ECX
00428D1E  |MOV DWORD PTR SS:[EBP-54],ECX
00428D21  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D24  |MOV EDX,DWORD PTR DS:[7DF964]
00428D2A  |INC DWORD PTR DS:[7DF964]
00428D30  LEA EAX,DWORD PTR SS:[EBP-4]
00428D33  |CALL monpa2.00405D70
00428D38  XOR EBX,EBX
00428D3A  MOV BL,BYTE PTR DS:[EAX]
00428D3C  CMP EBX,7F
00428D3F  JBE SHORT monpa2.00428D68
00428D41  NOP
00428D42  |NOP
00428D43  NOP
00428D44  NOP
00428D45  NOP
00428D46  NOP
00428D47  |NOP
00428D48  NOP
00428D49  |NOP
00428D4A  NOP
00428D4B  |SHL EBX,8
00428D4E  |MOV EDX,DWORD PTR DS:[7DF964]
00428D54  |INC DWORD PTR DS:[7DF964]
00428D5A  |LEA EAX,DWORD PTR SS:[EBP-4]
00428D5D  |CALL monpa2.00405D70
00428D62  |XOR ECX,ECX
00428D64  |MOV CL,BYTE PTR DS:[EAX]
00428D66  |ADD EBX,ECX
00428D68  |MOV DWORD PTR SS:[EBP-44],EBX
00428D6B  |JMP monpa2.00428E7C
00428D70  |MOV EDX,DWORD PTR DS:[7DF964]
00428D76  |INC DWORD PTR DS:[7DF964]




//대사 후킹위치 만들기


悪の女幹部 フルムーンナイト


대사위치는 수정없이 잡을수있는 지점이 몇군데 존재하긴하지만 특정 조건하에서 튕기는 일이있더군요.

위 게임에서 사용했던 함수 통채로 복사해서 사용하는 방법이 가장 무난했습니다.


바로 가는 좌표값은 구하기 힘들어서 약간 우회해서 찾아가보죠



//

CRT+B

55 8B EC 51 89 45 FC 8B 4D FC 83 E1 07 B8 01 00 00 00 D3 E0 8B 55 FC C1 FA 03

CRT+L 로넘겨서 마지막 혹은 3번째 // 콜문 받는지역이 한군데인곳 

(CPU 창과 덤프창 사이에 Local call from ~~ 이렇게 나오니 거기 우클릭해서 Go to Call from 눌러주면된다.)
콜보낸 지역으로 가서 ( 나왔더니 함수 시작부분이 보인다면 거기서 한번더 첫번째 콜보낸지역으로 이동하자)

위쪽 콜문 들어가서 함수 복사해서 하단에 넣어주고 콜문 해당지역으로 변경


ex>

//파란색이 우리가 검색해서 나온지역

//초록새이 우리가 들어가서 함수 통채로 복사 하고 실행파일 끝에 붙여넣어서 콜문 변경할곳




0041AF0D  MOV DWORD PTR FS:[0],EDX
0041AF14  JMP monpa2.0041F128
0041AF19  LEA EDX,DWORD PTR SS:[EBP-4]
0041AF1C  MOV EAX,monpa2.007DF944
0041AF21  CALL monpa2.007465F0
0041AF26  MOV ECX,DWORD PTR SS:[EBP-134]
0041AF2C  MOV EAX,DWORD PTR DS:[7DEC44]
0041AF31  MOV DWORD PTR DS:[ECX*4+7DEC34],EAX
0041AF38  MOV EDX,DWORD PTR DS:[7DEC44]
0041AF3E  MOV DWORD PTR DS:[7CCD4C],EDX
0041AF44  MOV ECX,DWORD PTR DS:[7CC13C]
0041AF4A  MOV DWORD PTR DS:[7DF960],ECX
0041AF50  CMP DWORD PTR DS:[7DF9E4],0
0041AF57  JL monpa2.0041AFFD
0041AF5D  MOV EAX,DWORD PTR SS:[EBP-134]
0041AF63  MOV EDX,DWORD PTR DS:[EAX*4+7DEC68]
0041AF6A  ADD EDX,DWORD PTR DS:[7DF9E4]
0041AF70  MOV DWORD PTR SS:[EBP-138],EDX
0041AF76  MOV EAX,DWORD PTR SS:[EBP-138]
0041AF7C  CALL monpa2.0041F93C
0041AF81  TEST AL,AL
0041AF83  JE SHORT monpa2.0041AFBB
0041AF85  CMP DWORD PTR DS:[7CD13C],0

//


초록색 주소로 이동해서


함수시작부터 끝(retn)까지 긁은다음 > 우클릭 > ExtraCopy > Copy


실행파일 끄트머리에 > ExtraCopy > Past


초록색 CALL 문을 우리가 새롭게 통채로 복사한 함수 끄트머리 시작점으로 변경

ex>

0041AF21  CALL monpa2.00747948





0074793A  JMP DWORD PTR DS:[<&OLEAUT32.#11>]       ;  OLEAUT32.VariantCopyInd
00747940  JMP DWORD PTR DS:[<&OLEAUT32.#8>]        ;  OLEAUT32.VariantInit
00747946  INT3
00747947  INT3
00747948  PUSH EBP
00747949  MOV EBP,ESP
0074794B  PUSH EBX
0074794C  PUSH ESI
0074794D  MOV ESI,EAX
0074794F  MOV EDX,DWORD PTR DS:[EDX]
00747951  CALL monpa2.0047F0F8
00747956  MOV EAX,ESI
00747958  POP ESI
00747959  POP EBX
0074795A  POP EBP
0074795B  RETN
0074795C  DB 00
0074795D  DB 00
0074795E  DB 00



대사는// 74794F // EDX // ptrcheat // len -4



//기타지 후킹 지역




CRT+B

33 DB 8A 18


검색되는 순서에따라서 모두 함수시작 부분이 후킹주소가 된다.


1    // 필요없는지역
2    // 대사관련 후킹위치는 아님 위에언급된 반각문자 출력 수정지역
3    // 패스 2와 동일지역
4    // 패널창 // EAX // PTRCHEAT // LEN -4
5    // 이름 // EAX // PTRCHEAT // LEN -4
6    // 선택지 > 조금 내려와서 Arg있는 콜문아래 콜문  // [EBP-4] // PTRCHEAT // LEN -4
7    // 필요없는지역 백로그관련
8    // 패스 7과 동일지역
9    // 세이브&로드 등 시스템 메세지 // EAX // PTRCHEAT // LEN -4

여기까지

9번째 검색된곳 시작부분을 보면 상당히 많은지역에서 콜문을 받는다. = 콜문많이받는곳 검색됐으면 끝








______________________________________



// 포인터 바꿔치기 튕기는 건 아래 포럼글 참고

MED엔진 분석


후킹 메모리 -8 지역에 아마도 명령에 사용하는 헥스값이 있는것같다.

이곳이 대부분 2로 셋팅되어있다가 사용전후에 가감하는것같다.

이곳을 우리가 후킹해서 내보낼때 0 이나 1이면 튕기더라는 그래서 아랄 단에서 수정해줬다.



1004E902  ADD EDX,964
1004E908  CMP DWORD PTR DS:[EDX-8],2
1004E90C  JGE SHORT ATCode_M.1004E915
1004E90E  MOV DWORD PTR DS:[EDX-8],2
1004E915  RETN


초록새 위쪽과 아래는 콜로 땡기면 원래있던 명령문과 돌아가는 거고 주요 수정문은


-8지역을 2와 비교해서 크거나 같으면 그냥 보내고 작으면 2를 넣어주는거다.


코드게시글에 올려놓은 dll을 사용해주자


//

ATCode_MED.dll << 요놈은 아랄설치된 폴더\알고리즘폴더에 넣자.


ex) D:\AralTrans02\Algorithm

ATCode.dll 을 MED 엔진에 대응하기 위해 약간 수정한겁니다.

//


+엑세스 관련 오류문은 후킹위치가 감시되고있을수있으니 위치 변경

+무효인 포인터 오류문은 후킹방법 변경이나 아랄수정으로 가능







//끝으로 UI 수정



CRT + S


ADD ECX,ECX

ADD ECX,-2


OR


CRT + B


03 C9 83 C1 FE


검색해서 이동하면


00428EAD  |MOV ECX,DWORD PTR DS:[7CC3BC]
00428EB3  |ADD ECX,ECX
00428EB5  |ADD ECX,-2

분홍색지점 더블클릭하거나 덤프창에서 이동해보면




 00 00 00 00 

 34 00 00 00

00 00 00 00

 E2 01 00 00 

 전체 X좌표

 

메세지창 X좌표

메세지창 Y좌표

 BF 00 00 00

 62 00 00 00

 DA 03 00 00

9C 00 00 00

 메세지창 X여백

메세지창 Y여백

 

 

 1E 00 00 00

 03 00 00 00

 1F 00 00 00

 28 00 00 00

 라인 최대문자수

 

 자간

 줄간격

 C2 00 00 00

 49 00 00 00

00 00 00 00

 00 00 00 00

 이름창 X좌표

 이름창 Y좌표

 

 



라인번역이 많다보니 개행이 꼬이거나 해서 문장이 가출하는경우가 자주 발생해서 수정해주는게 좋다.


해당 메모리에 마우스로 찍어준 후 CRT+R (Find refernces)


메세지창 X여백

ADD 관련문 중 1 로 이동해서

대입값을 원하는 걸로 수정


라인 최대문자수

MOV ECX, 관련문중 2번째로 이동해서

대입값을 원하는 걸로 수정


자간

IMUL 관련문중 2번째로 이동해서

대입값을 원하는 걸로 수정


줄간격

IMUL 관련문중 2번째로 이동해서

IMUL EAX, 원하는값 대입


대부분 메세지창 X여백,라인최대문자,자간만 수정해주면 될듯싶다.(대부분 대사반각문자 출력을 위해 수정했던 함수에 위치한다.)


위에서 언급한 지역이아니라 해당 메모리에 값을 넣는지점중 로드액션을 취할때 사용하는 곳을 수정해주는게 가장 안정적인것같은데

이러면 로드액션을 꼭취해줘야 UI조정이 이뤄져서 다소 불편한점이 있더라...



잘찾아보면 메뉴창도 없애버릴수 있을것같은데 못찾겠군요.




중요 키워드


// 대사


CRT+B

55 8B EC 51 89 45 FC 8B 4D FC 83 E1 07 B8 01 00 00 00 D3 E0 8B 55 FC C1 FA 03


// 기타 후킹지역 및 수정지역


CRT+B

33 DB 8A 18


// UI 수정참고


CRT + B


03 C9 83 C1 FE




// 샘플 + 아랄고딕의 활용등 참고하자


8 2013/03/29 [ATCode] 몬스터 해저드 (モンスター・ハザード) 새 글파일 [2] 2013-06-26 2013-06-27 00:16
7 2012/08/31 [ATCode] 몬스터파크2 (MONSTER PARK 2~神々を宿した乙女~) 새 글파일 [1] 2013-06-26 2013-06-27 00:17
6 2013/02/22 [ATCode] 마법 소녀는 키스로 변신~ 상대가 자신 이외의 사람 이라니 ...... ~ (魔法少女はキスして変身(かわ)る ~相手が彼以外の人だなんて……~ ) 새 글파일 [2] 2013-06-26 2013-06-27 00:21
5 2012/03/29 [ATCode] 개 (牝犬発情記~かげりゆく日常~ ) 새 글파일 [2] 2013-06-26 2013-06-27 00:21
4 2011/05/27 [ATCode] 마법의 수호 공주 아루테미나 (魔法の守護姫アルテミナ) 새 글파일 [1] 2013-06-26 2013-06-27 20:09
3 2012/02/24 [ATCode] 메리지 블루 「약혼자가 있는데 , 어째서 이런 남자에게……」(マリッジブルー「婚約者がいるのに、どうしてこんな男に……」) 새 글파일 [1] 2013-06-26 2013-06-27 00:25
2 2012/09/28 [ATCode] 마법 전사 엑스트라 스테이지 ~ 10th Anniversary ~(魔法戦士エクストラステージ ~10th Anniversary~) 새 글파일 [1] 2013-06-27 2013-06-27 10:31
1 2012/07/27 [ATCode] 츠보이 군의 스위치!(つぼい君のスイッチ! ) 새 글파일 2013-06-27 2013-06-27 14:57




쉽게 정리할려고 작성했는데 쓰고보니 복잡하네요 -0-;;