우선 컴퓨터가 요즘이상하다. 곧 천운을다하고 가라앉을것같다. 써놓고 보자.

 

라이트사 게임을 조금 들여다봤다. 소감은 매우 깔끔하다.

문제는 유니코드 1바이트 문자로 명령을내리는 명령스크립트라는거다. 젠장 젠장 젠장 젠장 젠장

명령스크립트 중간에 널문자도 포함되어 있다. 젠장 젠장 젠장 젠장 젠장

 

실험대상 소개

神咒神威神楽 2011/09/30 일생.

http://www.getchu.com/soft.phtml?id=699410

 

test.PNG

 

먼저 가능성을 보자. 디버거 자체조작으로 07 00 06 00 을 문장 종결에 붙여 주었을때 정상 출력된다.

 

SCR1.PNG

 

픽스라인 역시 유니코드에서 먹통이다. 그냥 번역안함 > 번역안된 아스키값 투척~ ... 느낌이 이렇다.

 

voice.PNG

 

픽스라인을 극복한다해도 중간에 널문자는 어찌 해야할까...

0700 0800 보이스 0000 대사. . . . . . . . . . . . . . 머지 이 아름답기까지한 명령스크립트는

문자값 종료를 0x0600 로하면되지않을까싶다.

 

ruby.PNG

 

루비문자 같은경우 0700 0100 문자 0A00 문자 0000 이딴식이다. 머지 이놈들 널문자 너무 쉽게쓴다.

그러고보니 선택문은 아직 보지않아서 어떤식인지 모르겠다. 머 저 딴식이겠지....

 

AT코드 체험판

NOASLR,HOOK(0x004126F6,TRANS([ESP+0x8],UNICODE,OVERWRITE),RETNPOS(COPY))

AT코드 본편

NOASLR,HOOK(0x004127C6,TRANS([ESP+0x8],UNICODE,OVERWRITE),RETNPOS(COPY))

 

유니코드변경하자. 한윈에선 세이브가 안된다.

 

뛰어난 덧셈,빼쎔 으로 본편에 코드옮겨심기까지 완료했고... 이제 이걸 해결하면되겠군..

 

이제 즐거운 C를 배워야겠다. 대학때 들은 교양과목이 아직까지 기억에 남아있군.

printf("Hellow World");

이게 맞나 이거하나 쓰면 화면에 출력됐던것 같은데..

 

그냥 ATCODE.DLL을 올리로 변경하는게 쉬울려나.. 이래저래 왜 내손에 걸리는것들은 하나같이 유니코드인게지...

 

__________________________________________________________________________________-

 

change.PNG

 

대사 스크립트인지 아닌지 판별해서 대사면 변환하고 기타면 원래 함수로 점프.

 

restor.PNG

 

번역문 검사해서  변환한거 원래 헥스로 변경.

 

대충 이러한 허접한 수정을 했는데 요놈이 탄생하기까지 무한수정을해서 어찌됐든 대사 출력되고 튕기진않는다.

 

 

7개의 헥스값을 치환한다.

 


0 【 10 30
1 】 11 30
4 〔 14 30
6 〕 15 30
7 〈 08 30
8 〉 09 30
9 《 0A 30

패턴1 < 일반적인 대사
대사 07 00 06 00
패턴2 < 보이스 「대사」
07 00 08 00 보이스영문 00 00 대사 07 00 09 00 07 00 06 00
패턴3 < 루비포함
대사 07 00 01 00 대사 0A 00 루비 00 00 대사 07 00 06 00
그외
07 00 04 00 대사출력시 강제개행할때
0A 00 0A 00 화면전체에 출력시 개행

 

 

Light사 공통 tool.dll 이 없는 최신엔진인 경우.

 


대사 // 바이너리검색 .. 리턴값 들어가면 거기가 후킹지점. [ESP+8]

8B 53 08 8B 48 04 8B 18 8B C1 8B 72 10 83 C4 08 03 F3 C1 E9 02 F3 A5 8B C8 83 E1 03 F3 A4 5F 5E 5D 5B 83 C4 08

 

이름 // 바이너리검색 .. 리턴값 들어가면 거기가 후킹지점. [ESP]

8B 7C 24 10 8D 48 02 8B C1 83 C4 04 C1 E9 02 F3 A5 8B C8 83 E1 03 F3 A4 5F 5E

 

선택지 // 바이너리검색 .. 아래 콜문들어가서 거기가 후킹지점 EDX

5E 8B 84 24 2C 02 00 00 5F 8B C8 C1 E9 10 5D 5B

 

최대한 베이스주소에 가까운곳 주소를 찾아야한다. 옮겨심기할려면...


그외 부가적인것들 (예 '종료합니까?') 아랄자체디버거로 검색해서 추가가능.

 

 

_______________________________________________________________________

 

개행분할번역

light사 몇개의 작품에서 화면 전체에 대사를 출력할때가 있어서 개행분할번역 옵션을 넣어야한다.

작동방식은 정확히 모르겠으나 0A로 작동되는것같다.

문제는 루비문자 제거를 위해 픽스라인을 사용하게 되면 개행분할시에는 픽스가 바보가된다.

 

0A도 변환하고 0A0A 헥스값은 하나만 변환하게 하는방향으로 dll 수정을 더해야할것같다.

아니면 픽스라인 안쓰면 그만이긴하다 냐하하..

 

 

3개정도 돌려봤는데 모두 정상작동된다. 문제는 체험판 > 본편 옮겨심기가 힘들다.

근성으로 해결해야지...

 

 _____________________________________________________________________________________

대사

8B 53 08 8B 48 04 8B 18 8B C1 8B 72 10 83 C4 08 03 F3 C1 E9 02 F3 A5 8B C8 83 E1 03 F3 A4 5F 5E 5D 5B 83 C4 08

5F [esp+0x24]

이름

8B 7C 24 10 8D 48 02 8B C1 83 C4 04 C1 E9 02 F3 A5 8B C8 83 E1 03 F3 A4 5F 5E

5F [esp+0xc]

선택지

5E 8B 84 24 2C 02 00 00 5F 8B C8 C1 E9 10 5D 5B 74 13 8D 54 24 18 52 25 FF FF 00 00 50 E8

E8 EDX

 

 갑옷을 입으면서 씹히는 함수들이 있어서 야매위치 수정..(원래 있던위치는 위 함수에서 리턴값으로 빠져나간건데 그냥 요함수로)

Light 사 tools.dll 이 없는 최신 엔진은 요걸로 //

게임을구동하고 HxD 램오픈으로 Malie.exe 선택하고 > CRT+F > 바이너리형 > 위 바이너리값 입력 해서 위에 빨간부분

바이너값 주소에 해당 인자값을 넣어주면된다. // 주의사항으로는 올리디버거는 주소시작이 1 HxD는 0 이다.. 주소입력할때 주의하자. 

 

 

 ________________________________________________________________________

work.txt 

 

피시님이 올려주신 올리디버거로 열람을해보니. 픽스라인 넣어둔 상태로도 디버깅을 할수가있네..

 

어라 그러면 atcode.dll 수정을 좀더 하면 깔끔해지겠는데... 귀찮다 그것이 문제로군. 너무 늦게 알았다.

이정도면 됐다싶다.

__________________________________________________________________________