【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志

目录修整

目前的系列目录(后面会根据实际情况变动):

  1. 在windows11上编译python
  2. 将python注入到其他进程并运行
  3. 注入Python并使用ctypes主动调用进程内的函数和读取内存结构体
  4. 调用汇编引擎实战发送文本和图片消息(支持32位和64位微信)
  5. 允许Python加载运行py脚本且支持热加载
  6. 利用汇编和反汇编引擎写一个x86任意地址hook,实战Hook微信日志
  7. 封装Detours为dll,用于Python中x64函数 hook,实战Hook微信日志
  8. 实战32位和64位接收消息和消息防撤回
  9. 实战读取内存链表结构体(好友列表)
  10. 做一个僵尸粉检测工具
  11. 根据bug反馈和建议进行细节上的优化
  12. 其他功能看心情加

上上篇文章说的以后只更新32位版本这句话收回,以后会同时更新32位和64位的最新版本,已经可以在Python中使用Detours来hook 64位版本。

为了加快进度,第六篇和第七篇同一天发布,这篇文章为使用总结,想知道hook原理的可以看同时间发布的其他几篇文章。

温馨提示:本次发布的这几篇文章都是偏技术,想获取成品直接使用的可以等下一篇文章(实战32位和64位接收消息和消息防撤回)

另外,这篇文章开始建群,请关注github或者公众号菜单栏

封装好的Hook库

32位程序的Hook

hook的参数有两个:内存地址和回调函数。回调函数的参数是一个包含x86所有寄存器的结构体指针,没有返回值。结构体的定义如下:

class RegisterContext(Structure):
    _fields_ = [
        ('EFLAGS', DWORD),
        ('EDI', DWORD),
        ('ESI', DWORD),
        ('EBP', DWORD),
        ('ESP', DWORD),
        ('EBX', DWORD),
        ('EDX', DWORD),
        ('ECX', DWORD),
        ('EAX', DWORD),
    ]

一个简单的Hook 示例:

def default_hook_log_callback(pcontext):
    # 获取指针内容,获取的context就是RegisterContext类型了
    context:RegisterContext = pcontext.contents
    # 取eax寄存器的值
    eax = context.EAX
    print("当前eax寄存器的值: ", eax)

addr = 0x100000
hooker = Hook()
hooker.hook(addr, hook_log_callback_enter)

context这个结构体获取的就是当执行到这个地址时的寄存器的值,这个和你用x32dbg看到的寄存器的值是一样的。值的类型都定义成DWORD,如果寄存器是类型是其他类型,比如字符串或结构体,你需要在Python里做相应的转换,可以参考下面Hook日志的代码

你同样可以在回调函数里修改这个指针中寄存器的值,它会反映到实际的寄存器,案例的话会在消息防撤回那一篇文章演示。

64位的Hook

因为64位hook是封装的Detour,比32位需要多定义一个函数指针,而且只能hook函数。所以hook之前需要知道被Hook的函数参数有几个,类型如果不知道的话,可以像上面一样都定义成c_uint64

回调函数的参数跟被Hook函数的参数必须一样,如果参数很多,你也可以用*arg来表示,示例代码如下:

def hook_log_callback(*args):
    print(args)
    print(kwargs)

hooker = Hook()
log_addr = 0x100000
c_log_addr = c_uint64(log_addr)
lp_log_func = CFUNCTYPE(c_uint64, c_uint64, c_uint64, c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64)
hooker.hook(c_log_addr, lp_log_func, hook_log_callback)

另外,回调函数的返回值类型也需要和被Hook函数一样,一般都是先调用原函数获取返回值然后返回。如果返回错误类型的返回值,进程会崩溃。

案例

为什么要选择Hook日志做案例?日志是多线程打印的,如果Hook日志没有问题的话,其他任何位置的Hook基本都不会有问题。

效果

hook后的效果如下:

32位代码

from py_process_hooker import Hook
from py_process_hooker.winapi import *

