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. 定位撤回功能代码

  1. 使用IDA打开WeChatWin.dll(微信主要功能库)
  2. 搜索字符串"revokeMsg"
  3. 找到引用这些字符串的代码

2. Hook目标函数

  1. 对引用关键字符串的函数逐个尝试Hook
  2. 手动触发撤回逻辑,判断是否Hook成功(控制台输出"hook success")
  3. 经过定位,关键函数为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. 定位撤回功能代码

  1. 使用jadx打开微信APK
  2. 搜索关键词"revokeMsg"
  3. 找到RevokeMsgEvent
  4. 通过交叉引用(X键)找到调用该类的代码(通常只有一处)

2. Hook目标方法

常见问题:直接使用jadx生成的Frida片段可能报"找不到类"错误

正确方法

  1. 使用枚举获取classloader
  2. 尝试获取目标类句柄
  3. 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. 验证方法

  1. 运行Hook脚本
  2. 手动发送消息并撤回
  3. 观察控制台输出和消息是否被撤回

5. 效果

  • 成功拦截Android微信撤回功能
  • 虽然服务器已发送撤回指令,但本地删除操作被拦截

四、技术原理

  1. PC端原理

    • 通过修改关键寄存器值(rdi)使switch语句跳转到无效分支
    • 绕过撤回函数的正常执行流程
  2. Android端原理

    • 拦截RevokeMsgEvent.onEvent方法调用
    • 阻止执行实际的撤回操作

五、注意事项

  1. 本方法仅修改本地数据,服务器已记录撤回操作
  2. 微信版本更新可能导致偏移地址和类名变化,需重新分析
  3. 使用root权限有安全风险,建议在测试环境中操作
  4. 该方法仅供学习研究,请勿用于非法用途

六、进阶技巧

  1. 动态定位

    • 使用Frida的Module.findExportByName动态获取函数地址
    • 使用Memory.scan搜索特征码定位关键函数
  2. 更稳定的Hook

    • 使用Frida的Stalker功能跟踪代码执行流程
    • 结合Xposed框架实现更稳定的Hook
  3. 多版本兼容

    • 编写版本检测逻辑
    • 为不同微信版本准备不同的Hook点
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实现代码 5. 效果 成功拦截微信撤回功能,消息不会被撤回 三、Android端微信Hook 1. 定位撤回功能代码 使用jadx打开微信APK 搜索关键词"revokeMsg" 找到 RevokeMsgEvent 类 通过交叉引用(X键)找到调用该类的代码(通常只有一处) 2. Hook目标方法 常见问题 :直接使用jadx生成的Frida片段可能报"找不到类"错误 正确方法 : 使用枚举获取classloader 尝试获取目标类句柄 Hook目标函数 3. Hook实现代码 4. 验证方法 运行Hook脚本 手动发送消息并撤回 观察控制台输出和消息是否被撤回 5. 效果 成功拦截Android微信撤回功能 虽然服务器已发送撤回指令,但本地删除操作被拦截 四、技术原理 PC端原理 : 通过修改关键寄存器值(rdi)使switch语句跳转到无效分支 绕过撤回函数的正常执行流程 Android端原理 : 拦截 RevokeMsgEvent.onEvent 方法调用 阻止执行实际的撤回操作 五、注意事项 本方法仅修改本地数据,服务器已记录撤回操作 微信版本更新可能导致偏移地址和类名变化,需重新分析 使用root权限有安全风险,建议在测试环境中操作 该方法仅供学习研究,请勿用于非法用途 六、进阶技巧 动态定位 : 使用Frida的 Module.findExportByName 动态获取函数地址 使用 Memory.scan 搜索特征码定位关键函数 更稳定的Hook : 使用Frida的 Stalker 功能跟踪代码执行流程 结合Xposed框架实现更稳定的Hook 多版本兼容 : 编写版本检测逻辑 为不同微信版本准备不同的Hook点