아~네모네... 음악이나 들어야지
니트로 플러스 건들지 말아야할걸 건든것같다.
//
Phantom -PHANTOM OF INFERNO- 体験版
2013/08/30
결론부터 말하자면 자폰입니다. 엔진 자체도 여타 니플하고 좀 틀린것같습니다.
소위 자폰이라고 말하는것중 대다수는 짝퉁이지만 요놈은 진품입니다. 윈도우 폰트관련함수 자체가 없더군요 앗싸리~
회피고 머고 폰트를만들어야 가능할듯싶네요.
그래도 후킹위치를 찾아보자면
(대충 찍어서 검색했더니 잡혔어 쿠쿸)
CRT+F
CMP AL,80
첫번째 잡히는거 콜스택타고 적절히 ... // 대사
두번째 잡히는거 콜스택타고 적절히 ...//기타
대사지점 좀더 빠르게 찾을려면
CRT+B
8B 16 33 FF 33 DB
맵 서치하기 귀찮아서 1/2바이트 체크는 하겠지 하면서 검색했더니 얻어걸렸네용
윈도우 함수를 사용안하기때문에 에이치코드 나오기전엔 놀수도없을테니
덤프나 에그헤드로 놀면됩니다. 넵
HOOK(0x0042A31F,TRANS([esi],CLIPJPN,NOP),RETNPOS(COPY))
// 니트로 플러스
니트로 플러스 현재 올린코드들은 강제널문 삽입 > 후킹(ptrcheat) > 강제널문 복구 및 원본 주소 후킹메모리에 -4지점에 복사 와 종료문 포인터 위치 후킹메모리 위치로 변경>명령제어문 포인터저장시 원문 주소로 저장
위와같은 과정을 거친다. 써놓고 보니 대개 복잡한것같은데 복잡하더라는 -0-;;
//기타
50 8D 4C 24 24 51 8B 4C 24 24
아래콜문 // [esp+0x24] // ecx // ptrcheat
검색안될시
53 55 56 57 8B F1 33 FF 3B F7
함수시작위치에서 콜로보낸지역으로 이동해서 해당 콜문. (위와 같은지역임)
+추가 후킹지역으로 위 후킹주소아래 콜문 esp+14
메인과 기타지역을 후킹했는데도 미번역문이 보인다면 이 기타함수쪽에서 추적하다보면 잡힐수도있다.
//메인
53 55 56 57 8B F8 33 F6 3B FE
콜로보낸 지역으로 이동해서 수정작업을 한다.
+혹은 이지역 함수시작지점에 esp+0x8 을 니트로엔진방식 + 분할번역으로 가능하긴하나 단문뒷문 짤림 , 명령제어문 씹혀서 연출 씹힘
검색안될시
33 F6 89 74 24 48 89 74 24 34
아래 예제에있는 초록색쪽으로 검색된다.
004106C3 TEST EBP,EBP
004106C5 JNZ totono.004105C1
004106CB JMP totono.004109CD
004106D0 MOV EDX,DWORD PTR SS:[ESP+14]
004106D4 MOV EAX,DWORD PTR SS:[ESP+18]
004106D8 MOV ECX,DWORD PTR SS:[ESP+28]
004106DC PUSH EDX
004106DD MOV EDX,DWORD PTR SS:[ESP+34]
004106E1 PUSH EAX
004106E2 PUSH ECX
004106E3 PUSH EDX
004106E4 LEA EAX,DWORD PTR SS:[ESP+50]
004106E8 PUSH EAX
004106E9 XOR ESI,ESI
004106EB MOV DWORD PTR SS:[ESP+48],ESI
004106EF MOV DWORD PTR SS:[ESP+34],ESI
004106F3 MOV EDX,DWORD PTR SS:[EBP+208]
004106F9 MOV EAX,DWORD PTR SS:[EBP+204]
004106FF LEA ECX,DWORD PTR SS:[ESP+38]
00410703 PUSH ECX
00410704 PUSH EDX
00410705 PUSH EAX
00410706 CALL totono.0048E160
0041070B MOV ECX,DWORD PTR SS:[ESP+60]
0041070F MOV EDX,DWORD PTR SS:[ESP+44]
00410713 PUSH ESI
00410714 PUSH ESI
00410715 PUSH ECX
00410716 PUSH EDX
00410717 CALL totono.00491650
0041071C ADD ESP,30
0041071F MOV DWORD PTR SS:[ESP+20],EAX
00410723 CMP EAX,ESI
00410725 JE totono.004109CD
0041072B MOV ECX,DWORD PTR SS:[ESP+14]
0041072F MOV EDX,DWORD PTR SS:[ESP+18]
00410733 PUSH ECX
00410734 MOV ECX,DWORD PTR SS:[ESP+2C]
00410738 PUSH EDX
00410739 MOV EDX,DWORD PTR SS:[ESP+38]
0041073D MOV ESI,DWORD PTR SS:[ESP+1294]
00410744 PUSH ECX
00410745 PUSH EDX
00410746 LEA ECX,DWORD PTR SS:[ESP+54]
0041074A PUSH ECX
0041074B MOV ECX,DWORD PTR SS:[EBP+208]
00410751 LEA EDX,DWORD PTR SS:[ESP+5C]
00410755 PUSH EDX
00410756 MOV EDX,DWORD PTR SS:[EBP+204]
0041075C PUSH ECX
0041075D MOV ECX,DWORD PTR DS:[EBX+20]
00410760 IMUL ECX,ECX,158
00410766 PUSH EDX
00410767 LEA EDX,DWORD PTR DS:[ECX+ESI+1130]
0041076E PUSH EDX
0041076F CALL totono.0048B8E0
00410774 ADD ESP,24
00410777 MOV DWORD PTR SS:[ESP+34],EAX
0041077B TEST EAX,EAX
파란색이 우리가 검사해서 찾아온곳
초록색이 후킹전 강제널문 삽입을 위해 콜로 하단으로 보낼지점
분홍색이 후킹지점 및 콜로 내려서 작업할지점
004106E9 XOR ESI,ESI
004106EB CALL totono_A.00507415
004106F0 NOP
004106F1 NOP
004106F2 NOP
004106F3 CALL totono_A.00507437
004106F8 NOP
004106F9 MOV EAX,DWORD PTR SS:[EBP+204]
004106FF LEA ECX,DWORD PTR SS:[ESP+38]
00410703 PUSH ECX
00410704 PUSH EDX
00410705 PUSH EAX
00410706 CALL totono_A.0048E160
0041070B MOV ECX,DWORD PTR SS:[ESP+60]
위와같이 파일 밑부분으로 콜로 보냈음
//
그리고 메인 바이너리검색시 걸린위치 하단에 보면
CMP DL,7B 위치가 보일텐데
0048BF68 |FSTP ST
0048BF6A |MOV EAX,0A
0048BF6F |JMP SHORT totono.0048BF7C
0048BF71 |FIMUL DWORD PTR SS:[EBP+20F8]
0048BF77 |CALL totono.004E6280
0048BF7C |MOV DWORD PTR SS:[ESP+18],EAX
0048BF80 |MOV DWORD PTR SS:[ESP+10],EAX
0048BF84 |MOV DWORD PTR SS:[ESP+14],ESI
0048BF88 |MOV ECX,DWORD PTR SS:[EBP+2C]
0048BF8B |MOV DWORD PTR SS:[EBP+ECX*4+6213C],1
0048BF96 |JMP totono.0048BC0B
0048BF9B |CMP DL,7B
0048BF9E |JNZ SHORT totono.0048C019
0048BFA0 |MOV EDX,DWORD PTR SS:[EBP+60]
0048BFA3 |MOV EAX,DWORD PTR SS:[EBP+2C]
0048BFA6 |INC EDX
0048BFA7 |MOV DWORD PTR SS:[EBP+EAX*4+6E13C],EDX
0048BFAE |MOV EAX,DWORD PTR SS:[EBP+60]
0048BFB1 |CALL totono.00417690
0048BFB6 |MOV DWORD PTR SS:[EBP+60],EAX
0048BFB9 |TEST EAX,EAX
0048BFBB |JE totono.0048C902
0048BFC1 |CMP BYTE PTR DS:[EAX],7D
0048BFC4 |JNZ SHORT totono.0048BFD2
0048BFC6 |PUSH EAX
0048BFC7 |CALL totono.004E508A
0048BFCC |ADD ESP,4
0048BFCF |MOV DWORD PTR SS:[EBP+60],EAX
위에보이는 초록색 부분이 { } 둘러싸인 명령제어문 포인터 위치 저장하는곳이다.
명령제어문 포인터는 시작이나 로드시 먼저 등록이 되고 위 위치에서 저장된 포인터주소와 CMP 해서 같다면
출력되는 형태이다.
파란색 부분을 콜로 하단으로 보내서 작업을한다.
0048BF9B |CMP DL,7B
0048BF9E |JNZ SHORT totono_A.0048C019
0048BFA0 |CALL totono_A.0050747E
0048BFA5 |NOP
0048BFA6 |NOP
0048BFA7 |NOP
0048BFA8 |NOP
0048BFA9 |NOP
0048BFAA |NOP
0048BFAB |NOP
0048BFAC |NOP
0048BFAD |NOP
0048BFAE |MOV EAX,DWORD PTR SS:[EBP+60]
0048BFB1 |CALL totono_A.00417690
0048BFB6 |MOV DWORD PTR SS:[EBP+60],EAX
위와같이 파일 밑부분으로 콜로 보냈음
/$ >MOV DWORD PTR SS:[ESP+4C],ESI
|. >MOV DWORD PTR SS:[ESP+38],ESI
|. >MOV EDX,DWORD PTR SS:[EBP+208]
|. >MOV BYTE PTR DS:[EDX+14],0
|. >MOV EAX,DWORD PTR SS:[EBP+204]
|. >MOV DWORD PTR DS:[EBP+218],EAX
\. >RETN
//후킹전
파란색이 강제 널문 삽입
초록색이 원문 주소 백업
>INT3
>INT3
/$ >MOV EAX,DWORD PTR SS:[EBP+204]
|. >MOV ECX,DWORD PTR SS:[EBP+218]
|. >MOV DWORD PTR DS:[EAX-4],ECX
|. >MOV DWORD PTR DS:[EBP+218],0
|> >/CMP BYTE PTR DS:[EAX],2F
|. >|JNZ SHORT totono_A.0050745C
|. >|CMP BYTE PTR DS:[EAX+1],50
|. >|JE SHORT totono_A.00507464
|> >|INC EAX
|. >|CMP BYTE PTR DS:[EAX],0
|.^>\JNZ SHORT totono_A.00507451
|. >JMP SHORT totono_A.0050746B
|> >DEC EAX
|. >MOV EDX,DWORD PTR SS:[EBP+208]
|> >MOV BYTE PTR DS:[EDX+14],0A
|. >MOV DWORD PTR SS:[EBP+208],EAX
|. >MOV EDX,DWORD PTR SS:[EBP+208]
\. >RETN
분홍색 백업했던 원문 주소를 후킹메모리 -4 지점에 넣고 백업용 메모리 널문으로 원상복구
파란색이 ptrcheat가 이루어진 메모리에서 /P 검색
초록색이 원문에 강제널문을 다시 정상복구 > 종료문 포인터 위치 후킹메모리 종료문 위치로 변경
>INT3
>INT3
/$ >MOV ECX,DWORD PTR SS:[EBP+5C]
|. >MOV EDX,DWORD PTR DS:[ECX-4]
|> >/CMP BYTE PTR DS:[EDX],7B
|. >|JNZ SHORT totono_A.0050749B
|. >|CMP BYTE PTR DS:[EDX-1],0A
|. >|JE SHORT totono_A.005074A1
|. >|CMP BYTE PTR DS:[EDX+1],0D
|. >|JE SHORT totono_A.005074A1
|. >|CMP BYTE PTR DS:[EDX+1],9
|. >|JE SHORT totono_A.005074A1
|> >|INC EDX
|. >|CMP BYTE PTR DS:[EDX],0
|.^>\JNZ SHORT totono_A.00507484
|> >INC EDX
|. >MOV EAX,DWORD PTR SS:[EBP+2C]
|. >MOV DWORD PTR SS:[EBP+EAX*4+6E13C],EDX
|> >/CMP BYTE PTR DS:[EDX],7D
|. >|JNZ SHORT totono_A.005074BD
|. >|CMP BYTE PTR DS:[EDX+1],0A
|. >|JE SHORT totono_A.005074C3
|. >|CMP BYTE PTR DS:[EDX-1],0A
|. >|JE SHORT totono_A.005074C3
|> >|INC EDX
|. >|CMP BYTE PTR DS:[EDX],0
|.^>\JNZ SHORT totono_A.005074AC
|> >MOV DWORD PTR DS:[ECX-4],EDX
|. >MOV EDX,DWORD PTR SS:[EBP+60]
|. >INC EDX
\. >RETN
대사메모리 -4 지점에서 원문 주소를 가져온다음
파란색에서 { (7b) 검사
이때 7b가 일본어 문자 하위 바이트에 속하기 때문에 1/2바이트 체크를 하면서 7b 검사를 해야 좀더 완벽한 문이 될텐데
그냥 1바이트 검사 + 전후값 비교 하는 방법으로 검색문을 만들었음
분홍색지점에 원문을 주소를 넣어주면 이제 명령제어문 씹히진 않는다.
초록새이 } (7d) 검사
위와동일하다. 초록색 마지막 부분에 대사메모리 -4 지점에 7d 이후의 주소를 넣어준다.
기본골격을 위와같이 잡고 적절히 수정해주면 될듯싶기도하다.
바이너리값 ebp 기반 (ex. [ebp+204])
89 74 24 4C 89 74 24 38 8B 95 08 02 00 00 C6 42 14 00 8B 85 04 02 00 00 3E 89 85 18 02 00 00 C3
CC CC 8B 85 04 02 00 00 8B 8D 18 02 00 00 89 48 FC 3E C7 85 18 02 00 00 00 00 00 00 80 38 2F 75
06 80 78 01 50 74 08 40 80 38 00 75 EF EB 07 48 8B 95 08 02 00 00 C6 42 14 0A 89 85 08 02 00 00
8B 95 08 02 00 00 C3 CC CC 8B 4D 5C 8B 51 FC 80 3A 7B 75 12 80 7A FF 0A 74 12 80 7A 01 0D 74 0C
80 7A 01 09 74 06 42 80 3A 00 75 E3 42 8B 45 2C 89 94 85 3C E1 06 00 80 3A 7D 75 0C 80 7A 01 0A
74 0C 80 7A FF 0A 74 06 42 80 3A 00 75 E9 89 51 FC 8B 55 60 42 C3 CC CC
구버전 ebx기반 (ex. [ebx+104])
89 74 24 4C 89 74 24 38 36 8B 93 08 01 00 00 C6 42 14 00 36 8B 83 04 01 00 00 89 83 18 01 00 00
C3 CC CC 36 8B 83 04 01 00 00 36 8B 8B 18 01 00 00 89 48 FC C7 83 18 01 00 00 00 00 00 00 80 38
2F 75 06 80 78 01 50 74 08 40 80 38 00 75 EF EB 0C 48 36 8B 93 08 01 00 00 C6 42 14 0A 36 89 83
08 01 00 00 36 8B 93 08 01 00 00 C3 CC CC 8B 55 40 8B 42 FC 80 38 7B 75 12 80 78 FF 0A 74 12 80
78 01 0D 74 0C 80 78 01 09 74 06 40 80 38 00 75 E3 40 8B 4D 24 89 84 8D 18 E1 06 00 80 38 7D 75
0C 80 78 01 0A 74 0C 80 78 FF 0A 74 06 40 80 38 00 75 E9 89 42 FC 8B 03 40 C3 CC CC
//샘플 + b코드만 입력해서 디버거로 확인해보면 어디를 수정했는지 알수있다.
6 | 2013/06/28 | [ATCode] [수정]너와 그녀와 그녀의 사랑. (君と彼女と彼女の恋。) [47] |
5 | 2008/09/26 | [ATCode] 스마가 (スマガ) [6] |
4 | 2012/07/26 | [ATCode] 길티 크라운 로스트 크리스마스 (ギルティクラウン ロストクリスマス) [1] |
3 | 2012/03/23 | [ATCode] [BL]Dramatical Murder (드라마티컬 머더) |
2 | 2013/04/26 | [ATCode] [BL]DRAMAtical Murder re:connect (드라마티컬 머더 리:코넥트) |
음 검색해보니 중국에서 루드더블 해독해놨던데 툴이 안올려져있네용
TGA 파일형식 화앨2와 비슷한 양상의 폰트파일인듯 합니다.
http://tieba.baidu.com/p/2397878791
니트로 확인했는데,
0048BF9B |CMP DL,7B
0048BF9E |JNZ SHORT totono.0048C019
0048BFA0 |MOV EDX,DWORD PTR SS:[EBP+60] <<
0048BFA3 |MOV EAX,DWORD PTR SS:[EBP+2C]
0048BFA6 |INC EDX
0048BFA7 |MOV DWORD PTR SS:[EBP+EAX*4+6E13C],EDX
<< 여기에서 그냥 EDX의 값만 바꿔도 정상적으로 먹히는것 같네요. edx값을 바꾼후에, mov edx,dword ptr ss:[ebp+60] 이 명령어
자체를 지워버려도 되는거 같습니다. 그렇게 하면 굳이 복구하지 않아도 정상적으로 작동하네요.
팬텀 오브 인페르노가 콘솔 이식작이라 그런거 같습니다..
성의없이 그대로 이식한듯...?
로고에 CRIWARE도 보이고 파일 구성을 보니깐 그대로 인거 같네요...
폰트는 .xtx인거 같은데 루트더블이랑 같은듯[....]
참고로 xtx 확장자는 플스 psp용 텍스쳐 포멧인듯 합니다.