前言

之前写的Python微信机器人系列,看数据倒是有一些人关注,交流群也有两百多人,但是真正使用的没几个,而会去看文章学习原理的没有一个。

Python其实并不适合做hook,注入Python去实现hook和主动调用甚至都不如frida,因为注入特征太明显,Python会将所有的dll都会加载到目标进程,而frida只会加载一个dll到目标进程。

当然,注入Python在实现和写代码上是比frida要方便的,比如定义结构体,调用函数等,还可以使用Python丰富的第三方库。那有没有方法既能隐蔽注入和hook,又能使用Python呢?

更好的方式

我们其实可以使用C++来做核心,C++有着非常多成熟的hook开源库,github上的一些无痕hook代码都是C++的,例如利用VEH异常处理机制hook,或是从驱动层做hook。这些hook方式不会修改内存字节码,能轻松过crc检测。

然后在主程序里加载Python作为脚本语言使用,并和C++写的dll做通信的话,既能隐蔽hook,也能使用Python丰富的第三方库。不过,封不封并非只靠客户端来判断,还有服务端的异常行为判断,比如频繁加好友等异常行为。

测试用一个注册两周的号来做视频号自动解析群,已经正常运行一个月了,有需要自动解析的,也可以进群测试一下,免费的。

不开源

有人说,开源可以让更多人帮忙写代码,但其实,哪有人无私给你奉献代码,仓库的维护人永远只是那么几个人。大部分人即使优化了代码,也只会是想着这代码怎么才能卖钱。

所以这个版本不开源,而且收费,不过会给一个试用期(两个月),如果觉得好用再按月付费。另外,一些灰色产业相关的功能就别问了,不会添加,这个只是给个人提供一些可玩性。

使用门槛

如果你只需要当前已有的插件的一些功能,那基本不需要什么门槛,就只需要当一个exe执行一下。但是你如果想自定义插件实现自己的需求,那么需要会Python的基础语法。不要一来就问Python代码怎么写了。

功能列表

这里只做个概述,后面会写文章说明每个插件怎么写的,用了哪些功能,还有效果展示。

发送消息:

  • 文本消息
  • 图片消息
  • AT消息
  • xml消息
  • 表情消息
  • 名片消息
  • 拍一拍消息
  • 文件消息
  • 小程序消息
  • 引用消息
  • 转发消息
  • 撤回消息

CDN下载:

  • 下载视频
  • 下载图片
  • 下载文件

其他功能:

  • 获取微信文件路径
  • 获取自己的登录信息
  • 获取语音文本内容
  • 获取语音内容
  • 接收转账
  • 退还转账

好友相关:

  • 网络获取好友信息
  • 编辑好友备注
  • 内存获取好友信息
  • 获取好友列表
  • 检测好友状态
  • 同意好友请求

群相关:

  • 获取群列表
  • 邀请好友进群
  • 修改自己的群昵称
  • 修改群名称
  • 设置群公告
  • 发送群邀请
  • 删除群成员
  • 获取群成员昵称
  • 获取群成员列表

使用步骤

依赖环境

微信(版本3.9.6.32) ,下载地址: https://www.123pan.com/s/ihEKVv-u4Ox.html 提取码:yw41

里面有两个文件,zip是从exe用7zip解压得到的,可以作为绿色版直接使用(这样可以不用卸载之前安装的微信)。

hook程序下载:https://github.com/kanadeblisst00/pywxrobot

启动

先以管理员权限启动微信并登录, 打开pywxrobot.exe就会加载pyrobot目录下的main.py,相当于运行python main.py,只不过exe提供了一些功能函数给python使用。

main.py里的代码只是用于初始化插件,也就是plugins目录里的代码。

pyrobot目录结构

  • .vscode: vscode的配置,用于配置语法提示
  • packages: 依赖的一些其他包可以放在这个目录,这个目录默认已经加到sys.path
  • plugins: 由pywxrobot的插件目录,可以是py文件或者文件夹(需包含__init__.py)。
  • other_plugins: 不依赖消息机制的插件,可以在命令行使用pywxrobot.exe 插件.py执行。
  • settings: 配置文件目录,文件名需和插件名一样
  • test: 没什么用,我写的一些测试脚本
  • .env: 可以设置packages的路径,这样引用packages里的包在vscode里就有语法提示了
  • main.py: 启动文件
  • requirements.txt: 依赖包,便携版Python已经带了这些依赖。如果想用安装版Python需要自己安装这些依赖

