Можно ли подключиться к любой функции поиска времени? - PullRequest
2 голосов
/ 11 ноября 2011

Мне нужно перехватить любую функцию, которая пытается извлечь системное время, чтобы генерировать «независимые от времени» повторы для разных приложений. Некоторые события, такие как генерация псевдослучайных чисел, зависят от вызовов time (), но некоторые другие вызывают timeGetTime () или _time64 ().

Каков минимальный набор функций, которые мне нужно было бы подключить (в Windows), чтобы перехватывать все функции при получении. Можно ли подключить эти функции? Я пытаюсь сделать это вовремя (), но мой хук игнорируется. Я успешно подключился к другим функциям (например, к rand), но мой хук time (), похоже, игнорируется.

Я использую Detours, но я открыт для использования любого другого инструмента перехвата API.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2011

Для «скоростных хаков» игры обычно используются 3 API:

Большинство этих функций возвращают время с момента запуска системы или что-то подобное.В вашем крючке, вам нужно решить, что вы хотите сделать.Вы могли бы:

  1. Всегда возвращать статическое время
  2. Использовать общий подход для «замедления» или «ускорения» времени:
    • Когда ваша DLL вводится, начальное время (скажем, init_time)
    • Каждый раз, когда цель вызывает вашу функцию времени, вы можете вызвать трамплинную версию реальной функции, которая дает вам real_time
    • .возвращаемое значение будет примерно таким, как init_time + 0.5*(real_time-init_time), что приведет к замедлению времени вдвое, например
0 голосов
/ 11 ноября 2011

Минимальный набор (желательно) API-интерфейсов ядра, которые вы хотите подключить, это NtQuerySystemTime и NtGetTickCount.Рекомендуется использовать перехватчики ядра, поскольку существует слишком много пользовательских API-адресов для захвата, и вы никогда не знаете, получает ли приложение непосредственный доступ к данным времени, используя эти две функции.

Конечно, вы должны отфильтровать процесс, вызвав PsGetCurrentProcess () и сравнение *(eprocess->UniqueProcessID) с идентификатором целевого процесса.

0 голосов
/ 11 ноября 2011

Возможно, вы хотите перехватить системный вызов времени. Тьфу, я не знаю, почему я даже предлагаю это. Но обратный инжиниринг GetSystemTime в kernel32.dll подробно расскажет, как выполняется этот системный вызов.

...