base = GetModuleHandleW("WeChatWin.dll")

先定义回调函数,因为我需要同时获取参数和返回值,所以要hook两个地方(函数头和函数尾)。

用x32dbg在日志函数头位置下个断点,看起来有两个有用的信息:EDX的代码路径和esp的函数返回地址。

定义回调函数:

def hook_log_callback_enter(pcontext):
    context = pcontext.contents
    esp = context.ESP
    # 计算调用日志函数的地址偏移
    esp_call_offset = c_ulong.from_address(esp).value - base
    # 获取日志中的代码文件路径
    edx = context.EDX
    # 类型是char数组,ctypes定义是(c_char * n), 这个*是Python中的乘号,
    # 如果是char*指针 ctypes则定义为c_char_p
    c_code_file = (c_char * MAX_PATH).from_address(edx)
    code_file = c_code_file.value.decode()
    print(f"调用地址: WeChatWin.dll+{hex(esp_call_offset)}, 代码路径: {code_file}, ", end=" ")

然后看返回值,返回值获取的是EAX的值

def hook_log_callback_leave(pcontext):
    context = pcontext.contents  
    eax = context.EAX
    c_log_info = (c_char * 1000).from_address(eax)
    log_info = c_log_info.value.decode()
    print("日志信息: ", log_info)

在new一个Hook类hook这两个位置:

hooker = Hook()
enter_addr = base + 0x102C250
hook.hook(enter_addr, hook_log_callback_enter)

enter_addr = base + 0x102C584
hook.hook(enter_addr, hook_log_callback_leave)

因为需要支持热加载,所以在hook之前先调用一下unhook,这样你修改代码就会生效新的hook。

使用

你想hook日志的话,先将github的代码拉下来,然后安装依赖,再运行main.py注入Python之后,修改robot.py, 添加如下代码控制台就会打印日志了:

from module import HookLog

h = HookLog()
h.hook() 

github的代码更新了3.9.8.153.9.8.12两个版本,如果有更新的版本,请提issue。

64位代码

from py_process_hooker import Hook
from py_process_hooker.winapi import *

x64dbg打上断点,可以看到RDX是代码路径,而RDX是函数的第二个参数。因为获取不到寄存器,所以返回地址就拿不到了。

返回值如下, 也是char数组:

定义回调函数,日志函数有12个参数,我就用args来代替了:

def hook_log_callback(*args):
    # 读取第二个参数的代码路径
    c_code_file = (c_char * MAX_PATH).from_address(args[1])
    code_file = c_code_file.value.decode()
    # 调用被hook函数,至于为什么要这么调请看编译和讲解Detour那一篇
    ret = lp_log_func(c_log_addr.value)(*args)
    # 读取返回值中的日志信息
    c_log_info = (c_char * 1000).from_address(ret)
    log_info = c_log_info.value.decode()
    print(f"文件路径: {code_file}, 日志信息: {log_info}")
    return ret

开始hook

log_addr = GetModuleHandleW("WeChatWin.dll") + 0x13D6380
# 定义一个保存日志函数地址的指针
c_log_addr = c_uint64(log_addr)
# 定义函数类型
lp_log_func = CFUNCTYPE(c_uint64, c_uint64, c_uint64, c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64,c_uint64)

hooker = Hook()
# 注意c_log_addr的生命周期,不能被垃圾回收机制回收
hook.hook(c_log_addr, lp_log_func, hook_log_callback)
代码更新

以后微信相关的代码统一到下面的仓库更新:

  • github:https://github.com/kanadeblisst00/WeChat-PyRobot
  • 国内仓库: http://www.pygrower.cn:21180/kanadeblisst/WeChat-PyRobot

32位和64位hook的代码封装成库并发布到pypi,可以通过pip install py_process_hooker安装或者pip install --upgrade py_process_hooker更新,具体操作请看仓库说明。

  • github: https://github.com/kanadeblisst00/py_hooker
  • 国内仓库: http://www.pygrower.cn:21180/kanadeblisst/py_hooker

