mirror of
https://github.com/a244573118/WeChatIntercept.git
synced 2026-07-02 02:40:37 +08:00
拦截到撤回时弹出 macOS 系统通知(显示谁撤回了消息)
This commit is contained in:
@@ -1,29 +1,62 @@
|
||||
# WeChatIntercept
|
||||
|
||||
macOS 微信防撤回工具。
|
||||
|
||||
## 最新版本(v4.1.10)
|
||||
## 最新版本
|
||||
|
||||
**支持微信 4.1.9及以上**,适配微信全新 C++ 架构,通过 DYLD 运行时注入实现防撤回,一键生效。
|
||||
**支持微信 4.1.9 ~ 4.1.10**,适配微信全新 C++ 架构,通过 DYLD 运行时注入实现防撤回。
|
||||
|
||||
### 功能
|
||||
|
||||
- 对方撤回的消息保留可见
|
||||
- 自己撤回正常工作
|
||||
- 撤回时弹出 macOS 系统通知(显示谁撤回了消息)
|
||||
- 通知开关可随时切换
|
||||
|
||||
### 原理
|
||||
|
||||
通过注入一个运行时 hook 动态库(`WeChatAntiRevoke.dylib`),利用微信内建的 hook dispatch slot 机制拦截 `isRevokeMessage()` 函数。
|
||||
通过注入运行时 hook 动态库(`WeChatAntiRevoke.dylib`),拦截微信内部的 `isRevokeMessage()` 函数:
|
||||
|
||||
- 对方撤回 → 返回 false(消息保留)+ 弹出通知
|
||||
- 自己撤回 → 返回 true(正常处理)
|
||||
|
||||
通过读取当前登录用户 ID(完整字符串匹配),精确区分自己与对方。
|
||||
|
||||
### 适用范围
|
||||
|
||||
- macOS 微信 4.1.9及以上
|
||||
- macOS 微信 4.1.9、4.1.10
|
||||
- Apple Silicon(arm64)及 Intel(x86_64)
|
||||
- macOS Sequoia / Sonoma / Ventura 等(自动处理 provenance 限制)
|
||||
|
||||
### 使用
|
||||
|
||||
```bash
|
||||
chmod +x patch.sh # 添加可执行权限
|
||||
./patch.sh # 安装防撤回
|
||||
./patch.sh --uninstall # 卸载
|
||||
./patch.sh --help # 帮助
|
||||
chmod +x patch.sh # 添加可执行权限
|
||||
./patch.sh # 安装防撤回
|
||||
./patch.sh openNotify # 开启撤回通知
|
||||
./patch.sh closeNotify # 关闭撤回通知
|
||||
./patch.sh --uninstall # 卸载
|
||||
./patch.sh --help # 帮助
|
||||
```
|
||||
|
||||
首次运行可能需要约 30 秒(自动解除系统文件保护)。
|
||||
首次运行可能需要约 30 秒(自动解除系统文件保护并重签名)。
|
||||
|
||||
### 配置
|
||||
|
||||
配置文件路径:`~/.config/antirevoke/config`
|
||||
|
||||
```ini
|
||||
notify=1 # 1=开启撤回通知, 0=关闭
|
||||
```
|
||||
|
||||
安装时默认开启通知,也可通过命令随时切换:
|
||||
|
||||
```bash
|
||||
./patch.sh openNotify # 等同于设置 notify=1
|
||||
./patch.sh closeNotify # 等同于设置 notify=0
|
||||
```
|
||||
|
||||
修改后立即生效,无需重启微信。
|
||||
|
||||
### 依赖
|
||||
|
||||
@@ -33,17 +66,26 @@ macOS 系统自带工具,无需额外安装:
|
||||
- codesign
|
||||
- tar
|
||||
|
||||
如未安装 Xcode Command Line Tools,运行:xcode-select --install
|
||||
如未安装 Xcode Command Line Tools,运行:`xcode-select --install`
|
||||
|
||||
### 调试
|
||||
|
||||
```bash
|
||||
./patch.sh --debug # 调试模式(不安装 hook,仅签名允许 lldb attach)
|
||||
cat /tmp/antirevoke_debug.log # 查看运行时日志
|
||||
```
|
||||
|
||||
### 已知限制
|
||||
|
||||
- **无撤回提示**:当前方案仅静默保留原消息,不会在聊天窗口中显示"对方撤回了一条消息"的提示。你不会知道对方曾经尝试撤回,只能注意到消息没有消失。
|
||||
- **聊天框内无撤回提示**:由于微信 4.x 的架构限制(C++ 实现 + 符号 strip + 数据库加密),无法在聊天界面内插入系统消息。替代方案为 macOS 系统通知。
|
||||
|
||||
- **为什么不能像旧版那样在聊天框内显示提示?**
|
||||
|
||||
旧版微信 macOS(3.x)使用 Objective-C 构建,核心逻辑暴露为 ObjC 方法,可以通过 Method Swizzling 在运行时拦截撤回处理函数,保留原消息的同时调用微信内部的消息插入 API 写入一条提示。
|
||||
旧版微信 macOS(3.x)使用 Objective-C,可通过 Method Swizzling 调用内部消息插入 API。4.x 版本核心逻辑全部迁移到 C++(仅剩 65 个 ObjC 类,90MB+ 代码段,符号已 strip),撤回处理通过虚函数 + 加密数据库 + 协程调度完成,无法稳定地从外部构造调用链插入消息。
|
||||
|
||||
4.1.9以上的底层架构已完全不同:核心逻辑迁移到 C++ 实现(仅剩 65 个 ObjC 类,而代码段超过 90MB 均为 C++ 且符号已 strip)。撤回处理不再是独立的"删除旧消息"+"插入提示"两步操作,而是将整个消息对象替换为新的视图模型。在纯二进制补丁方式下,无法构造复杂的函数调用链来插入一条新消息到聊天记录中。
|
||||
### 技术文档
|
||||
|
||||
详细的逆向分析过程和适配指南见 [`doc/reverse-engineering-guide.md`](doc/reverse-engineering-guide.md)。
|
||||
|
||||
---
|
||||
|
||||
@@ -87,5 +129,5 @@ macOS 系统自带工具,无需额外安装:
|
||||
|
||||
## 注意
|
||||
|
||||
- 微信更新后需重新运行对应版本的补丁
|
||||
- 微信更新后需重新运行 `./patch.sh`
|
||||
- 仅供学习研究用途
|
||||
|
||||
Reference in New Issue
Block a user