Frida Hook 微信接收信息功能(PC)
字数 1566 2025-08-29 08:30:05
Frida Hook 微信PC版接收信息功能技术文档
1. 准备工作
1.1 所需工具
- CheatEngine:用于内存搜索和定位
- x64dbg:用于调试和分析函数调用
- Python:运行Frida脚本
- Frida:动态插桩工具
- 一台root的手机/模拟器:用于运行frida-server
- ADB工具:推送frida-server到设备
1.2 环境配置
- 安装Python和Frida:
pip install frida frida-tools - 下载对应架构的frida-server并推送到设备:
adb push frida-server /data/local/tmp/ adb shell chmod +x /data/local/tmp/frida-server adb shell /data/local/tmp/frida-server &
2. 定位消息内存位置
2.1 使用CheatEngine搜索
- 启动微信PC版(版本3.9.12.51)和小号
- 使用小号发送测试消息(如"imatest")
- 在CheatEngine中:
- 附加到wechat.exe进程
- 搜索字符串"imatest"
- 发送多条不同消息,筛选出值随消息变化的地址
2.2 验证内存地址
- 右键候选地址,选择"Browse in this memory region"
- 寻找同时包含以下内容的内存区域:
- 微信ID
- 消息内容
- XML标签结构
- 排除临时内存区域(等待一段时间观察是否被回收)
3. 定位消息处理函数
3.1 设置硬件断点
- 打开x64dbg,附加到wechat.exe
- 按Alt+E打开模块列表,选择wechatwin.dll
- 按Ctrl+G跳转到CheatEngine中找到的地址
- 右键地址设置1字节硬件断点
- 按F9继续运行程序
3.2 触发断点分析
- 用小号发送新消息触发断点
- 观察右下角栈窗口,向下滚动
- 注意SQL语句(消息存入数据库的操作)
- 定位数据库操作之前的最近函数调用
3.3 确定关键函数
- 在栈窗口中找到数据库名称
- 向上查找最近的函数调用(数据库名称之前的)
- 右键返回地址,选择"在反汇编中转到指定QWORD"
- 在调用语句处设置断点
- 移除硬件断点
4. 分析消息数据结构
4.1 寄存器分析
- 触发断点后,查看寄存器窗口
- 64位程序传参顺序:RDI → RSI → RDX → RCX → R8 → R9 → stack
- 右键RDI值,选择"在内存窗口中转到"
4.2 消息结构偏移
- 观察内存窗口中的消息结构
- 确定关键偏移:
- 微信ID:RDI + 0x48
- 消息内容:RDI + 0x88
- 验证偏移的正确性(发送不同消息测试)
5. 计算函数偏移
5.1 获取运行时地址
- 在x64dbg中复制断点处的地址
- 按Alt+E打开模块列表,复制wechatwin.dll基址
- 计算文件偏移:运行时地址 - 模块基址
5.2 脱离调试器
完成分析后,选择菜单"文件→脱离"退出调试状态
6. Frida脚本实现
6.1 脚本结构
// 计算目标函数地址
const baseAddr = Module.findBaseAddress("wechatwin.dll");
const hookAddr = baseAddr.add(0x123456); // 替换为实际偏移
// Hook目标函数
Interceptor.attach(hookAddr, {
onEnter: function(args) {
// args[0]对应RDI寄存器
const wxid = args[0].add(0x48).readUtf8String();
const message = args[0].add(0x88).readUtf8String();
console.log(`[+] 收到消息 - 发送者: ${wxid}, 内容: ${message}`);
}
});
6.2 Python加载脚本
import frida
import sys
def on_message(message, data):
print(message)
with open("hook_wechat.js", "r", encoding="utf-8") as f:
js_code = f.read()
session = frida.attach("wechat.exe")
script = session.create_script(js_code)
script.on("message", on_message)
script.load()
sys.stdin.read()
7. 效果验证
- 运行Python脚本
- 用小号发送测试消息
- 观察控制台输出:
- 正常显示接收的消息
- 即使消息被撤回,控制台仍保留记录
- 显示发送者ID和消息内容
8. 注意事项
- 微信版本差异:不同版本偏移量可能不同,需重新分析
- 内存保护:某些版本可能有反调试措施
- 稳定性:长时间Hook可能导致微信不稳定
- 法律风险:仅限学习和研究用途,勿用于非法目的
9. 扩展思路
- 消息拦截:修改onEnter函数可实现消息拦截
- 自动回复:结合发送函数Hook可实现自动回复
- 消息存储:将消息保存到本地数据库或文件
- 多账号支持:分析多账号登录时的内存结构差异
10. 排错指南
- 无法附加进程:检查是否以管理员权限运行
- 偏移无效:确认微信版本和模块基址正确
- 无输出:检查断点是否在正确的消息处理路径
- 崩溃问题:减少Hook函数的操作,避免内存错误
通过以上步骤,可以实现对微信PC版接收消息功能的Hook和监控,为后续的自动化处理和消息分析提供基础。