2011-11-11 3 views
2

다른 응용 프로그램에 대해 "시간에 무관 한"재생을 생성하기 위해 시스템 시간을 검색하려고하는 함수를 후크해야합니다. 의사 난수 생성과 같은 일부 이벤트는 time()에 대한 호출에 의존하지만, 예를 들어 다른 일부에서는 timeGetTime() 또는 _time64()를 호출합니다.언제든지 함수를 검색 할 수 있습니다.

모든 시간 검색 기능을 잡기 위해 (Windows에서) 연결해야하는 최소한의 기능 집합은 무엇입니까? 실제로 이러한 기능을 사용할 수 있습니까? 나는 시간에 그것을하려고 노력하고있다. 그러나 나의 갈고리는 무시 당하고있다. 다른 함수 (예 : rand)에 연결하는 데 성공했지만 시간()은 무시됩니다.

나는 Detours를 사용하고 있지만 다른 API 차단 도구를 사용하고 있습니다.

+0

절반은 왜 그냥 PRNG에 특정 시뮬레이션을 재현 할 때마다 같은 씨앗을 통과하지? –

+0

소스에 액세스 할 수없는 응용 프로그램에서이 작업을 수행하려고합니다. – cloudraven

답변

2

은 다음과 같습니다

시스템 때문에 시간을 반환 시작 또는 비슷한. 당신의 훅에서, 당신은 당신이하고 싶은 것을 결정할 필요가 있습니다. 당신은 할 수 :

  1. 항상
  2. 시간 '둔화'또는 '가속화'에 대한 일반적인 접근을 수행 정적 시간을 반환 :
    • 당신의 DLL을 주입하면, init_time을 말 (초기 시간을)
    • 대상은 시간의 함수를 호출 할 때마다, 당신은 당신이 얻는 실제 함수의 trampolined 버전을 호출 할 수있는 real_time
    • 당신이 시간을 느리게 것 init_time + 0.5*(real_time-init_time) 같은 것 반환 값 예를
0

아마도 시스템 호출 시간에 걸고 싶을 것입니다. 아, 왜 내가 인지 모르겠다. 심지어는을 제안한다. 그러나 kernel32.dll의 GetSystemTime 리버스 엔지니어링은 해당 시스템 호출이 어떻게 이루어 졌는지를 자세히 설명합니다.

0

후크하려는 커널 API의 최소 집합은 NtQuerySystemTimeNtGetTickCount입니다. 후크 할 사용자 영역 API가 너무 많아 응용 프로그램이이 두 기능을 사용하여 시간 데이터에 직접 액세스하는지 여부를 알 수 없기 때문에 커널 후크를 사용하는 것이 좋습니다.

물론 PsGetCurrentProcess()를 호출하고 *(eprocess->UniqueProcessID)을 대상 프로세스 ID와 비교하여 프로세스를 필터링해야합니다. 게임 'speedhacks'보통 걸려있는 3 개 API에 대한

관련 문제