其实微信相关的代码也可以发布到pypi,后面代码稳定下来再看要不要发布。因为目前需要频繁更新,比较麻烦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/271737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是数据可视化?数据可视化的流程与步骤

前言 数据可视化将大大小小的数据集转化为更容易被人脑理解和处理的视觉效果。可视化在我们的日常生活中非常普遍,但它们通常以众所周知的图表和图形的形式出现。正确的数据可视化以有意义和直观的方式为复杂的数据集提供关键的见解。 数据可视化定义 数据可视化…

「仙逆」王林夺舍身份曝光,火焚国火兽危机,两位始祖保护王林

Hello,小伙伴们,我是拾荒君。 《仙逆》第16集超前爆料,本次猛料,王林的天逆珠吞噬了火兽之王,使他的火属性达到了大圆满的境界。在封印屏障的保护下,他成功地逃脱了火兽的追击。然而,如今火兽数量众多&…

【视觉实践】使用Mediapipe进行手势识别

目录 1 Mediapipe 2 Solutions 3 安装依赖库 4 实践 1 Mediapipe Mediapipe是google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning,ML)方案。MediaPipe是一个用于构建机器学习管道的框架,用于处理视频、音频等时间序列数据。与资源消耗型的机…

易天新引进DELL Z9432F-ON交换机设备,网络通信再迎新风采

随着信息技术的飞速发展,网络通信已经成为现代社会中不可或缺的一部分。在这个数字化时代,企业对于高效、可靠的网络设备需求日益增加。为了满足企业日益增长的网络需求和为客户提供更好的服务,易天引进了DELL Z9432F-ON交换机设备&#xff0…

系统管理在工业物联网中的应用——青创智通工业物联网

工业物联网系统是一个复杂的大规模系统,涉及到众多的设备和系统,因此其管理面临诸多挑战。首先,设备和系统的多样性使得互通性成为一个难题,不同厂商的设备和系统之间的兼容性难以保证。其次,工业物联网系统的数据量庞…

Java开发框架和中间件面试题(5)

44.Tomcat一个请求的处理流程? 假设来自客户的请求为: http://localhost:8080/test/index.jsp请求被发送到本机端口8080,被在那里侦听Copote HTTP/1.1 Connector,然后 1.Connector把该请求交给它所在的Service的Engi…

Antd Cascader 组件指定 placement 弹出位置无效

最近在使用 Antd Cascader 组件时&#xff0c;发现指定 placement 弹出位置无效&#xff0c;查看官方文档也没有找到相关的说明&#xff0c;经过一番搜索&#xff0c;终于发现了问题所在。 问题复现 代码示例&#xff1a; <Form.Item name"intention" label&quo…

7_js_dom编程入门1

Objective&#xff08;本课目标&#xff09; 掌握获取页面元素的常用方法 掌握事件触发案例 能够区分innerText和innerHTML的区别 综合案例训练 1 DOM 介绍 1.1 什么是DOM 文档对象模型&#xff08;Document Object Model&#xff0c;简称DOM&#xff09;&#xff0c;是 …

分享3种常用的前端埋点方式

只有了解用户&#xff0c;我们才能服务好用户&#xff0c;而最接近用户的我们&#xff0c;自然要承担起更多的责任。 那么在一个企业中&#xff0c;我们要如何去了解用户呢&#xff1f; 最直接有效的方式就是了解用户的行为&#xff0c;了解用户在网站中做了什么&#xff0c;呆…

工业交换机的冗余电源设计

在市场上&#xff0c;尤其是在工业级交换机上&#xff0c;我们经常能看到一个支持冗余电源的选项。在大多数工业现场中&#xff0c;我们都知道网络的稳定性是非常关键的。而且&#xff0c;像光伏和煤矿这样的行业经常位于偏远地区&#xff0c;环境条件恶劣。因此&#xff0c;在…

WAVE SUMMIT+ 2023倒计时2天,传文心一言将曝最新进展!

