우선 컴퓨터가 요즘이상하다. 곧 천운을다하고 가라앉을것같다. 써놓고 보자.
라이트사 게임을 조금 들여다봤다. 소감은 매우 깔끔하다.
문제는 유니코드 1바이트 문자로 명령을내리는 명령스크립트라는거다. 젠장 젠장 젠장 젠장 젠장
명령스크립트 중간에 널문자도 포함되어 있다. 젠장 젠장 젠장 젠장 젠장
실험대상 소개
神咒神威神楽 2011/09/30 일생.
http://www.getchu.com/soft.phtml?id=699410
먼저 가능성을 보자. 디버거 자체조작으로 07 00 06 00 을 문장 종결에 붙여 주었을때 정상 출력된다.
픽스라인 역시 유니코드에서 먹통이다. 그냥 번역안함 > 번역안된 아스키값 투척~ ... 느낌이 이렇다.
픽스라인을 극복한다해도 중간에 널문자는 어찌 해야할까...
0700 0800 보이스 0000 대사. . . . . . . . . . . . . . 머지 이 아름답기까지한 명령스크립트는
문자값 종료를 0x0600 로하면되지않을까싶다.
루비문자 같은경우 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을 올리로 변경하는게 쉬울려나.. 이래저래 왜 내손에 걸리는것들은 하나같이 유니코드인게지...
__________________________________________________________________________________-
대사 스크립트인지 아닌지 판별해서 대사면 변환하고 기타면 원래 함수로 점프.
번역문 검사해서 변환한거 원래 헥스로 변경.
대충 이러한 허접한 수정을 했는데 요놈이 탄생하기까지 무한수정을해서 어찌됐든 대사 출력되고 튕기진않는다.
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 이다.. 주소입력할때 주의하자.
________________________________________________________________________
피시님이 올려주신 올리디버거로 열람을해보니. 픽스라인 넣어둔 상태로도 디버깅을 할수가있네..
어라 그러면 atcode.dll 수정을 좀더 하면 깔끔해지겠는데... 귀찮다 그것이 문제로군. 너무 늦게 알았다.
이정도면 됐다싶다.
__________________________________________________________________________
역시 프로그래밍이 해결안 같더군요.
천천히 해봐야죠.. 최종목표는
생각1
치환함수
번역전 치환
처음 문자열을 받아서 4바이트씩 검사
치환
종료문자 유저로 부터 받으면 널문자도 치환가능.
번역후 치환
아스키값을 치환문으로 받으면 유니코드로.
1바이트문 2바이트 유니코드로
치환문 복구
마지막 종료문자 치환.
_________________________________
대충 이러한 함수를 본진에 심고// 픽스라인과 디나이워드(이그잭트) 연동을 하면 될듯싶더군요.
어디까지나 구상이지만 구상은 나름 괞찮지않나요?
프로그램화 하려면 아마도 오랜 시간이 걸릴듯하지만... 머 언젠간 되겠죠.
어째 되었든 요놈은 한글출력은 되니까요.. 나름 희망
대사 패턴이 07 08 보이스 00 대사 이렇게 되버리는데...
일반 대사는 그냥 하면 되는데 보이스 첨부대사는 보이스
이름으로 -ㅂ-...
본편 본진은 갑옷둘둘이라 거기는 접근도힘들고
되는곳은 아랄밖에 없을듯하네요.
기존light사 코드보니 tools.dll을 수정한것같던데 지금은 그런 dll을 사용하지 않나봐요.