WeChatTweak 指南:一条命令给 Mac 微信打上防撤回与多开补丁
"对方撤回了一条消息。" Mac 版微信上,这条灰色小字一旦出现,内容就再也找不回来了。WeChatTweak 是一个面向 Mac 版微信的命令行补丁工具:它用一条命令改写 WeChat.app 主程序里负责"撤回""自动更新""禁止多开"的几处函数,从而实现消息撤回拦截、关闭自动更新、客户端多开。它不动聊天数据和登录态,只修改本地安装的微信程序本身。
三条命令跑起来:安装与首次 patch
在 macOS 上,全部流程就是装工具、打补丁这两步。
brew install sunnyyoung/tap/wechattweak
wechattweak patch
wechattweak patch 会先读取 /Applications/WeChat.app/Contents/Info.plist 里的 CFBundleVersion,拿到本机微信的版本号,再去匹配对应的补丁配置,最后改写二进制并重新签名。整个过程不需要打开微信,也不需要配置任何参数。
两个高频情况,第一次跑就会碰到:
-
提示
Unsupported WeChat version。 补丁配置是按版本号逐条维护的,你的微信版本若还不在支持列表里就会报这个错。可以先用wechattweak versions查看当前支持哪些版本:wechattweak versions报"不支持"通常意味着微信刚更新、补丁还没跟上,等工具发布新版本后再执行一次
wechattweak patch即可,不用手动改任何东西。 -
提示权限不足。
patch需要写入/Applications下的微信程序,若没有写权限,在前面加sudo再执行一次。
执行到 Done! 后,关闭已打开的微信、重新打开,补丁就生效了。
消息不再被撤回:revoke 补丁做了什么
这是 WeChatTweak 最被关注的功能。打上补丁后,对方执行撤回时,消息不会从会话里消失,撤回行为被直接拦截,原来的文本、图片、文件仍留在聊天窗口里。
对应到实现,它改的是配置中标识为 revoke 的那个函数入口。原理见下文"它到底改了微信的哪几处",一句话概括:把这个"撤回"函数改成一进来就返回,于是撤回逻辑根本没机会执行。
同时登录两个微信账号怎么做
多开靠的是配置里标识为 multiInstance 的补丁点。默认情况下,Mac 版微信检测到已有实例运行就会拒绝第二个登录,这条补丁把这个"单实例"判断关掉,允许同时跑多个微信进程,用于工作号与生活号分离。
打完补丁后,再启动一个新的微信实例有两种方式:
open -n /Applications/WeChat.app
或者在 Dock 里右键微信图标选择"打开",再登录另一个账号即可。每个实例是独立进程,登录各自账号、各自收消息,互不覆盖。
关掉微信自动更新
Mac 版微信默认会在后台检查并自动更新版本,而前面也提到:微信一升级,补丁地址就可能变化、功能随之失效。为避免微信"偷偷"自己更新,WeChatTweak 一并关闭了自动更新相关的几个入口。这些点在配置里分别是 startUpdater、startBackgroundUpdatesCheck、checkForUpdates、enableAutoUpdate、automaticallyDownloadsUpdates、canCheckForUpdate,作用一致:让微信不再自己检查、下载和安装更新。
关闭自动更新后,升级完全由自己掌控——这正是让"防撤回/多开"长期保持稳定的前提:只有你自己决定何时升,才能保证每次升级后都来得及重新打补丁。
微信升级之后,功能为什么又会失效
这是使用这个工具最需要建立的一个预期:补丁是按"版本号 + 内存地址"精确打在某几个字节上的,微信每次发新版,这些地址通常都会移动,所以旧补丁对新二进制不再有效,功能看起来就像"突然没了"。
处理办法固定,分两种:
- 版本仍在支持列表内。 微信升级后,重新执行一次
wechattweak patch就能把新地址重新打上,功能恢复。 - 版本暂时不支持。 先执行
wechattweak versions确认;若列表里还没有当前版本,说明补丁作者还在跟进,等工具更新后重跑一次即可。这段时间可以先用旧功能,或暂时接受微信自动更新。
也就是说,"升级 → 重跑 patch"是这个工具的日常节奏,属于正常现象而非故障。
它到底改了微信的哪几处
WeChatTweak 不注入动态库,而是对 WeChat.app/Contents/MacOS/WeChat 这个 Mach-O 主二进制做原地字节补丁。整体流程可以拆成四步(源码见 Sources/WeChatTweak/):
-
读版本。 通过
defaults read ... CFBundleVersion拿到本机微信版本号(Command.swift)。 -
匹配配置。 从 config.json 里按版本号找到对应的补丁表,找不到就报"不支持"。每个补丁项长这样,本质是"在哪个架构、哪个地址、写哪段机器码":
{ "version": "31927", "targets": [ { "identifier": "revoke", "entries": [ { "arch": "arm64", "addr": "103dba3d0", "asm": "00008052C0035FD6" } ] } ] } -
改写字节。 Patcher.swift 解析 Mach-O 的段表(
LC_SEGMENT_64),把配置里的虚拟地址换算成文件里的真实偏移,再把那几字节写成新的机器码。这些新机器码的作用都是让对应函数"一进来就返回",于是撤回、更新、单实例检查等逻辑被直接短路掉。它同时兼容单架构与通用(universal)二进制。 -
重新签名。 二进制被改过后,原签名失效,工具会移除旧签名、做 ad-hoc 自签名并清除隔离属性(
codesign+xattr -cr),让微信仍能正常启动。
想看某个功能对应哪几个补丁点、地址如何随版本变化,直接翻 config.json 即可,它是这个工具"支持哪些版本、改了什么"的唯一事实来源。
改坏了或想彻底还原怎么办
因为改动只发生在本地 WeChat.app 内部,没有留下额外的常驻组件,还原方式很简单:卸载并重新安装官方微信(从微信官网重新下载安装包覆盖安装),程序恢复原样,补丁随之消失。聊天记录存放在用户目录下,不受影响。
如果只是想临时去掉某个功能、保留其他功能,目前工具不提供"单点回退",重新安装是最干净的还原路径。
从源码构建(可选)
不想用 Homebrew、或想自己确认逻辑时,可以从源码构建出通用二进制:
git clone https://gitcode.com/gh_mirrors/we/WeChatTweak
cd WeChatTweak
make build
构建脚本见 Makefile,产物是可执行的 wechattweak,用法与 brew 安装版一致。
适合谁、下一步怎么试
WeChatTweak 适合这样一类人:在 Mac 上用微信,既在意"重要消息不被对方悄悄撤回",又需要工作号与生活号同时在线,还希望微信不要自己悄悄升级把补丁顶掉。它是个一次性打补丁的命令行工具,没有常驻后台、没有图形界面,成本是"每次微信升级后要记得重跑一次 wechattweak patch"。
建议的试用顺序:先 wechattweak versions 确认当前微信在支持列表里,再 wechattweak patch,重启微信验证撤回拦截,最后用 open -n /Applications/WeChat.app 试一次多开。整套操作几分钟内即可完成,且随时可通过重装微信回到原状。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



