안녕하세요.
많은 분들이 어려워 하시는데 혹시 도움이 될 수 있을까 해서 적어요.
글재주가 없어서 많이는 적지 못해요.
시작하기에 앞서
본 글은 응용편이므로, AT코드를 적어도 4-5회 이상 찾아본 사람이 읽어야 이해 할 수 있는 내용을 포함하구 있구요,
프로그램은 이뮤니티 디버거를 사용하였으나, 이것은 그냥 제 눈이 편해서 이므로 프로그램을 가리실 필요는 없어요.
이 글에서는 미육의 향기를 샘플로 삼았구요, 이유는 콜스택 보면서 거슬러가기, 인자값 계산하기에 비교적 간단하면서 이해하기 쉬운 구조를 갖고 있기 때문이에요.
여기서 다루는게 모든 게임에 적용되지는 않을 것이며, 혹은 제가 설명 도중 잘못 이해하거나 알 수 없는 횡설 수설을 할 수도 있겠지만 너그러이 이해해 주시길 바래요.
그럼 시작할께요.
1. 대사 선정
대사 선정은 아무렇게나 해도 되지만, 자체 디버거로 대사열을 찾을 수 있을경우 자체 디버거에서 못찾는 대사를 골라 주는것이 더 유리해요. 그렇게 해서 찾는 코드가 완성도가 더 높거든요.
저는 기존 미육의 향기에서 번역이 되지 않았던
早々と会長職も退き、今は悠々自適の生活。
를 샘플로 채택했어요.
HEX코드는
9181 8158 82C6 89EF 92B7 9045 82E0 91DE 82AB 8141 8DA1 82CD 9749 8158 8EA9 934B 82CC 90B6 8A88 8142
2. 멤브레이크 걸기
해상 대사를 찾아서 브레이크를 걸고 게임을 진행했어요.
대사 브레이크 건 지점을 메모해두면 좋아요.
나중에 브레이크 지점에서 레지스터 덤프를 보지 않더라도 대사값이 있는지 없는지를 한눈에 알 수 있게 되거든요.
(메모리 대사들을 대충 어디에 넣었는지 알게 됨으로서 레지스터 옆의 주소만 보고도 이게 내가 원하는값인지 아닌지 여부를 빨리 알 수 있게 된다는 이야기에요)
다음 위치에서 브레이크가 걸렸어요.
브레이크 지점을 보면 MOV AL, BYTE PTR DS:[EDX+EAX] 라고 되어있죠.
컴퓨터를 전혀 모르는 사람을 위해, 수식으로 만들어 보면
AL = EDX + EAX 가 되요.
그러니까 EDX + EAX에 대사가 있어서 브레이크가 걸린 것이겠죠?
일단은 여기까지만 생각해두기로 해요.
3. 콜스택 보기
alt+k를 누르면 콜스택 창이 열려요.
Procedure / arguments 창은 현재 호출된곳 인자들이에요.
이곳은 중요하지 않지만 그냥 설명하면, 첫째열의 Includes AI6WIN.00472036을 보면 해당 브레이크가 걸린곳은
AI6WIN.00472036에 해당되는 곳이고 , 3줄 아래 보시면 Arg1이 보이는데 인자를 뜻해요.
Arg1은 esp 0x4, Arg2는 esp 0x8...이런씩으로 달려요. 크게 중요하지는 않아요.
콜스택을 연 이유는 메모리 브레이크가 걸린곳이 아랄트랜스를 붙이기 적당하지 않은 지점으로 판단했기 때문이에요.
나중에 해보시면 알겠지만 첫 브레이크가 걸리는 지점은 접근 빈도가 너무 높거나, 글자를 다른곳으로 복사하는 중이거나, 모든 텍스트를 다루기 때문에 (게임 내부 커맨드라고 칭할께요) 아랄트랜스로 번역을 했을때 원하지 않는 값이 번역 될 확률이 대단히 높기 때문이에요.
그럼 본 함수를 호출한 곳으로 가면 무엇이 좋아지느냐?
빨간 사각형이 호출한 곳인데요, 472030을 호출한 4245D4지점으로 가볼께요.
복잡하죠?
근데 애석하게도 여기도 아랄 트랜스를 붙이기에는 적당해 보이지 않네요.
제일 윗라인을 찍어보니 Local calls from 004234E8, 0042350D가 보이실꺼에요.
본 함수를 저 두군대에서 호출한다. 라는 뜻인데요.
한단계 더 앞으로 가봐야 겠네요.
콜스택 다음 라인에 있던 4234E8로 가볼께요.
흠.. 이 이상 앞으로 가기는 무리겠네요.
일단 위쪽에서 대사값을 입력하는걸로 의심되는 부분이 몇개 보이구요, 함수가 윗쪽으로 너무 길어서 귀찮네요 더이상은....
여기까지만 올라가보기로 하구요.
각각 지점에 브레이크를 걸어볼께요
472036, 4245D4 , 4234E8
그리고 대사를 한줄 넘기면서 각각 브레이크가 몇번씩 걸리는지 세보는거에요.
결과는
472036, 4245D4 ->천만번 (실은 세다가 걍 포기)
4234E8 ->한번 (굿)
일단 임시로 4234E8을 훅 지점으로 잡기로 해요.
여기까지는 그다지 머리 쓸일이 없구요 문제는 이제부터에요.
4. 즐거운 계산하기
문제는 이거에요
EDX+EAX가 4234E8에서는 어떤값이 었을까? 라고 계산을 해주는거에요.
아
글쓰기 싫다 존나 이짓거리 또할라니까 짱나네여...
볼드체로 되있는데는 콜 지점을 뜻해요.
00472030 MOV EDX,DWORD PTR DS:[ECX+10] =>[ECX+0X10]+[ECX+0XC]
00472033 MOV EAX,DWORD PTR DS:[ECX+C] =>EDX+[ECX+0XC]
00472036 MOV AL,BYTE PTR DS:[EDX+EAX] =>EDX+EAX
00472039 PUSH ESI
0047203A MOV ESI,DWORD PTR SS:[ESP+8]
0047203E ADD EDX,ESI
00472040 MOV DWORD PTR DS:[ECX+10],EDX
00472043 POP ESI
00472044 RETN 4
이제 요쪽은 계산끝났구요. 요걸 콜한 애쪽으로 가서 또 계산해야겠죠
00424570 PUSH ECX =>[EDI+0X10]+[EDI+0XC]
00424571 PUSH ESI
00424572 CALL AI6WIN.0040C820
00424577 MOV ESI,DWORD PTR DS:[EAX+38]
0042457A TEST ESI,ESI
0042457C JE SHORT AI6WIN.004245E3
0042457E MOV EAX,DWORD PTR DS:[ESI+50]
00424581 TEST EAX,EAX
00424583 JE SHORT AI6WIN.004245E3
00424585 MOV ECX,DWORD PTR DS:[ESI+54]
00424588 SUB ECX,EAX
0042458A MOV EAX,66666667
0042458F IMUL ECX
00424591 SAR EDX,4
00424594 MOV EAX,EDX
00424596 SHR EAX,1F
00424599 ADD EAX,EDX
0042459B JE SHORT AI6WIN.004245E3
0042459D CMP EAX,32
004245A0 JA SHORT AI6WIN.004245A7
004245A2 CALL AI6WIN.00485686
004245A7 MOV EAX,DWORD PTR DS:[ESI+50]
004245AA MOV ECX,DWORD PTR DS:[EAX+7D8]
004245B0 SHR ECX,7
004245B3 AND CL,1
004245B6 JE SHORT AI6WIN.004245E3
004245B8 CALL AI6WIN.0040C820
004245BD PUSH 100
004245C2 CALL AI6WIN.0040D760
004245C7 TEST AL,AL
004245C9 JE SHORT AI6WIN.004245E3
004245CB MOV EDX,DWORD PTR DS:[EDI]
004245CD MOV EAX,DWORD PTR DS:[EDX+4]
004245D0 PUSH 0
004245D2 MOV ECX,EDI =>[EDI+0X10]+[EDI+0XC]
004245D4 CALL EAX =>[ECX+0X10]+[ECX+0XC]
004245D6 MOV ECX,DWORD PTR SS:[ESP+C]
004245DA PUSH EAX
004245DB MOV EAX,DWORD PTR DS:[ECX+3C]
004245DE CALL AI6WIN.004227E0
004245E3 MOV EDX,DWORD PTR DS:[EDI]
004245E5 POP ESI
004245E6 ADD ESP,4
004245E9 MOV DWORD PTR SS:[ESP+4],1
004245F1 MOV ECX,EDI
004245F3 MOV EAX,DWORD PTR DS:[EDX+4]
004245F6 JMP EAX
운이 좋았네요 여기는
[EDI+0X10]+[EDI+0XC] 이후로 EDI를 건드리는곳이 보이질 않네요.
하지만 이건 어디까지나 운이 좋았던 것이구요.
빨간 볼드체로 해놓은 곳, 그리고 몇몇 점프 지점이 계산을 추가/추감 해줘야 할 케이스도 있어요.
하지만 제 인내심이 다했으므로 그냥 앞쪽으로 또 넘어갈께요.
004234CD MOV EDI,DWORD PTR SS:[ESP+40]
004234D1 MOV ESI,EAX
004234D3 CALL AI6WIN.004598A0
004234D8 MOV ESI,DWORD PTR SS:[ESP+38]
004234DC MOV EDI,DWORD PTR SS:[ESP+1C]
004234E0 PUSH ESI
004234E1 MOV DWORD PTR SS:[ESP+9C],EAX
004234E8 CALL AI6WIN.00424570 =>[EDI+0X10]+[EDI+0XC]
위쪽으로 뭐가 존나 더 많았는데
제 목표는 04234E8에서 EDX+EAX가 뭐였는지 알아내는 것이었으므로 여기까지 할께요.
결국 아랄 트랜스를 붙일 곳으로
0x004234E8 에 [EDI+0x10] + [EDI+0xC] 가 된거에요.
5. 마무리
코드를 넣고 안정성 테스트를 해봐요.
전 스킵 눌러놓고 딴걸 하곤 해요.
백로그, 선택지가 안나오면 추가로 코드를 찾아주고
나오는데 문제가 있으면 필터를 양념삼아 마무리를 해주시면 되요.
본 게임의 코드는 백로그가 중복 해석되어서 코필터를 추가 해주었어요.
최종코드:
ENCODEKOR,HOOK(0x004234E8,TRANS([EDI+0x10]+[EDI+0xC],SOW))
KoFilter{}
마이님 굳이내요'ㅁ'/
그나저나... 아랄 디버거에서 안잡히는 대사를 브레이크 잡는법도 있었내요;
그리고 번역율이 더 높다라...[멍]
한번쯤은 해봐야갰내요 ㅎㅎ
가르쳐주새요 마이선샌님~