飞书防撤回补丁复现指南:手工 patch asar 的 19 处注入
目标:一名工程师不依赖任何现成脚本,仅凭本文在任何一台 macOS 机器上,对飞书(Lark.app)手工完成防撤回补丁的注入、验证与排障。 撤回机制与加密等深层逆向原理见上一篇《飞书撤回消息逆向分析》;本文只讲怎么做。 实测版本:143.0.7499.203(macOS,Electron/Chromium 143,补丁 v31c)。 131 及更早版本的锚点差异较大(布局都不同),但方法论完全一致,见文末「升级适配」。 0. 前置条件 项 要求 系统 macOS(Apple Silicon / Intel 均可),已安装飞书 /Applications/Lark.app 工具 node、npx、python3 npm 包 @electron/asar(npx 自动拉取)、esbuild(语法校验用,npx 自动拉取) 权限 能读写 /Applications/Lark.app/Contents/...(默认可写) 关键事实(先记住,贯穿全文) 撤回推送会把消息 content 一并抹空(本地 DB 和前端都拿不到原文)——所以必须「渲染时存档、撤回时还原」,只改渲染布尔位只会得到空气泡。 普通消息撤回的原生样式(居中灰字「你撤回了一条消息」)来自 featureTypeParser 的 RECALLED 分支;行级闸门 return 的提示条组件只服务话题根消息(threadMessageType===1)。 原生「(已编辑)」标记不是 richText 数据元素,是富文本引擎在渲染尾部按 message.editVersion 标志挂的 suffix 槽位——所以撤回标记要改引擎门槛,而不是往数据里塞元素。 飞书主进程名是 Feishu(pgrep -x Lark 匹配不到);重启 = pkill -x Feishu + open -a Lark.app。 聊天窗口与设置窗口共用 profile_main 分区的 localStorage(file:// origin)——这是开关跨窗口生效的基础。 Info.plist 里的 AsarIntegrity(SHA256)校验实测不拦截修改后的 asar(改包后正常启动,校验逻辑只记录)。 开关语义:开(默认,frk_hide 不存在)= 显示原文 + 末位「(已撤回)」;关(frk_hide=1)= 完全恢复原生行为(parser 保留 isRecalled → 原生 RECALLED 居中灰字提示条,与未打补丁一模一样)。 1. 总流程 备份 asar(3 个) ──► 解包 ──► 定位锚点(特征串 grep) ──► 六类补丁逐文件修改 ──► 语法校验(node --check + esbuild 双检) ──► 打包 ──► 安装 ──► 重启飞书 ──► 验证(包内 grep 标记 → 功能测试 → 必要时读 leveldb 诊断) 涉及的三个 asar(相对 webcontent/ 目录;143 起 messenger-next.asar 已取消并入 messenger.asar): ...
京公网安备11010602203188号