是否有可能随时检索功能

时间:2011-11-11 05:28:55

标签: c windows time hook detours

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

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

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

3 个答案:

答案 0 :(得分:2)

对于游戏'speedhacks',通常挂钩的3个API是:

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

  1. 始终返回静态时间
  2. 采用“减速”或“加速”时间的常用方法:
    • 注入DLL后,请花一个初始时间(比如init_time
    • 每次目标调用您的时间函数时,您都可以调用真实函数的蹦床版本,它会为您提供real_time
    • 您返回的值将类似于init_time + 0.5*(real_time-init_time),例如
    • 会减慢一半的时间

答案 1 :(得分:0)

您可能想要挂钩时间系统调用。呃,我不知道为什么我甚至暗示这一点。但是kernel32.dll中的逆向工程GetSystemTime将详细说明如何进行系统调用。

答案 2 :(得分:0)

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

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