2

我需要挂钩任何试图检索系统时间的函数,以便为不同的应用程序生成“时间无关”的回放。某些事件(如伪随机数生成)依赖于对 time() 的调用,但例如其他一些事件则调用 timeGetTime() 或 _time64()。

我需要挂钩(在 Windows 中)以捕获所有时间检索函数的最小函数集是什么。真的可以挂钩这些功能吗?我正在尝试按时完成(),但我的钩子被忽略了。我已经成功连接到其他函数(如 rand),但我的 time() 钩子似乎被忽略了。

我正在使用 Detours,但我愿意使用任何其他 API 拦截工具。

4

3 回答 3

2

对于游戏“speedhacks”,通常被钩住的 3 个 API 是:

这些函数中的大多数返回系统启动后的时间或类似的时间。在你的钩子里,你需要决定你想做什么。你可以:

  1. 始终返回静态时间
  2. 采用“减慢”或“加快”时间的常用方法:
    • 当你的 DLL 被注入时,需要一个初始时间(比如init_time
    • 每次目标调用您的时间函数时,您都可以调用真实函数的蹦床版本,从而获得real_time
    • 您返回的值将类似于例如init_time + 0.5*(real_time-init_time)将时间减慢一半
于 2011-11-11T11:17:21.273 回答
0

您可能想要挂钩时间系统调用。呃,我不知道为什么我至建议这样做。但是 kernel32.dll 中的逆向工程GetSystemTime会详细说明该系统调用是如何进行的。

于 2011-11-11T05:34:12.070 回答
0

您想要挂钩的(最好)内核 API 的最小集合是NtQuerySystemTimeNtGetTickCount. 建议使用内核挂钩,因为要挂钩的用户级 API 太多,而且您永远不知道应用程序是否正在使用这两个函数直接访问时间数据。

当然,您应该通过调用 PsGetCurrentProcess() 并将*(eprocess->UniqueProcessID)与您的目标进程 ID 进行比较来过滤掉该进程。

于 2011-11-11T05:42:39.777 回答