前言
之前写的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
里的MsgType
、XmlMsgType
和SysMsgType
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。