본문 바로가기

My Study/Reversing

피카츄배구 스피드업 ( Vista, Win 7 호환 )

음... API Hooking을 실습해보려고 이것저것 찾다가 피카츄배구를 해보자! 라는 생각이었지만..뭐 어떻게 후킹을 해야될지..
제가 아는 후킹 방법은 함수 들어가기전에 후킹 함수를 설치해서 인자를 바꾸는 방법인데요.. 적용이 힘들어..
그냥 피카츄 배구를 어떻게 빠르게 할 수 있을지!! 그걸 알아보았습니다.
혹시나..궁금하신 분들만 보세요;; API Hooking은 다른 걸로 실습해 봐야겠네요.
=======================================
피카츄배구 때문에 사람들이 많이 들어오시길래 적어봅니다.
그냥 게임을 즐기고 싶으신 분들은 젤 아래로 내리시면 속도 패치된 피카츄 배구 있습니다.
바로 다운 받으셔서 하시면 됩니다. 감사합니다.
=======================================
피카츄배구에서 속도를 조절하기 위해서는 설정 - 속도 - 선택을 하게됩니다.

그러면 생각해 볼 수 있는게 메뉴를 불러오게됩니다. 그러면 함수로 생각해 볼 수 있는게 GetMenu 라는 API함수입니다.
한번 해당 함수에 브포를 걸고 속도를 바꿔보겠습니다.

해당 함수에서 멈췄습니다. GetMenu함수를 호출한 함수를 보면.. 뭔가 짧습니다. 보니까 단순히 체크된 부분만 재설정 해주고 끝나버립니다. 그러면 분명히 이것을 클릭했을 때 어떠한 값이 설정이 되고 있어야 할탠데.. 일단은 해당 함수를 빠져나가서 보도록 하겠습니다.

switch case문으로 이루어져 있었고 함수를 호출하기전에 [ESI+50]에 0x32이라는 값을 넣고 있었습니다.
저 값이 수상해 속도를 낮음,중간,높음 으로 했을 때 각각의 루틴을 봐보았습니다.
방금 위에 값이 낮음을 선택했을 때 들어온 루틴이므로 중간,높음 루틴만 보도록 하겠습니다.

역시나 똑같은 장소에 값을 넣고 있었습니다. 그냥 저것을 하나의 변수로 봤을 때 C언어로 봐보면

if ( 낮음 )
  Speed = 0x32;
else if ( 중간 )
  Speed = 0x28;
else if ( 높음 )
  Speed = 0x21;

위와 같이 되겠습니다.
그러면 저 값을 어디에선가 사용을 하고 있겠죠. 하드웨어 브포( 엑세스 )를 걸고 추적을 해보았습니다.

해당 값을 EAX와 비교하고 있는 곳을 찾을 수 있습니다.
EAX에는 어떠한 값을 들어있는지 봐보았습니다. 
timeGetTime 함수의 리턴 값에서 [ESI+54]를 뺀 값과 비교를 하고 있네요.
( timeGetTime함수는 현재 시간을 밀리초 단위로 얻어오는 함수 입니다. )
분석을 해보시면 아시겠지만 [ESI+54]에는 0x40147D에서 실행되는 timeGetTime함수의 리턴 값이 들어있지요.
루프를 돌려본 결과입니다.

해당 점프문을 점프하게 되면 게임이 초고속으로 진행되게 됩니다.
반면 점프를 하지 않으면 게임이 정지가 됩니다.

뭐 결론이 났습니다. 피카츄배구가 속도를 조절하는 방법입니다.

sTime = timeGetTime();
while( 조건 )
{
     fTime = timeGetTime();
     if ( Speed <= (fTime - sTime) )
     {
           sTime = timeGetTime();
           게임 진행...
     }
     else 
     {
           fTime = timeGetTime();
           게임 멈춤...
     }
}

소스코드는 대충 이렇게 되구요.
설명을 간추려서 해보면 그냥 두 시간차이가 [ESI+50]에 든 값보다 작으면 멈춥니다.
그러면 [ESI+50]에 든 값이 작으면 작을수록 멈추는 횟수도 줄어드므로 속도는 점점 빨라지게 될것입니다.
아마 해당 값을 수정시키면 빠른 게임을 즐길 수 있겠지요.

파일을 수정시켜 게임을 진행해보도록 하겠습니다.
아래는 영상입니다. 

스업 피카츄 파일 다운 ( 윈 XP만 되는 것 )
스업 피카츄 파일 다운 ( 윈 Vista, 윈 7 호환용 )