是否可以Hook到任何时间检索函数

发布于 2024-12-14 18:44:57 字数 282 浏览 4 评论 0原文

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

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

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

I need to hook any function that tries to retrieve the system time in order to generate "time independent" replays for different applications. Some events like pseudorandom number generation depend on calls to time(), but for example some others call timeGetTime() or _time64().

What is the minimum set of functions that I would need to hook (in Windows) to catch all time retrieving functions. Is it actually possible to hook on these functions? I am trying to do it on time(), but my hook is being ignored. I have had success hooking to other functions (like rand) but my time() hook seems to be ignored.

I am using Detours, but I am open to use any other API interception tool.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冰雪之触 2024-12-21 18:44:59

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

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

  1. 始终返回静态时间
  2. 采用“放慢”或“加快”时间的常见方法:
    • 注入 DLL 时,获取初始时间(例如 init_time
    • 每次目标调用您的时间函数时,您都可以调用真实函数的蹦床版本,从而获得real_time
    • 您返回的值类似于 init_time + 0.5*(real_time-init_time),例如,这会使时间减半

For game 'speedhacks', the 3 APIs which are usually hooked are:

Most of these functions return a time since the system started or something similar. In your hook, you need to decide what you want to do. You could:

  1. Always return a static time
  2. Do the common approach for 'slowing down' or 'speeding up' time:
    • When your DLL is injected, take an initial time (say init_time)
    • Each time the target calls your time function, you can call a trampolined version of the real function which gets you a real_time
    • The value you return would be something like init_time + 0.5*(real_time-init_time) which would slow time down by half for example
红尘作伴 2024-12-21 18:44:59

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

You probably want to hook the time system call. Ugh, I don't know why I'm even suggesting that. But reverse engineering GetSystemTime in kernel32.dll would detail how that system call is made.

鹤舞 2024-12-21 18:44:59

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

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

The minimum set of (preferably) kernel APIs that you want to hook are NtQuerySystemTime and NtGetTickCount. Kernel hooks are recommended since there's too many user-land apis to hook and you never know whether the application is directly accessing the time data using those two functions.

Of course you should filter out the process by calling PsGetCurrentProcess() and comparing the *(eprocess->UniqueProcessID) with your target process id.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文