ollydbg 이용해서 대사 헥스값으로 찾으면
004A2050 에서 브레이크 걸리는데
agth 로 /x 옵션 걸고 해보면 0053CF61, 0053CFAF 에서
둘다 GetGryphOutlineA 함수에서 대사가 튀어나오네요
아무튼 대사가 완벽하게 나오길래 0053CF61 로 찾아 들어가서
함수 시작 주소가 0053CE20 라는 것은 알아냈는데요
쭉 내려보니 GetGlyphOutlineA 함수 콜 부분을 찾을 수 있었습니다
GetGlyphOutline 함수는 보통
DWORD GetGlyphOutline(
__in HDC hdc,
__in UINT uChar,
__in UINT uFormat,
__out LPGLYPHMETRICS lpgm,
__in DWORD cbBuffer,
__out LPVOID lpvBuffer,
__in const MAT2 *lpmat2
);
이렇게 생겨먹었으니 텍스트가 들어갈 uChar 는 EBP 에서 가져온다는 것을 알아냈습니다
그리고 함수 시작부분부터 다시 시작해서 Step Over 로 차근차근 EBP 변화값을 봤습니다
그런데 EBP 값이 변하질 않더군요
그래서 상위 함수를 찾기로 했습니다
콜스택 창을 보니 0053D650 함수에서 콜한 것을 찾았습니다
그래서 0053D650 에 브레이크 걸고 EBP 값을 추적해보니
MOV EBP, DWORD PTR SS:[ESP+B4] 에서 EBP 값을 바꿔주는 것을 확인했습니다
그 이후로 0053CE20 함수까지 찾아 가는 동안에 EBP 값의 변화는 없었구요
EBP 에는 4자리 헥스값이 들어가있더군요
아무튼 저건가보다 해서 0053D650 함수 시작부터 ESP 를 계산해봤습니다
우선 시작하자마자
SUB ESP, 9C
니까 -9C 해줘야겠구요
그 이후로
PUSH EBX -4
PUSH EBP -4
PUSH ESI -4
PUSH EDI -4
PUSH EAX -4
CALL EBX +4
PUSH EDI -4
CALL EBX +4
PUSH ECX -4
PUSH EDX -4
CALL 0052E6B0 +8
해주면 -10이고
MOV EBP, DWORD PTR SS:[ESP+B4]
에서 ESP+B4 이니
최종적으로 ESP -9C -10 +B4 하면 +8이네요
그래서 아랄 후킹주소에 0053D650 걸고
[ESP+0x8] 해봤는데
안돼요!!! 도와주세요!!!
클립보드에 복사되는 것 조차 없어요
뭐가 잘못됐죠? ㅠㅠ
일단 말하자면 3번 지나갑니다
세 대사마다 한번씩 세번 돕니다
그런데 아무래도 약간 틀린 것 같습니다
꼭 -1 2 0 순서로 갖고 오는건 아니었네요...
아무튼 후에 나올 대사를 먼저 가져온다는 것은 변함이 없었습니다
그리고 장면이 바뀌거나 보이스가 있을 때에
040694FA 65 67 20 35 20 24 38 30 30 30 30 30 30 30 20 31 eg 5 $80000000 1
0406950A 30 32 34 20 35 37 36 20 30 20 30 00 01 30 62 67 024 576 0 0.0bg
0406951A 20 30 20 62 67 30 38 20 30 20 30 20 30 20 30 00 0 bg08 0 0 0 0.
0406952A 01 30 72 64 72 61 77 20 36 30 00 01 30 77 61 69 0rdraw 60.0wai
0406953A 74 00 01 30 62 67 6D 20 30 20 62 67 6D 31 37 00 t.0bgm 0 bgm17.
0406954A 01 30 62 67 6D 20 30 20 76 6F 6C 20 35 30 0bgm 0 vol 50
eg 5 $80000000 1024 576 0 0
bg 0 bg08 0 0 0 0
rdraw 60
wait
bgm 0 bgm17
bgm 0 vol 50
이런 정보도 지나가구요
일단 004A2050 함수 콜하는 상위 함수들을 알아보기 위해 콜스택을 유심히 봤는데요
- Running 중인 게임상에서 클릭
- Break 걸림
그 상태에서의 콜스택
-여기서는 EAX에 이전 대사 (클릭할 때 표시되어있던 대사) 들어감
-다시 Break
-이번에는 현재 대사(클릭하고 나올 대사)가 EAX에 저장
-그 이후로 3번 더 Break 걸렸는데 전부 2번째와 같은 대사(현재 대사)
그리고 다섯개 모두 콜스택이 똑같았습니다
이럴때는 뭐 어떻게... ㅠㅠ
으아 머리 터질 지경
아, 써주신 답변에 대해 써보자면
0. 일단 GetGryphOutlineA 에서 튀어나온다는 대사를 GetGryphOutlineA 함수를 콜하기 전 대사의 일부를 수정(숫자나 영어로) 하여 제대로 수정되어 출력되는지 우선을 확인해주세요.
→ 수정이 되는 것을 확인했구요
1. 휠로 CPU dump 창 위아래 확인해보면 어느정도 차이가 나는지 눈으로 확인이됩니다.
제대로 ESP+0x8 위치를 가르키고 있었다면 색칠된 8바이트가 위쪽으로 댕겨진 상태가 되겠군요.
틀렸다면 계산의 오류일겁니다.
→ 함수 시작점에서의 ESP값이 0712EA40 이었다면
Go to 로 ESP+0xB4 를 한 위치는 0712EA48 을 가리켰습니다
즉 오프셋이 8 차이나는 것을 확인했습니다
2. ..........는 제가 이해를 잘 못해서 결과를 말씀드리기가 힘들고
3. .....도 약간 헷갈려서 제가 잘 이해한건지 모르겠는데
GetGryphOutlineA 함수 이후에 후킹해서 대사값이 변했을지도 모른다는 말씀이신가요?
→ 제가 찾은 GetGryphOutlineA 함수는 두군데가 있었고 그 주소는
0053CF61, 0053CFAF 이 두개였습니다
그리고 주소값을 보면 꽤 가까운데 같은 함수 안에서 저 함수가 두번 불려진 것이었습니다
그 함수 시작주소는 0053CE20 였구요
그런데 0053CE20 함수에서 EBP 값이 처음부터 계속 유지가 되어있으니 그 상위 함수를 찾아 들어갔습니다
그 상위 함수 시작주소가 바로 0053D650 였습니다
즉
0053D650
┗ 0053CE20
┗ 0053CF61 (GetGryphOutlineA)
┗ 0053CFAF (GetGryphOutlineA)
이런 식인데 0053D650 에 브레이크 걸면 함수 전에 후킹한게 되는 것 아닌가요?
음...
자세한 답변 감사드립니다!!
그런데 봐도 잘 이해가 안가서 (답변해주신 거에는 죄송하지만) 좀 다른 부분으로 접근하고 있었습니다
제가 글 처음에
'ollydbg 이용해서 대사 헥스값으로 찾으면
004A2050 에서 브레이크 걸리는데'
라고 썼었는데 그쪽으로 방향을 바꿔서
함수 시작부분인 004A2050에 브레이크를 걸고 Step Over 하고 있었습니다
그런데 함수 내부에서
CALL .005D7A60 부분을 지나자 EAX 레지스터에
이렇게 대사값이 들어오더군요
아 함수 첫부분 말고 대사 메모리에 접근하는 쪽은 저곳에서 더 밑에
MOV CL, BYTE PTR ?S[EAX]
인가 그랬습니다
그래서 EAX를 주시하면서 한단계한단계 보고 있었는데
우선 저 함수가 콜되면 EAX 레지스터에 대사값을 가지고 오는구나 하는걸 알 수 있었습니다
그런데 생각한게
'그냥 저 뒤인 004A2091 에 아랄트랜스로 후킹주소를 걸고
번역인자를 EAX로 주면 긁어오지 않을까?'
싶어서
HOOK(0x004A2091,TRANS(EAX)) 해봤더니 대사를 긁어오긴 하더군요
하지만 또다른 문제가...
이런 식으로 현재 대사는 세번째에 표시되고
한 2단계 앞의 대사를 먼저 긁어오더라구요
번역된 대사를 보시면
'사람이란 반드시...' 부분은 현재 대사의 바로 이전 대사이구요
'「당신, 바뀐 원이네요」...' 부분은 현재 대사의 다음 다음 대사입니다
저 물음표는 제가 '번역된 텍스트를 클립보드로' 에 체크를 해놔서 ez트랜스가 한글을 번역해버려서 그런겁니다
즉 CALL .005D7A60 함수는
대사가
[-1](이전대사) [0](현재대사) [1](다음) [2](다다음)
라고 하면
한번 클릭으로 대사를 넘기게 되면 [-1] → [2] → [0] 의 순서로 총 세번 대사를 가지고 오는 것 같습니다
추측해보면 [-1] 은 백로그에 쓸테고 [0] 은 현재 화면에 [2] 는 준비하느라 쓰는거 같은데...
이런 경우에는 어떻게 해야 하나요..?
포인터 바꿔치기로 해보면 내용이 바뀌긴 하는데 역시 다른값이 가져와져서
bgm 정보나 음성파일 정보 같은게 들어가버리더라구요
좀더 상위 상위 상위 함수로 찾아 들어가서 현재창에 뿌려주는 부분을 구별해야하나요?
디스어셈블리 시작한지 얼마 안되서 너무 어렵네요 ㅠㅠ