【问题标题】:c++ KeyLogger not logging first shift key or control key pressc ++ KeyLogger不记录第一个shift键或控制键按下
【发布时间】:2012-07-29 22:11:29
【问题描述】:

我正在编写一个键盘记录器,但不是出于恶意目的。它实际上是创建一个文件,然后由 xsplit 广播程序插件读取“轮询”,当我广播我的屏幕时,它会在屏幕上显示我的按键。

它工作正常,但问题是 shift 和 control 键没有出现。

这是因为最初按下这些按钮时并没有调用保存函数,因为它等待查看我是否只需要大写字母或类似字母。

我真的很想在按下按钮时立即调用保存功能,但不知道该怎么做。

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

using namespace std;

/*
 * a program to log keys to file
 */

int Save (int key_stroke, char *file);


int main(int argc, char** argv) {

    char i;
    while (1) 
    {
    for (i =8; i <= 190; i++)
    {
        if (GetAsyncKeyState(i) == -32767)
            Save (i, "LOG.TXT");
    }
    }

    return 0;
}

/********************************************************************************/
/********************************************************************************/

int Save (int key_stroke, char *file)
{
    FILE *OUTPUT_FILE;
    OUTPUT_FILE = fopen(file, "w");
    fprintf(OUTPUT_FILE, "%s", "<xsplit>");

    cout << key_stroke << endl;
    if (key_stroke == 8)
        fprintf(OUTPUT_FILE, "%s", "[Backspace]");
    else if (key_stroke == 13)
        fprintf(OUTPUT_FILE, "%s", "[Return]");
    else if (key_stroke == 32)
        fprintf(OUTPUT_FILE, "%s", "[Space]");
    else if (key_stroke == VK_SHIFT)
        fprintf(OUTPUT_FILE, "%s", "[Shift]"); 
    else if (key_stroke == VK_ESCAPE)
        fprintf(OUTPUT_FILE, "%s", "[Escape]");
    else if (key_stroke == VK_CONTROL)
        fprintf(OUTPUT_FILE, "%s", "[Control]");
    else if (key_stroke == VK_END)
        fprintf(OUTPUT_FILE, "%s", "[END]");
    else if (key_stroke == VK_HOME)
        fprintf(OUTPUT_FILE, "%s", "[HOME]");
    else if (key_stroke == 1)
        fprintf(OUTPUT_FILE, "%s", "[LMOUSE]");
    else if (key_stroke == 2)
        fprintf(OUTPUT_FILE, "%s", "[RMOUSE]");    


    else
   fprintf(OUTPUT_FILE, "%s", &key_stroke);   

   fprintf(OUTPUT_FILE, "%s", "</xsplit>");

fclose(OUTPUT_FILE);
return 0;
}

/********************************************************************************/
/********************************************************************************/

创建的文件会不断被重写并替换为新的按键,如果您想对其进行最好的测试,只需将 fopen() 函数上的“w”替换为“a+”即可。

【问题讨论】:

  • 如果您将以下行编辑if (GetAsyncKeyState(i) == -32767)if ((GetAsyncKeyState(i) == -32767) || (GetAsyncKeyState(VK_SHIFT))),它对您有用吗?您可以在 MSDN 上找到 VirtualKey-odes:msdn.microsoft.com/en-us/library/dd375731(VS.85).aspx
  • 不,上述方法不起作用,GetAsyncKeyState 正在检查处理按键的窗口(我认为这就是 -32767 的意思)它在按键时没有返回 true。

标签: c++ broadcast keylogger


【解决方案1】:

变化:

for (i =8; i <= 190; i++) 

到:

for (i =0; i <= 255; i++)    

【讨论】:

    【解决方案2】:

    我将为此使用事件循环,并处理 WM_KEYDOWNWM_KEYUP 消息。这也将避免使用main() 中的繁忙循环将您的一个核心推至 100%。

    【讨论】:

    【解决方案3】:

    希望我的这篇文章对你有帮助 http://www.codeproject.com/Articles/635134/Target-Eye-Revealed-part-4-Keyboard-Capturing

    问候,

    迈克尔·哈弗拉蒂

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多