동일 작품의 가장 최근 버전인 2009년도 출시 완전판 1102일자 패치 적용 버전으로 코드 찾기를 진행 한 결과,
뭐랄까 짜증이 마구마구 치솟아 오르는군요..
결과적으로 아직 찾아내지 못했습니다.
대충의 동작 방식은 알아낸것 같은데 제 실력이 미천해 그이상 진도를 나갈수가 없군요.
실력있으신 분들의 조언이 필요합니다.
일단 아랄 디버거에서 뜨는 후킹 포인트는 써먹을 수 없습니다.
한글자 출력은 아니고 완성된 대사를 불러와서 한글자씩 맨앞의 글자를 잘라서 가져오는 구조더군요.(결국 한글자 출력인가?)
그래서 그 후킹 포인트에서 올리디버거로 추적해 봤는데 최종적으로 도달한 곳이 루프입니다.
브레이크 포인트를 걸면 게임이 실행되지 않습니다. 계속 브레이크가 걸려요....
아마도 음성이나 배경음 처리, 혹은 내부적으로 이벤트를 처리하기 위한 루프코드가 계속 실행되고 있는지도 모르겠습니다만... 코드를 읽을 줄 모르니 잘은 모르겠습니다.
그래서 대사를 이용해서 추적해 들어간 결과 최종적으로
4bf8f78
에 도달했습니다. 여기까지 오면서 알아낸 바에 의하면...
일단 대사 처리를 위해 메모리에 로드한 스크립트를 한글자씩 읽어들여서 위의 주소에 씁니다. 그리고 그 길이를 체크하는 레지스트를 따로 두는듯 하더군요.
그리고 여기서부터가 문제인데,,, 저기에 들어가는 대사는 케릭터 1명분의 대사가 아닙니다.
본 게임은 텍스트의 화면 출력에 있어서 2가지의 방식을 사용하는데, 보통의 게임들 처럼 한 케릭터의 대사에 한 페이지를 사용하는 방식과, 비쥬얼노벨 형식으로 여러 대사를 한페이지에 보여주는 방식입니다.
그런데 두번째 방식의 경우 한 화면에 출력되는 모든 텍스트가 위의 주소에 이어붙여서 쓰입니다. 이경우 텍스트를 불러올때 시작위치를 가지는 레지스터를 두는 건지, 아니면 누적으로 텍스트의 길이를 구해서 그부분부터 시작하는지는 밝혀내지 못했습니다.
그리고 첫줄부터 시작되는 다음 대사 페이지가 되면 또다시 저 주소의 처음부터 쓰기 시작하는데 이 때 이 주소에 저장된 이전 텍스트를 클리어 하지 않고 그냥 덮어 씁니다. 즉 덮어 쓰고 난 뒤쪽에는 이전페이지의 텍스트가 그대로 남습니다.
믿을만한 구석은 이 주소 뿐인지라 이주소에서 이전 페이지의 찌꺼기가 남아있는 부분까지 통째로 브레이크 포인트를 걸고 게임을 진행시켰습니다만.....무슨 메모리에 구멍이 날 정도로 심하게 엑세스를 하더군요...한글자씩 쓰고 한글자씩 읽어들이니 대사에 포함된 텍스트 수만큼 엑세스가 일어나는건 그렇다 쳐도 해당 텍스트의 몇배이상의 엑세스가 발생합니다.
도저히 모두 체크할 수가 없어서 가장 마지막에 발생한 엑세스포인트에서 후킹을 진행한 결과...덤프텍스트 창에는 해당 주소의 텍스 내용이 뜨지만(물론 다닥 다닥 대사가 붙어 있어서 깔끔하게 잘려 나오진 않습니다. 해당 주소를 가진 EBP 에 EBA~EBD 등등 그럴듯한 수치를 가진 레지스터를 더해도 깔끔하게 잘리지 않습니다..) 실제 게임의 대사 출력창에는 원문만 출력됩니다.....즉 출력과는 아무런 관계가 없는 후킹 지점입니다...(아.그럼 읽지좀 말라고..ㅡ,.ㅡ;;;)
아랄 디버거로 찾은 대사 출력지점을 보면 일단 최초에 걸리는 대사는 완벽한 대사입니다. 이후 한글자씩 앞쪽의 글자를 잘라내죠. 즉, 최초 해당 함수를 불러오는 지점을 추척하면 완성된 대사를 불러오는 곳을 찾아 낼 수 있지 않을까해서 진행한 결과가 처음에 말한 루프입니다. 하지만 생각해보면 건드릴 만한 구석은 그것밖에 없는듯한데 도저히 찾아내질 못하겠습니다.
뭔가 쓰고보니 두서없는 글이 되었습니다만,, 대체 어떻게 해야 찾아 낼 수 있을까요....
나오는건 좀 구리네요.
40b360 esi - 이름
41b1cb edx+eax - 루비문자(윗부분)
41aabc ecx+edx - 대사 (루비문자부분 아래 위 없고, 이름 안나옴)
cmdfilter 덮어쓰기 모드에 공백문자 제거 필수입니다. (2바이트도 체크해줘야 좋을듯.)
글자수 제한 있는 부분이라 구립니다. 참고로 해서 찾아보세요.
거기에 안정성도 보장 못해요. 애초에 원문을 대사, 이름, 루비 위, 루비 아래로
나눠서 뿌리니까, 뿌리기 전에 모인 곳을 찾던가 해야될듯요.
아랄 디버깅으로도 나오는 4288d0 부분이 모인곳이긴 하니까
되도록 이걸 기점으로 찾으면 좋을듯요.