Возможно ли подключиться к любой функции извлечения времени

#c #windows #time #hook #detours

#c #Windows #время #подключение #обходные пути

Вопрос:

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

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

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

Комментарии:

1. Почему бы вам просто не передавать одно и то же начальное значение в PRNG каждый раз, когда вы хотите воспроизвести определенную симуляцию?

2. Я пытаюсь сделать это в приложениях, где у меня нет доступа к источнику

Ответ №1:

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

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

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

Ответ №2:

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

Ответ №3:

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

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