【问题标题】:How Could A Keylogger Dramatically Improves Performance Of PostMessage()键盘记录器如何显着提高 PostMessage() 的性能
【发布时间】:2012-11-16 07:46:29
【问题描述】:

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

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

我希望键盘记录器不会产生明显的差异(毕竟,桌面上一直在执行很多“东西”,而且我认为键盘记录器可能不会使用很多......)或这会导致数字略低。

这就是我在“SendMessage()”调用中看到的大部分内容。

我不明白的是,我的基准测试显示调用 PostMessage()

的次数急剧增加

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

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

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

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

有人可以向我解释我缺少什么吗?

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

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

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

【问题讨论】:

  • 最好打电话给SendInput
  • 有趣的问题。暂停/卸载键盘记录器后性能会再次下降吗?这是为了确保性能差异实际上是由键盘记录器引起的,而不是在您重新执行基准测试时进行的其他优化(例如 Windows 或 .NET 运行时负责的优化)。
  • @erikkallen - 谢谢 - 我会调查 SendInput 看看是否有助于解决问题。
  • 您还可以检查 GetLastError 是否返回某些内容,因此您的代码没有走完整的路径。
  • 我们需要您的代码源和键盘记录器的源来理解和解释发生了什么。

标签: c# .net winforms winapi


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多