注入Python到微信,并实现Python发送消息和接收消息
Project description
教程目录
- 在windows11上编译python
- 将python注入到其他进程并运行
- 注入Python并使用ctypes主动调用进程内的函数和读取内存结构体
- 调用汇编引擎实战发送文本和图片消息(支持32位和64位微信)
- 允许Python加载运行py脚本且支持热加载
- 利用汇编和反汇编引擎写一个x86任意地址hook,实战Hook微信日志
- 封装Detours为dll,用于Python中x64函数 hook,实战Hook微信日志
- 实战32位和64位接收消息和消息防撤回
- 实战读取内存链表结构体(好友列表)
- 做一个僵尸粉检测工具
- 根据bug反馈和建议进行细节上的优化
- 其他功能看心情加
当前支持版本
32位:
3.9.8.12
64位:
3.9.8.15
等这个系列教程结束再更新新版本,hook库和主动调用都已经说完了,也可以等群友提pr来更新。
群二维码
如果二维码失效了,可以加我好友kanadeblisst
,备注进群
,或者加完好友发送进群
使用教程
当前支持功能
- 发送文本消息
- 发送图片消息
- hook微信日志输出
- hook接收消息
- 消息防撤回
准备环境
- 安装支持的版本微信
- 安装32位或64位Python(取决于你安装的微信是32位还是64位),版本大于等于3.7
pip install --upgrade wechat_pyrobot
使用
首先创建一个目录,例如robot_code
,再创建一个main.py
(名称随意)写入一下代码:
from py_process_hooker import inject_python_and_monitor_dir
if __name__ == "__main__":
process_name = "WeChat.exe"
open_console = True
inject_python_and_monitor_dir(process_name, __file__, open_console=open_console)
启动并登录微信,执行这个main.py
就会把Python注入到微信并且打开控制台
接着你在当前目录创建的任何代码保存后,都会被自动加载到微信并执行(注意创建的带代码文件名不能以数字开头)
发送消息
例如 创建一个sendmsg.py
,写入以下代码后保存:
import time
from module import SendMsg
st = SendMsg()
st.send_text("filehelper", "测试消息!")
# 注意发送消息之间要间隔时间
time.sleep(1)
st.send_image("filehelper", r"D:\a.png")
第一个参数是wxid,获取方式后面再讲,或者下篇接收消息也能获取到好友的wxid,第二个参数是消息内容
发送消息时不要使用死循环,会阻塞Python进程,如果想定时发送消息,可以使用Python的定时器threading.Timer
或者多线程threading.Thread
threading.Timer
import time
from threading import Timer
from module import SendMsg
st = SendMsg()
def send_timer(n: int):
global msg_timer
t = time.strftime("%Y-%m-%d")
msg_text = f"{t}: {n}"
st.send_text("filehelper", msg_text)
# 10秒后再执行一次
msg_timer = Timer(10, send_timer, (n+1, ))
msg_timer.start()
# 2秒后执行send_timer
msg_timer = Timer(2, send_timer, (1, ))
msg_timer.start()
# timer.cancel()#取消执行
取消定时器(解释见下面的骚操作):
import sys
sendmsg_timer = sys.modules["sendmsg_timer"]
msg_timer = sendmsg_timer.msg_timer
msg_timer.cancel()
hook日志
例如创建一个hooklog.py
,写入一下代码后保存:
from module import HookLog
hooker = HookLog()
hooker.hook()
日志会被打印在控制台,如果想输出到文件,可以改下代码写入到文件
hook不会阻塞进程,因为回调函数是在微信内部被调用,所以不需要使用多线程
骚操作
之前说了加载模块都会被保存在sys.modules
这个字典里,而这个热加载就是以模块形式加载代码
所以你可以在新文件里引用之前文件的变量和方法,例如我新建一个unhooklog.py
, 写入如下代码:
import sys
# 获取robot.py模块
robot = sys.modules["robot"]
# 获取robot模块中的hooker变量
hooker = robot.hooker
# 取消hook
hooker.unhook()
不过,因为hook类已经被定义成了单例模式,所以即使你新建一个文件在实例化一个也是一样的效果
from module import HookLog
hooker = HookLog()
hooker.unhook()
接收消息
创建一个hookmsg.py
(名称随意,别数字开头就行),写入一下代码后保存:
from module import HookMsg
def msg_callback(json_msg_str:str):
print(json_msg_str)
hooker = HookMsg(msg_callback)
hooker.hook()
后续再优化使用方式,注入后会自动加载hook消息的脚本,并引入消息插件的模式。可以自己编写py插件脚本来处理消息
撤回消息
创建一个revoke.py
,写入一下代码后保存:
from module import AntiRevoke
ar = AntiRevoke()
ar.hook()
界面上的消息不会被撤回,但也不会有撤回提示。控制台会打印谁谁谁撤回了一条消息,但是没有消息内容,只有消息的msgid。你可以先将消息保存下来,然后通过这个msgid来查询撤回的哪个消息
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for wechat_pyrobot-0.1.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d8572c5938ee62cbdb11b113e5ff8e3831657b83bd092c6a341ae32896cd5f3c |
|
MD5 | 17d020b712a106b449964d25fc3fd5c2 |
|
BLAKE2b-256 | 67707ead84c2f58b79e03d92255d041267905b3254404a44e3ab9a3ee53bc351 |