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

这篇具有很好参考价值的文章主要介绍了【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后的效果如下:

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

32位代码

from py_process_hooker import Hook
from py_process_hooker.winapi import *

base = GetModuleHandleW("WeChatWin.dll")

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

用x32dbg在日志函数头位置下个断点,看起来有两个有用的信息:EDX的代码路径和esp的函数返回地址。
【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志

定义回调函数:

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的值
【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志

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是函数的第二个参数。因为获取不到寄存器,所以返回地址就拿不到了。

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

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

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

定义回调函数,日志函数有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,后面代码稳定下来再看要不要发布。因为目前需要频繁更新,比较麻烦。文章来源地址https://www.toymoban.com/news/detail-760440.html

到了这里,关于【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python基于PC版微信实现机器人

    在 github 中有基于 web 版的微信实现的实时收发消息 api , python 调用起来非常简单。但是目前来说,大部分的用户没法登录 web 版的微信,因此也就没法使用。 今天我们介绍基于 windows 版的微信,实现实时收发信息。本文站在巨人的肩膀上,基于第三方提供的库,实现自动聊

    2023年04月17日
    浏览(27)
  • 智能寻迹避障清障机器人设计(第六章)

    本课题拥有蓝牙遥控以及红外遥控二种模式,红外遥控没有测距显示以及调节速度,其他的控制模式和蓝牙遥控一样。因而,本测试以蓝牙遥控为主。 蓝牙遥控器初始页面如图6.61所示,使用蓝牙遥控器之前用先点击连接蓝牙按钮,点击之后便会进入蓝牙选择页面如图6.1.2所示

    2024年01月17日
    浏览(26)
  • 运用python实现企业微信群机器人消息推送

    使用场景 :将BI报表精准推送入(群),精准触达用户 目的 :提高管理层对数据的感知度 工具:python+企业微信 步骤: 1、创建企业微信群机器人,提取Webhook地址(群机器人地址) 2、编写代码填充推送内容信息实现推送 3、其他需求自定义代码编写 实现方法1–优化后 实现

    2024年02月16日
    浏览(26)
  • python连接自己的机器人接口在微信聊天

    机器人有连接到数据库,所以可以长记忆对话,多线程可以使得机器人同时和几个好友聊天。将消息发送到远程API进行处理,并回复处理后的消息。脚本还允许为每个好友分配一个唯一的随机 ID,以便跟不同的好友聊天并维护聊天记忆。

    2024年02月09日
    浏览(26)
  • 【Python微信机器人】第一篇:在windows11上编译python

    我打算写一个系列,内容是将python注入到其他进程实现inline hook和主动调用。本篇文章是这个系列的第一篇,后面用到的案例是 注入python到PC微信实现基本的收发消息 。文章着重于python方面的内容,所以对于微信找收发消息的call不会去讲过程,有兴趣的可以直接百度搜 PC微信

    2024年02月08日
    浏览(33)
  • Python实现企业微信群机器人自动化推送

    人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 ——《百度百科》 实际工作中,有类似这样的场景, 需要将某些通知信息定期发送到企业微信群,需要将公司某些指标的异

    2024年02月09日
    浏览(47)
  • python上的免费免登录微信智能聊天机器人

    目录  一、准备  二、开始 三、全部代码 四、总结  一、准备 需要bs4库、requests库、time库(python自带)、wxauto库。 如果没有的话请用pip安装。 在本示例中,使用的是wxauto,所以只能识别桌面上显示的微信窗口,一旦微信窗口最小化,便无法使用。解决办法:可以在GitHub上

    2023年04月08日
    浏览(31)
  • 17行代码用python对接openai的微信对话机器人

    itchat python依赖下载 这里推荐这个。链接:衡天云

    2024年02月13日
    浏览(31)
  • wechaty撸一个属于自己的微信机器人(Python版接入文心一言)

    说明: 机器人的框架找了很久,由于很多框架都不能使用了或者封号率极高,最后选择了wewechaty,wechaty是可以使用ipad协议,主要是以node写的,因为打算机器人接入爬虫项目,所以特意用了python版本,对于python版网上教程太少且模糊且时间过于久远,所做以此文为采坑记录。 前期准备

    2024年02月04日
    浏览(32)
  • 【Python微信机器人】第三篇:使用ctypes调用进程函数和读取内存结构体

    目前的系列目录(后面会根据实际情况变动): 在windows11上编译python 将python注入到其他进程并运行 注入Python并使用ctypes主动调用进程内的函数和读取内存结构体 使用汇编引擎调用进程内的任意函数 利用beaengine反汇编引擎的c接口写一个pyd库,用于实现inline hook 利用beaengine反汇编

    2024年02月06日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包