5

我想看看我是否能够通过在干净状态下在我的系统上运行“基准”、安装键盘记录器并重复基准测试来检测系统上是否存在键盘记录器。这个想法是键盘记录器需要消耗资源才能正确运行,并且应该导致较低的基准分数。

在代码中,我基本上编写了两个 while 循环,它们使用 win32API 调用 SendMessage() 和 PostMessage() 来模拟击键。它在给定的时间内执行循环并记录它发送了多少成功消息。

我期望键盘记录器要么没有可衡量的差异(毕竟,桌面上一直在执行很多“东西”,而且我认为键盘记录器可能不会使用很多......)或者它会导致数字略低。

这主要是我在“ SendMessage() ”调用的情况下看到的。

我不明白的是,我的基准测试显示对PostMessage()的调用次数急剧增加

在安装键盘记录器之前,平均执行多次,我看到每秒大约 10k PostMessage()。安装键盘记录器后,我现在看到每秒有近 25k 次 PostMessage() 调用。

这对我来说没有任何意义。

如果我对 PostMessage 的理解是正确的,它会在进程的消息队列中添加一条 windows 消息并恢复执行(而 SendMessage 会等到进程处理完消息后再返回)。我希望 PostMessage 的执行速度比 SendMessage 快,并且一旦消息队列已满,一些消息可能会丢失....但在我有限的理解中,没有任何东西可以帮助我理解键盘记录器如何提高性能 - 如此显着.

我觉得代码很简单。我可以确认它确实注册为击键(我将它们发送到记事本中)并且它们的键盘记录器正在记录它们。

有人可以向我解释我错过了什么吗?

键盘记录器如何提高性能?!

更新 我正在运行基准测试 10 次并对结果进行平均。
暂停键盘记录器(以便它仍然安装,但不记录)仍然产生了很高的结果。卸载键盘记录器并重新启动我的机器后,10 次运行的平均值现在是每秒 9.9k;非常符合我原来的结果。

我确实必须重新启动机器才能完成卸载。

4

1 回答 1

8

限制 PostMessage() 调用的因素并不多。在内部,它必须获得一个锁才能访问线程的消息队列,以便以安全的方式附加消息。这里的异常值是没有记录器这样做太慢了,每秒 10K 调用并不多。只要应用程序正在清空队列,Windows 内部很可能有一个节流阀会在短时间内阻止调用。不知道这是不是真的。

这在很大程度上取决于键盘记录器到底使用了什么钩子,有不止一个候选者。但是没有钩子可以检测到一条消息被添加到队列中,只有当从队列中检索到一条消息并将其分派到窗口时。像 WH_GETMESSAGE、WH_CALLWNDPROC 或 WH_CALLWNDPROCRET。所以接下来是记录器会使清空队列变慢。

这为您所看到的内容提供了解释,如果您在没有限制的情况下调用 PostMessage(),那么您将溢出消息队列。默认情况下,它只能包含 10,000 条消息。如果你溢出它,你会得到一个快速的回报,你会衡量一个更高的利率。

所以我猜你忘了看 PostMessage() 的返回值。无法添加消息时返回 FALSE。

于 2012-11-28T15:44:38.183 回答