Может кто-нибудь объяснить мне, что происходит в этих условиях?

Я пытался создать кейлоггер, используя структуры данных, и я увидел этот кусок кода на веб-сайте.

Я не понимаю, является ли «символ» значением ASCII или как?
Плюс, почему мы увеличиваем значение символа на 32 в последнем условии.

for (character = 8;character <= 222;character++)
{
if (GetAsyncKeyState(character) == -32767)
{
FILE *file;
file = fopen(FileName, "a+");
if (file != NULL)
{
if ((character >= 39) && (character <= 64))
{
fputc(character, file);
fclose(file);
break;
}
else if ((character>64) && (character<91))
{
character += 32;
fputc(character, file);
fclose(file);
break;
}
/* ... */
}
}
}

-4

Решение

После документация за GetAsyncKeyStateтип для character является int:

SHORT WINAPI GetAsyncKeyState(
_In_ int vKey
)

Вы заметите, что возвращаемое значение GetAsyncKeyState это short, что, очевидно, является 16-разрядным целочисленным значением со знаком.

Для возвращаемого значения

Если установлен самый старший бит, клавиша нажата.

Значение отрицательного бита на SHORT будет установлено, или значение -32767 будет возвращено, если ключ не работает (следовательно, если ветвь if введена, если это возвращаемое значение; код хочет записать нажатие клавиши).

Код для регистрации очень понятен IMO, но вам интересно, почему приращение на 32 Вот:

// ...
else if ((character>64) && (character<91))
{
character += 32;
// ...

character хотя это intна самом деле виртуальный ключ-код. Коды виртуальных ключей увеличиваются до 0xFE (254)

Когда вы смотрите на таблицу кодов виртуальных клавиш, значения больше 64 и меньше 91 являются буквами английского алфавита. Увеличение на 32 сделает их строчными буквами (65 'A', но 97 это 'a') в ASCII. То есть код использует тот факт, что «А» в кодах виртуальных клавиш совпадает с заглавной 'A' символ в ASCII, а затем выполнить преобразование в нижний регистр для ASCII перед печатью в файл.

РЕДАКТИРОВАТЬ

Похоже, что существуют некоторые споры относительно обоснования цикла:
for (character = 8;character <= 222;character++)

Значение 8 в коде виртуальной клавиши соответствует клавише Backspace, или действительно началу печатных символов, потому что первые 7 (начиная с 1, на самом деле) являются кнопками. Это не значит, что ВСЕ символы в диапазоне от 8 до 222 пригодны для печати.

Значение 222 (0xDE) соответствует VK_OEM_7:

Для стандартной клавиатуры США клавиша «одинарные кавычки / двойные кавычки».

Другими словами, в значительной степени последний печатный символ клавиатуры на английских клавиатурах для виртуальных кодов клавиш. Очевидно, что регистратор предназначен для англоязычных пользователей Windows. Фактический код, вероятно, многократно запускает цикл, спрашивая, какой ключ не работает, и затем регистрирует его.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]