스피드핵은 기본적으로 타이머와 관련된 함수를 후킹해서 사용합니다.
GetTickCount(), timeGetTime(), QueryPerformanceCounter()

만일 윈도우에서 제공해주는 타이머 함수를 직접 구현한다면???

자료를 뒤져보니 Assemply 로 CPU 시간을 알아내는 코드가 있더군요.
출처 : http://abipictures.tistory.com/353

unsigned __int64 ddwCount;

_asm
{
RDTSC
mov DWORD PTR ddwCount, eax
mov DWORD PTR ddwCount+ 4, edx
}

RDTSC(Ream Time Stamp Counter) 은 8x86 CPU에서 CPU의 클럭값을 eax와 edx에 return하는 어셈입니다.


그런데 실제 돌려보니 CPU 클럭값이 초당 몇번 동작하는지 모르니 적용할려면 좀 노력을 해야할것같네요.

 int _tmain(int argc, _TCHAR* argv[])
{
 struct {
  DWORD dwTime1;
  DWORD dwTime2;
 } asmTimer, tmpTimer;

 for(int i=0; i<20; i++)
 {
  __asm
  {
   RDTSC
   mov DWORD PTR asmTimer, eax
   mov DWORD PTR asmTimer+4, edx
  }

  if (i>0)
  {
   printf("[%u]\t%lu\t[%lu]\t%lu\t[%lu]\n",
    i,
    asmTimer.dwTime1,
    asmTimer.dwTime1 - tmpTimer.dwTime1,
    asmTimer.dwTime2,
    asmTimer.dwTime2 - tmpTimer.dwTime2);
  }

  memcpy(&tmpTimer, &asmTimer, sizeof(asmTimer));

  Sleep(500);
 }
 
 return 0;
}

 [1]     4231356696      [139997214]     169     [0]
[2]     41459963        [105070563]     170     [1]
[3]     90353894        [48893931]      170     [0]
[4]     237211070       [146857176]     170     [0]
[5]     288734747       [51523677]      170     [0]
[6]     361892201       [73157454]      170     [0]
[7]     543081920       [181189719]     170     [0]
[8]     613704488       [70622568]      170     [0]
[9]     675258215       [61553727]      170     [0]
[10]    869067653       [193809438]     170     [0]
[11]    923720396       [54652743]      170     [0]
[12]    987591011       [63870615]      170     [0]
[13]    1064402699      [76811688]      170     [0]
[14]    1121647946      [57245247]      170     [0]
[15]    1170933692      [49285746]      170     [0]
[16]    1233143213      [62209521]      170     [0]
[17]    1304132819      [70989606]      170     [0]
[18]    1383210554      [79077735]      170     [0]
[19]    1434673859      [51463305]      170     [0]




 

+ Recent posts