Frida Hook微信撤回功能(pc+android)
字数 1183 2025-08-29 08:30:06
Frida Hook微信撤回功能教学文档 (PC+Android)
一、准备工作
1. 环境准备
- 安装Frida和Python环境
- 对于Android端:
- 需要一台具有root权限的手机或模拟器
- 下载frida-server,使用adb push到手机端并运行
2. 工具下载
- Frida GitHub仓库:https://github.com/frida/frida
二、PC端微信Hook
1. 定位撤回功能代码
- 使用IDA打开
WeChatWin.dll(微信主要功能库) - 搜索字符串"revokeMsg"
- 找到引用这些字符串的代码
2. Hook目标函数
- 对引用关键字符串的函数逐个尝试Hook
- 手动触发撤回逻辑,判断是否Hook成功(控制台输出"hook success")
- 经过定位,关键函数为
sub_182313480
3. 分析关键函数
- 函数使用switch语句有三个分支(0x4, 0x21, 0x24)
- 修改思路:将v9(对应寄存器rdi)的值改为这三个值以外的值(如0)
4. Hook实现代码
# 示例代码(需根据实际偏移地址调整)
import frida
import sys
session = frida.attach("WeChat.exe")
script = session.create_script("""
Interceptor.attach(ptr("0x18232BAAA"), {
onEnter: function(args) {
console.log("Hook成功");
this.context.rdi = ptr("0x0"); // 修改rdi寄存器值
}
});
""")
script.load()
sys.stdin.read()
5. 效果
- 成功拦截微信撤回功能,消息不会被撤回
三、Android端微信Hook
1. 定位撤回功能代码
- 使用jadx打开微信APK
- 搜索关键词"revokeMsg"
- 找到
RevokeMsgEvent类 - 通过交叉引用(X键)找到调用该类的代码(通常只有一处)
2. Hook目标方法
常见问题:直接使用jadx生成的Frida片段可能报"找不到类"错误
正确方法:
- 使用枚举获取classloader
- 尝试获取目标类句柄
- Hook目标函数
3. Hook实现代码
Java.perform(function() {
// 枚举所有classloader
Java.enumerateClassLoaders({
onMatch: function(loader) {
try {
// 尝试加载目标类
var RevokeMsgEvent = loader.loadClass("com.tencent.mm.sdk.platformtools.RevokeMsgEvent");
console.log("成功找到类");
// Hook目标方法
var method = RevokeMsgEvent.getDeclaredMethod("onEvent", [Java.getClassName('java.lang.String'), Java.getClassName('long'), Java.getClassName('p0'), Java.getClassName('java.lang.String'), Java.getClassName('java.lang.String'), Java.getClassName('java.lang.String')]);
method.implementation = function(str, j16, p0Var, str2, str3, str4) {
console.log("拦截到撤回事件");
// 注释掉原方法调用以阻止撤回
// this.m(str, j16, p0Var, str2, str3, str4);
};
} catch(e) {
// console.log(e);
}
},
onComplete: function() {}
});
});
4. 验证方法
- 运行Hook脚本
- 手动发送消息并撤回
- 观察控制台输出和消息是否被撤回
5. 效果
- 成功拦截Android微信撤回功能
- 虽然服务器已发送撤回指令,但本地删除操作被拦截
四、技术原理
-
PC端原理:
- 通过修改关键寄存器值(rdi)使switch语句跳转到无效分支
- 绕过撤回函数的正常执行流程
-
Android端原理:
- 拦截
RevokeMsgEvent.onEvent方法调用 - 阻止执行实际的撤回操作
- 拦截
五、注意事项
- 本方法仅修改本地数据,服务器已记录撤回操作
- 微信版本更新可能导致偏移地址和类名变化,需重新分析
- 使用root权限有安全风险,建议在测试环境中操作
- 该方法仅供学习研究,请勿用于非法用途
六、进阶技巧
-
动态定位:
- 使用Frida的
Module.findExportByName动态获取函数地址 - 使用
Memory.scan搜索特征码定位关键函数
- 使用Frida的
-
更稳定的Hook:
- 使用Frida的
Stalker功能跟踪代码执行流程 - 结合Xposed框架实现更稳定的Hook
- 使用Frida的
-
多版本兼容:
- 编写版本检测逻辑
- 为不同微信版本准备不同的Hook点