<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>React on 落日余晖</title>
    <link>https://is-i7.cn/tags/react/</link>
    <description>Recent content in React on 落日余晖</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 07 Sep 2026 14:35:00 +0800</lastBuildDate>
    <atom:link href="https://is-i7.cn/tags/react/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>飞书防撤回补丁复现指南:手工 patch asar 的 19 处注入</title>
      <link>https://is-i7.cn/posts/feishu-anti-recall-patch-guide/</link>
      <pubDate>Mon, 07 Sep 2026 14:35:00 +0800</pubDate>
      <guid>https://is-i7.cn/posts/feishu-anti-recall-patch-guide/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;目标:一名工程师&lt;strong&gt;不依赖任何现成脚本&lt;/strong&gt;,仅凭本文在任何一台 macOS 机器上,对飞书(Lark.app)手工完成防撤回补丁的注入、验证与排障。
撤回机制与加密等深层逆向原理见上一篇&lt;a href=&#34;https://is-i7.cn/posts/feishu-recall-reverse-engineering/&#34;&gt;《飞书撤回消息逆向分析》&lt;/a&gt;;本文只讲&lt;strong&gt;怎么做&lt;/strong&gt;。
实测版本:143.0.7499.203(macOS,Electron/Chromium 143,补丁 v31c)。
131 及更早版本的锚点差异较大(布局都不同),但方法论完全一致,见文末「升级适配」。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0-前置条件&#34;&gt;0. 前置条件&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;项&lt;/th&gt;
          &lt;th&gt;要求&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;系统&lt;/td&gt;
          &lt;td&gt;macOS(Apple Silicon / Intel 均可),已安装飞书 &lt;code&gt;/Applications/Lark.app&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工具&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;node&lt;/code&gt;、&lt;code&gt;npx&lt;/code&gt;、&lt;code&gt;python3&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;npm 包&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;@electron/asar&lt;/code&gt;(npx 自动拉取)、&lt;code&gt;esbuild&lt;/code&gt;(语法校验用,npx 自动拉取)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;权限&lt;/td&gt;
          &lt;td&gt;能读写 &lt;code&gt;/Applications/Lark.app/Contents/...&lt;/code&gt;(默认可写)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键事实(先记住,贯穿全文)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;撤回推送会把消息 content &lt;strong&gt;一并抹空&lt;/strong&gt;(本地 DB 和前端都拿不到原文)——所以必须「渲染时存档、撤回时还原」,只改渲染布尔位只会得到空气泡。&lt;/li&gt;
&lt;li&gt;普通消息撤回的&lt;strong&gt;原生样式&lt;/strong&gt;(居中灰字「你撤回了一条消息」)来自 &lt;code&gt;featureTypeParser&lt;/code&gt; 的 RECALLED 分支;行级闸门 return 的提示条组件&lt;strong&gt;只服务话题根消息&lt;/strong&gt;(threadMessageType===1)。&lt;/li&gt;
&lt;li&gt;原生「（已编辑）」标记&lt;strong&gt;不是 richText 数据元素&lt;/strong&gt;,是富文本引擎在渲染尾部按 &lt;code&gt;message.editVersion&lt;/code&gt; 标志挂的 suffix 槽位——所以撤回标记要改引擎门槛,而不是往数据里塞元素。&lt;/li&gt;
&lt;li&gt;飞书主进程名是 &lt;strong&gt;Feishu&lt;/strong&gt;(&lt;code&gt;pgrep -x Lark&lt;/code&gt; 匹配不到);重启 = &lt;code&gt;pkill -x Feishu&lt;/code&gt; + &lt;code&gt;open -a Lark.app&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;聊天窗口与设置窗口共用 &lt;code&gt;profile_main&lt;/code&gt; 分区的 localStorage(&lt;code&gt;file://&lt;/code&gt; origin)——这是开关跨窗口生效的基础。&lt;/li&gt;
&lt;li&gt;Info.plist 里的 &lt;code&gt;AsarIntegrity&lt;/code&gt;(SHA256)校验&lt;strong&gt;实测不拦截修改后的 asar&lt;/strong&gt;(改包后正常启动,校验逻辑只记录)。&lt;/li&gt;
&lt;li&gt;开关语义:&lt;strong&gt;开&lt;/strong&gt;(默认,&lt;code&gt;frk_hide&lt;/code&gt; 不存在)= 显示原文 + 末位「（已撤回）」;&lt;strong&gt;关&lt;/strong&gt;(&lt;code&gt;frk_hide=1&lt;/code&gt;)= 完全恢复原生行为(parser 保留 isRecalled → 原生 RECALLED 居中灰字提示条,与未打补丁一模一样)。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-总流程&#34;&gt;1. 总流程&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;备份 asar(3 个) ──► 解包 ──► 定位锚点(特征串 grep) ──► 六类补丁逐文件修改
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ──► 语法校验(node --check + esbuild 双检) ──► 打包 ──► 安装 ──► 重启飞书
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ──► 验证(包内 grep 标记 → 功能测试 → 必要时读 leveldb 诊断)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;涉及的三个 asar(相对 &lt;code&gt;webcontent/&lt;/code&gt; 目录;143 起 &lt;strong&gt;messenger-next.asar 已取消&lt;/strong&gt;并入 messenger.asar):&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