已有的插件列表

消息插件:

  • auto_accept_friend.py: 自动接受好友请求
  • auto_download_file.py: 自动下载聊天文件
  • auto_download_img.py: 自动下载聊天图片,可以配置auto_download_img.json里的save_path来解密保存到其他目录
  • auto_download_video.py: 自动下载聊天视频
  • auto_recv_transfer.py: 自动接收转账
  • auto_save_emotion.py: 将接收到的表情包保存到指定路径,
  • auto_save_voice.py: 将收到的语音保存到指定路径(格式silk)
  • debug.py: 控制台和日志打印所有消息,可通过配置文件关闭
  • echo_revoke_msg.py: 打印撤回的消息
  • enter_room_tip.py: 设置进群提示语,例子请看配置文件
  • interactive_console.py: 如果启用,会在控制台开启一个python的交互式终端
  • keyword_invite_to_room.py: 根据关键词邀请进群,会判断两个内容,聊天消息和加好友的验证消息
  • sysmsg_manager.py: 内置插件,不需要管
  • xml_manager.py: 内置插件,不需要管

其他插件:

  • foreach_check_friends_status.py: 无感知检测所有好友状态(删除、拉黑和好友)
  • export_friends.py: 导出好友列表
  • export_rooms.py: 导出关键词列表
  • export_bizs.py: 导出公众号列表

待开发插件

  • 关键词回复
  • 导出群成员列表
  • 对接大模型回复,例如kimi、gpt等
  • 群聊成员去重
  • 公众号消息监听
  • 公众号直播提醒
  • ...

如何开发插件

编写插件

首先需要知道两个点:

  • 如何获取到聊天消息
  • 如何主动调用函数

编写好的插件放到pyrobot/plugins目录,然后关闭重新打开pywxrobot.exe就会生效。如果是不依赖消息的插件,放到pyrobot/other_plugins目录下, 在命令行运行pywxrobot.exe pyrobot\other_plugins\插件.py就能运行。

如何获取到聊天消息

broadcast_service.listen(消息类型, 处理函数)

当收到这个类型的消息,就会调用处理函数,具体可以参考其他插件的写法。每个处理函数是一个单独的线程,使用公共资源时需要加锁。

所有消息的类型定义在wxstruct.py里的MsgTypeXmlMsgTypeSysMsgType

MsgType有以下属性:

  • TEXT: 文本消息
  • IMAGE: 图片消息
  • VIDEO: 视频消息
  • VOICE: 语音消息
  • ADDFRIEND: 好友请求
  • CARD: 名片消息
  • EMOTION: 表情消息
  • LOCATION: 位置消息
  • XML: XML消息,可能是文件、转账、文章、小程序、聊天记录等
  • VOIP : 语音、视频通话
  • NOTICE: 通知消息,可能是进群提示、红包、拍一拍等
  • SYSMSG: 系统消息, 很多我也不知道是什么

xml_manager插件会进一步处理XML类型消息,生成以下类型消息:

  • BIZMSG: 分享的文章
  • FILE: 文件
  • SHARE_LOCATION: 位置共享
  • MULTI_MSG: 合并发送的多条消息
  • STEP_RANK_MSG: 微信运行发送的步数消息
  • APPMSG: 分享的小程序
  • FEED: 视频号
  • REFERENCE_MSG: 引用回复
  • ROOM_ANNOUNCEMENT: 群公告
  • TRANSFER: 转账

如果有些消息没有定义,你可以在wxstruct.py里定义一个名称,值是消息里msg_type的值。定义完成后,broadcast_service.listen就可以监听该类型的消息。

如何导入外部依赖

如果是安装版Python,用pip安装即可。如果是便携版,你需要从安装版里复制出来放到packages下,或者是用便携版Python下载一个pip,再用pip安装到指定文件夹。有些库这么操作可能会报错,这个自行解决或者直接使用安装版Python。

如何主动调用函数

导出微信函数的模块名是wxfunc,所有函数列表可以看wxfunc.pyi,使用案例请看docs目录下的文档

例如你想在插件里发送文本消息:

import wxfunc

wxfunc.SendTextMsg("filehelper", "测试消息")

待补充

详细版的文档后面补充,后面的更新插件会在: https://github.com/kanadeblisst00/pywxrobot


Python成长路
13 声望9 粉丝

Python相关知识分享