微信自从更新了一个大版本,把 Mac 和 Windows 统一后,左侧边栏就多出了游戏中心和小程序入口,没有提供隐藏这两个入口的设置。网上搜了一圈也没找到可以隐藏的方法。于是让 Codex 自己摸索了一番,终于搞定了。下图是搞定之后的效果:

我把成功的经验让 Codex 提炼成了指南,想要尝试的朋友可以把以下内容复制给 Codex:
请在我的 Mac 上制作一个独立的实验版微信,隐藏左侧栏的“游戏中心”和“小程序面板”两个入口,并保证截图权限在重启后仍然有效。请实际执行、逐步验证,不要只给我命令。
一、已知结论与适用范围
1. 目标是腾讯官网下载版 macOS 微信 4.1.12:
https://mac.weixin.qq.com/?t=mac&lang=zh_CN
2. 本方案只适用于 Apple Silicon ( arm64 ) Mac ,以及该版本的这一份 wechat.dylib:
- 路径:/Applications/WeChat.app/Contents/Resources/wechat.dylib
- 修改前完整 SHA-256:
f28329ed2599e8567f6b0a09f031d05666a48abd97dbc7a3380891ddbcff6cdc
3. 微信 4.1.12 不是通过修改 Electron 的 asar 来完成此任务。目标逻辑位于 Qt/XUI 原生 Mach-O 动态库 wechat.dylib 中。
4. 如果系统不是 arm64 、版本不是 4.1.12 、文件路径不存在、哈希不相同,或待修改位置的原始字节不相同,立即停止并向我报告。不要猜测新偏移,不要把其他版本硬套进来。
二、安全边界
1. 永远不要修改、重签或覆盖 /Applications/WeChat.app 。
2. 成品固定安装为:
/Applications/WeChat-NoGame.experimental.app
3. 所有修改先在 /private/tmp 下用 mktemp -d 创建的临时目录中完成并验证,验证通过后才能安装。
4. 如果上述实验版已经存在,先正常退出它,并把它移动到本次临时目录中作为可恢复备份;不要直接删除。
5. 官方版和实验版的主进程名称都叫 WeChat 。结束进程前必须根据完整可执行文件路径确认目标,只结束 /Applications/WeChat-NoGame.experimental.app 下的进程。不要使用 pkill WeChat 或 killall WeChat 。
6. 不要同时运行官方版和实验版。
7. 写入 /Applications 、访问代码签名私钥或操作隐私设置前,按运行环境要求向我申请权限。钥匙串密码、Apple ID 登录、录屏授权等安全操作由我亲自完成。
三、先做只读检查
请检查并记录:
- uname -m ,必须是 arm64 。
- /Applications/WeChat.app/Contents/Info.plist 中的 CFBundleShortVersionString ,必须是 4.1.12 。
- 用 file 或 lipo -archs 检查 wechat.dylib ,必须包含 arm64 。
- shasum -a 256 检查 wechat.dylib ,必须等于上述原始 SHA-256 。
- codesign --verify --deep --strict /Applications/WeChat.app 应通过。
如果官方应用不是这个版本,请让我先从腾讯官网安装 4.1.12 ;不要使用 App Store 版继续。
四、制作临时副本
1. 用 mktemp -d 创建类似以下临时目录:
/private/tmp/wechat-nogame.XXXXXX
2. 使用 ditto 完整复制官方应用到临时目录,并把副本命名为:
WeChat-NoGame.experimental.app
3. 后续只操作这个临时副本。
五、应用二进制补丁
目标文件是临时副本的:
Contents/Resources/wechat.dylib
请创建一个小型、可审计的补丁脚本,并严格完成以下操作:
1. 修改前重新计算 SHA-256 ;只有等于
f28329ed2599e8567f6b0a09f031d05666a48abd97dbc7a3380891ddbcff6cdc
才能继续。
2. 在完整 universal 二进制文件的以下两个文件偏移处修改各 4 字节:
- 小程序面板,item type 6:0x0B5A4664
- 游戏中心,item type 7:0x0B5A4740
3. 两处修改前的字节都必须严格等于:
f5 03 00 aa
这是 ARM64 指令 `mov x21, x0`。
4. 两处都改为:
15 00 80 52
这是 ARM64 指令 `mov w21, #0`。
5. 必须先验证两处原始字节都正确,再执行任何写入;其中任意一处不匹配就停止,不能留下只改一半的文件。
6. 写入后重新读取并验证两个位置。
7. 仅完成这两处修改、尚未重签时,目标 dylib 的 SHA-256 应为:
1e75abf1aa20cf093d6365f71e7328e8c4607e661ac552a9e1adb74daf225ac3
如果不相同,停止安装。
这个补丁的原理是:保留两个 mmui::XTabBarItem 对象及其内部索引,只把传给 QWidget::setVisible 的可见性结果强制为 false 。不要删除对象、不要改变 tab 集合、不要 NOP 掉插入调用。
尤其不要使用这两个已知失败方案:
- 修改 0x1934d3c 附近的 game_entry_state:不会改变图标显示。
- NOP 0x102a2dc 附近的插入调用:图标可能消失,但后续代码会访问空对象并崩溃。
六、使用稳定的 Apple Development 身份重签
不能使用 ad-hoc 签名作为最终方案。ad-hoc 的 designated requirement 会绑定当前 cdhash ;二进制一变,macOS TCC 就可能把它视作另一个应用,导致“录屏与系统录音”条目消失或权限永远无法识别。
1. 执行:
security find-identity -v -p codesigning
2. 选择一张当前有效且带私钥的 `Apple Development` 身份,后续用它的 SHA-1 指纹签名,不要只按可能重复的证书名称选择。
3. 如果没有有效身份,暂停,让我在 Xcode → Settings → Accounts → Manage Certificates → + → Apple Development 中创建。创建后再检查。
4. 如钥匙串中存在多张同名旧证书,要核对实际使用证书的有效期。不要误用过期证书。
5. 不要复制腾讯原始 entitlements 。里面的 application-identifier 、App Group 和腾讯 Team ID 不属于我的开发团队,强行保留会造成无效或异常签名。
6. 不要额外启用 hardened runtime ;这可能破坏微信依赖的运行方式。
清除临时副本上的扩展属性。若 xattr 因下面这个只读缓存文件失败:
Contents/MacOS/WeChatAppEx.app/Contents/Frameworks/WeChatAppEx Framework.framework/Versions/C/Resources/gpu_shader_cache.bin
可以只对该文件临时执行 chmod u+w ,完成 xattr -cr 后恢复为 chmod 444 。
设有效证书 SHA-1 为 SIGNING_IDENTITY ,依次执行等价于以下流程的签名:
1. 先签被修改的 wechat.dylib:
codesign --force --sign "$SIGNING_IDENTITY" --timestamp=none <临时副本>/Contents/Resources/wechat.dylib
2. 使用同一个身份重签所有嵌套代码和整个应用:
codesign --force --deep --sign "$SIGNING_IDENTITY" --timestamp=none <临时副本>
3. 最后只重签外层应用,并设置一个与腾讯不同、在本机唯一且合法的代码签名标识。例如:
local.<经过清理的用户名>.WeChatNoGame
命令形式:
codesign --force --sign "$SIGNING_IDENTITY" --timestamp=none --identifier <唯一标识> <临时副本>
不要修改 Info.plist 中原来的 CFBundleIdentifier `com.tencent.xinWeChat`,因为微信的数据路径、登录状态、子进程参数和 IPC 依赖它。这里隔离的是外层代码签名 identifier ,不是微信运行时读取的 bundle identifier 。
七、签名验收
安装前必须完成:
1. 在能够访问系统钥匙串信任库的环境里运行:
codesign --verify --deep --strict <临时副本>
必须成功。
2. 运行 codesign -dvv ,确认:
- Signature 不是 adhoc 。
- Authority 是刚创建的 Apple Development 证书,并能看到 Apple 的中间证书和根证书链。
- TeamIdentifier 不再是 `not set`。
3. 运行 codesign -dr -,确认 designated requirement:
- 包含刚设置的唯一 identifier 。
- 由 Apple Development 证书约束。
- 不能是 `cdhash H"..."` 这种 ad-hoc 形式。
4. 再次验证两个补丁位置仍为 `15 00 80 52`。
5. 注意:重签会改变 dylib 的整体哈希,因此重签完成后不要再要求它等于“未重签补丁哈希”;此时应以严格签名验证和两个位置的字节为准。
6. 如果受限沙箱里出现 `CSSMERR_TP_NOT_TRUSTED` 或 `Authority=(unavailable)`,可能只是沙箱读不到钥匙串。经我批准后在能访问系统信任库的环境中重新验证;仍失败才算真正失败。
八、安装实验版
1. 确认实验版所有进程均已退出。
2. 若 /Applications/WeChat-NoGame.experimental.app 已存在,将旧版移入本次临时目录备份。
3. 使用 ditto 把通过验证的临时副本安装到:
/Applications/WeChat-NoGame.experimental.app
4. 对安装后的路径再次执行 codesign --verify --deep --strict ,并复查 designated requirement 和两个补丁字节。
5. 官方 /Applications/WeChat.app 必须保持原哈希和原签名不变。
九、处理“录屏与系统录音”权限
首次安装稳定签名版后,请启动实验版并让我完成“进入微信”。然后由我亲自在:
系统设置 → 隐私与安全性 → 录屏与系统录音
执行以下操作:
1. 如果列表里已有旧的 `WeChat-NoGame.experimental.app`,先选中并点减号移除。
2. 点加号,重新选择准确路径:
/Applications/WeChat-NoGame.experimental.app
3. 打开它的权限开关。
4. 完整退出实验版的主进程和辅助进程,再重新启动。
5. 使用 Control–Command–A 测试微信截图。
第一次测试时可能同时出现两个窗口:前景是微信自己的“录屏权限未开启”,后方是 macOS 原生的“微信想要录制此电脑屏幕”授权框。此时先取消或移开微信自己的提示,再由我在系统授权框里点“允许”,然后再次触发截图。
不要执行不带应用标识的全局 `tccutil reset ScreenCapture`,它会清掉其他软件的录屏授权。由于我们保留了原始 CFBundleIdentifier ,而只覆盖代码签名 identifier ,针对自定义 identifier 的 tccutil 命令可能提示 `No such bundle identifier`;这种情况不要扩大重置范围,直接使用系统设置中的“移除后重新添加”流程。
十、最终验收
请和我共同确认:
- 实验版可以正常启动并进入聊天主界面。
- 左侧栏的“小程序面板”和“游戏中心”两个按钮都消失。
- 其他 tab 和聊天功能没有因为索引变化而崩溃。
- Control–Command–A 可以进入微信截图模式。
- 完整退出并重新打开实验版以后,录屏权限条目仍然存在、开关仍开启,截图仍可使用。
- codesign --verify --deep --strict 仍通过。
- 官方微信从未被修改。
十一、回滚与升级规则
1. 如果实验版异常,退出它,保留崩溃报告和签名信息,然后恢复本次临时目录中的旧实验版,或者从官方微信重新制作;不要动官方应用。
2. 微信升级会覆盖或改变 wechat.dylib 。新版本必须重新逆向定位并建立新的原始哈希、原始字节和补丁偏移。没有重新验证前,绝对不要沿用 4.1.12 的偏移。
3. Apple Development 证书通常有有效期。以后若录屏权限再次异常,先检查证书是否过期,以及重签后 designated requirement 是否改变。
执行过程中请持续告诉我当前检查结果、准备修改的准确路径和验证结论。任何版本、哈希、原始字节或签名验证不符合上述预期时,立即停止并保留可恢复状态。