传文心一言将曝最新进展&#xff01; 亮点一&#xff1a;趋势引领&#xff0c;“扛把子”文心一言将曝新进展亮点二&#xff1a;干货十足&#xff0c;硬核低门槛开发秘籍大放送亮点三&#xff1a;蓄势待发&#xff0c;大模型赋能产业正当时亮点四&#xff1a;群星闪耀&#xff…

FPFA.一种二倍频电路代码描述以及测量详情

一、前言 1、因为需要倍频电路所以找了个二倍频的电路&#xff0c;通过fpga实际测量发现经过倍频后的电路峰值降低。不过这个也正常&#xff0c;因为该电路只要过触发点就会开始发生波形变化&#xff0c;而电路的触发值不是峰值。​​​​​​​ 2、继续对电路做倍频后信号做二…

西南科技大学计算机网络实验三 (路由器基本配置与操作,RIP、OSPF路由协议配置)

一、实验目的 基于网络设备模拟软件,学习和使用路由器的各种基本配置与验证命令,学习和使用路由器的静态路由、RIP、OSPF路由协议配置。 二、实验环境 使用RouterSim Network Visualizer软件来模拟网络设备与网络环境;主机操作系统为windows。 三、实验内容 1、路由器名称…

[足式机器人]Part4 南科大高等机器人控制课 CH11 Bascis of Optimization

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 课程链接 &#xff1a; https://www.wzhanglab.site/teaching/mee-5114-advanced-control-for-robotics/ 南科大高等机器人控制课 Ch11 Bascis o…

android jetpack组件一篇搞定

Jetpack 是 Android 官方推出的一套开发库&#xff0c;其中包含众多的组件&#xff0c;可以让 Android 开发者更快更高效地开发应用程序。Jetpack 组件分为四大部分&#xff1a;架构、行为、UI 和基础组件。 下面详细阐述如何合理使用 Jetpack 组件开发 Android 项目。 1. 熟练…

时尚机密防线升级:迅软DSE助力时装企业应对终端泄密挑战

客户简要介绍 某高级时装是国际知名的奢侈品牌控股及管理运营公司。公司依靠丰富的奢侈品市场运作经验、成熟的品牌管理架构&#xff0c;以及对艺术文化的热爱与尊重&#xff0c;发掘低调且优秀的意大利品牌&#xff0c;将其推向市场取得成功。公司在全球范围内践行多品牌发展…

Mesh网格撞击变形

物理碰撞 两个游戏物体发生碰撞的必要条件&#xff1a; 发生碰撞的两个游戏物体有Collider&#xff08;碰撞器&#xff09;组件&#xff1b;其中一个物体有Rigidbody&#xff08;刚体&#xff09;组件。 MonoBehaviour中的相关回调函数&#xff1a; 回调函数详解OnCollisio…

支持多医院使用的云HIS医院信息化管理系统源码 SaaS模式

一、什么是HIS系统 HIS系统&#xff08;Hospital InformationSystem&#xff09;是医院信息化建设的核心组成部分&#xff0c;它是为了管理和运营医院而设计和开发的一套综合性的信息系统。HIS系统通过整合医院各个部门和业务流程的数据和信息&#xff0c;实现了医院内部的信息…

GNN 图神经网络

GCN 邻接矩阵A&#xff1a;adjacency matrix用来表示节点间的连接关系。 度矩阵D&#xff1a;degree matrix用来表示节点的连接数 特征矩阵X&#xff1a;feature matrix用来表示节点的特征

鸿蒙4升级进展:共137款产品加入升级,Mate 20也能升级了

从华为官方发布的鸿蒙升级进展来看&#xff0c;2018年发布的Mate 20系列机型也开始了鸿蒙4系统升级的测试招募。 5年之期已到&#xff0c;再战5年不是梦想&#xff1f; 另外&#xff0c;从明年一季度的升级预告来看&#xff0c;春节前后升级的主要为穿戴手表产品。 目前&…