Я пытался создать кейлоггер, используя структуры данных, и я увидел этот кусок кода на веб-сайте.
Я не понимаю, является ли «символ» значением 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;
}
/* ... */
}
}
}
После документация за 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. Фактический код, вероятно, многократно запускает цикл, спрашивая, какой ключ не работает, и затем регистрирует его.
Других решений пока нет …