【问题标题】:Keyboard hooking [closed]键盘挂钩[关闭]
【发布时间】:2015-09-22 03:52:26
【问题描述】:

我正在尝试编写 c 程序,该程序可以统计分析某些键盘键的使用情况。 首先,我想使用全局挂钩创建一个键盘记录器并将其记录到文件中。

这是我写的代码的第一部分:

#include <stdio.h>
#include <Windows.h>

HHOOK hook;

LRESULT CALLBACK hook_proc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (wParam == WM_KEYDOWN)
    {
        KBDLLHOOKSTRUCT kbdstruct = *((KBDLLHOOKSTRUCT*)lParam);
        char ch = kbdstruct.vkCode;
        printf("%c", ch);

    }

    return CallNextHookEx(hook, nCode, wParam, lParam);
}


void main()
{
    MSG msg;
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, HOOKPROC(hook_proc), NULL, 0);
    while (GetMessage(&msg, NULL, 0, 0))
    {

    }
}
  1. 为什么我必须创建无限循环?没有它就不行。
  2. 我读到对于全局挂钩,SetWindowHookEx 中的第二个参数应该指向外部 DLL 中的挂钩过程。它工作正常,为什么只打印虚拟代码。如何将其转换为“常规键”而无需为每个虚拟键切换案例?有没有有效的方法?
  3. 如果需要外部 dll,应该如何根据我编写的代码从 main 编写和调用它?

【问题讨论】:

  • C 中没有键盘。
  • 这个问题好像是三个问题。因此,我认为它“太宽泛了”。
  • 1:操作系统必须闯入您的程序才能进行 hook_proc() 调用。只有当您的主线程可以安全地中断以进行调用时,它才会这样做。 GetMessage() 是producer-consumer problem 的通用解决方案。 2:WH_KEYBOARD_LL 比较特殊,不需要DLL。
  • 我之前也遇到过第二个问题(在编写我自己的间谍程序时),到目前为止我发现的最优雅的解决方案是......实现你自己的键盘驱动程序并以某种方式把它进入您客户的系统(或受害者的系统:D)。如果你懂俄语,我可以给你一些俄语教程的链接。
  • while(&lt;expression that can evaluate to false&gt;) 有什么无限可能?

标签: c windows winapi dll keyboard-hook


【解决方案1】:
  1. 您需要一个消息循环来处理键盘活动。这在documentation 中有明确说明:

这个钩子在安装它的线程的上下文中被调用。通过向安装钩子的线程发送消息来进行调用。因此,安装钩子的线程必须有消息循环

  1. 大多数全局挂钩在每个运行进程的上下文中运行,因此挂钩必须位于 DLL 中,以便可以将其注入其他进程。但不是WH_KEYBOARD_LL(见上文)。至于密钥本身,KBDLLHOOKSTRUCT 仅提供虚拟密钥扫描码。要将它们转换为字符,请使用MapVirtualKey()MapVirtualKeyEx()ToUnicode()ToUnicodeEx()

  2. WH_KEYBOARD_LL 不需要 DLL。见上文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2023-03-13
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多