~/field-notes — leeguoo@misonote — zsh EN 中文 ● 日本語
❯ field-notes v3.4.1
leeguoo@misonote:/ja/posts/chasing-wechat-versions/ $ 記事

# WeChatのバージョンと競走する:あるローカルツールの適応史

macOS上のWeChatをAI agent向けのローカルインターフェースにするうえで、いちばん難しいのは最初に動かすことではなく、WeChatが何度も更新されたあとも生き残らせることです。データベースkeyを取るための三世代の方法、バックグラウンド送信でルーティングをどう変えるか、そして本当にバージョンをまたいで再利用できるのは「探し方」であって、特定のアドレスではない理由について話します。

2026年6月12日 · 記事 · 公開 · 記事

このページの目次

わたしたちは、macOS じょうあなた自身じしんWeChatを、AI agent / スクリプトようのローカルインターフェースにするツールをつくりました。メッセージ送信そうしん会話かいわ検索けんさく履歴りれきりを、すべてあなたのMacじょうおこない、クラウドにはげず、iPadプロトコルも使つかいません。

はじめてうごいたは、かなり達成感たっせいかんがありました。するとWeChatが更新こうしんされました。

バージョンのランニングマシンでWeChatを追う

バージョンはいつもまえはしっている

ツールの原理げんりは、WeChatのローカルデータベースを直接ちょくせつみ、メモリないでいくつかの重要じゅうよう関数かんすうとフィールドを特定とくていすることです。問題もんだいは、それらの「ものがどこにあるか」がすべて特定とくていのバージョンに依存いぞんしていることです。WeChatのちいさなバージョン番号ばんごうがるたびに(4.1.8 → 4.1.9 → 4.1.10)、コンパイルされたバイナリでは関数かんすう位置いち移動いどうしたり、構造体こうぞうたいフィールドのオフセットがわったりする可能性かのうせいがあります。普通ふつうのユーザーにはまったくかりませんが、わたしたちにとってはそのうごかなくなるということです。

だからこのプロジェクトの日常にちじょうは「新機能しんきのうつくる」ことではなく、ことです。ランニングマシンのうえちいさなひとはまさにわたしで、みどりしはいつもとどかないまえにあります。

更新こうしんするとすぐこわれる、しかもよくしずかにこわれる

更新するとばらばらになる小さなロボット

さらに刺激的しげきてきなのがサイレントホットアップデートです。WeChatはバックグラウンドで中核ちゅうかくコンポーネント(すべてのロジックをになうあの動的どうてきライブラリ)をあたらしいバージョンにえますが、ダイアログは一切いっさいません。あさ正常せいじょうだったのに、午後ごごにはスクリプトがエラーをはじめる。そしてバイナリがすでにえられていたことに、あなたはまったくづいていません。毎回まいかい調査ちょうさでは、まず「またホットアップデートされたのか?」を確認かくにんしなければなりません。

これによって、わたしたちが最初さいしょにやらざるをなかったことは、むしろ**自動じどうホットアップデートをめる**ことでした。更新こうしんパスをロックし、現在げんざい適応てきおう夜中よなかにこっそりこわされないようにして、安定あんていして作業さぎょうできる時間じかん確保かくほするためです。

keyをる:WeChatにせまられて進化しんかした三世代さんせだい方法ほうほう

鍵穴に合わない鍵

WeChatのローカルデータベースはSQLCipherで暗号化あんごうかされているため、データをむにはまず32バイトのなまかぎれる必要ひつようがあります。この部分ぶぶんでは三世代さんせだい方法ほうほう使つかえました。どの世代せだいあたらしいバージョンにせまられてまれたものです。

第一世代だいいちせだい——ヒープないかぎテキストをスキャンする。 SQLCipherがデータベースを復号ふくごうするとき、PRAGMA key = "x'……'" のようなぶん実行じっこうします。初期しょきバージョンでは、この16進数しんすうかぎテキストがプロセスのヒープにのこっていました。プロセスメモリを直接ちょくせつスキャンし、このかたちにマッチさせればkeyをひろえました。4.1.9ではまだ使つかえました。

第二世代だいにせだい——バイナリかぎをスキャンし、ページヘッダーのHMACで検証けんしょうする。 WeChatがかぎ平文へいぶんテキストとしてヒープにのこさなくなると、第一世代だいいちせだい使つかえなくなりました。そこで次善策じぜんさくとして、ヒープないの32バイトごとの断片だんぺんをすべて候補こうほかぎとみなし、データベースの最初さいしょのページのHMACで検証けんしょうしました(SQLCipherはページごとにHMAC検証けんしょうっており、かぎちがうととおりません)。検証けんしょうとおったものが本物ほんもののkeyです。問題もんだいは4.1.10になると、数百すうひゃくMBのヒープと数百万すうひゃくまん候補こうほをスキャンしても、HMACのヒットすうゼロだったことです。平文へいぶんかぎはそもそもヒープにありませんでした。しかも一回いっかいスキャンするのに数十分すうじゅっぷんかかり、実用的じつようてき方法ほうほうとはえないほどおそいものでした。

第三世代だいさんせだい——システム暗号あんごう関数かんすうにブレークポイントをく。 発想はっそう転換てんかんはこうです。かぎはヒープにはないが、どこかをかならず「ながれる」。SQLCipherの下層かそうではmacOSシステムのCommonCryptoが使つかわれており、データベースを復号ふくごうするたびに CCCryptorCreateんでAESコンテキストをつくります。そしてこのシステム関数かんすうのシンボルはけずられていません。そこにブレークポイントをき、かぎちょうが32のとき、引数ひきすうないのそのポインタがしているものがkeyです。これなら一発いっぱつつかまえられます。

4.1.10では、ついでにかぎモデルもわりました。「1つのマスターかぎ」から、データベースごとに1つ(per-DB key)になったのです。だからWeChatにかくデータベースを一度いちどずつ復号ふくごうさせないと、ブレークポイントでかぎ全部ぜんぶつかまえられません。

この一言ひとことえば、おおきなバージョンがひとがるたびに、かぎかくかたわり、ふる方法ほうほう鍵穴かぎあなまえでいつもほんのすこしだけわない、ということです。

バックグラウンド送信そうしん:「これはだれおくるか」をえる必要ひつようがある

メッセージ送信そうしんはデータをむよりずっとむずかしいです。わたしたちがしいのは、完全|かんぜん}にバックグラウンドで、あなたのマウスフォーカスをうばわずにメッセージをおくることです。そこでけてとおれない問題もんだいがあります。WeChatは、このメッセージをどの会話かいわれるべきかをどうるのか、ということです。

メモリないには、「現在げんざいこのメッセージをだれおくるか」を記録きろくしているフィールドがあります。バックグラウンド送信そうしんかんがかたは、送信そうしんチェーンのどこかのブレークポイントで、このルーティングフィールドをわたしたちの目標もくひょうえ、下流かりゅうがそのあたらしいあたいしたがってメッセージをげるようにすることです。いくつものバージョンで、この通用つうようしました。

4.1.10でまりました。しかもとても勉強べんきょうになるまりかたでした。わたしたちは特徴とくちょうをたどって「これはルーティングwxidにえる」というフィールドをつけ、それをえました。ところがメッセージは相変あいかわらずもと会話かいわはいりました。あとでようやくかったのは、そのフィールドは**まれるコピー**(あるsetterがそこにれるもの)であって、下流かりゅうがルーティングをめるために実際じっさい場所ばしょではない、ということです。コピーをえても、みなもとはそのままです。本当ほんとうのルーティング地点ちてんは、まだつかっていません。

本当ほんとう再利用さいりようできるのは、位置いちではなく方法ほうほう

いくつものバージョンをってきて、もっとも価値かちがある経験けいけんはこれです。

あなたが記録きろくしたすべての「具体的ぐたいてきなアドレス、オフセット、バージョン指紋しもん」は、つぎのバージョンではほぼすべて使つかえなくなる。バージョンをまたいでのこるのは、「どうやってものをつけるか」という方法ほうほうだけです。

具体的ぐたいてきなに再利用さいりようでき、なにかなら使つかえなくなるかは、だいたいこうです。

  • かなら使つかえなくなるもの:ハードコードされた関数かんすうアドレス、フィールドオフセット、バイナリ指紋しもん——Tencentが一度いちどならえればすべて期限切きげんぎれになります。
  • 再利用さいりようできるもの特徴的とくちょうてき命令めいれいシーケンス関数かんすう特定とくていすること(たとえば、ある関数かんすう本体ほんたいにとても独特どくとく命令めいれいが1つあり、バイナリ全体ぜんたいでそこにしかないなら、それをたよりにあたらしいバージョンでもその関数かんすう再発見さいはっけんできる)。関数かんすうサイズ + しチェーンのトポロジー指紋しもんつくること(Tencentのホットアップデートは位置いちだけをうつし、関数かんすう本体ほんたいえないことがおおいため、サイズとかたちはバージョンをまたいで対応たいおうしやすい)。そして**構造的こうぞうてき教訓きょうくん**——うえの「setterのコピーは本当ほんとうのルーティング地点ちてんではない」のような認識にんしきは、ずっとやくちます。

だから本当ほんとうほりは、ある一回いっかい解析かいせき結果けっかではなく、げてきた**ものをさが技術ぎじゅつ**です。結果けっか期限切きげんぎれになりますが、技術ぎじゅつ期限切きげんぎれになりません。

いまどこまでのぼったか

山の中腹:読み取りは通ったが、送信はまだ越えられていない

最新さいしんの4.1.10について正直しょうじきうと、こうです。

  • りはとおった——第三世代だいさんせだいのkey取得しゅとく方法ほうほう(CommonCryptoにブレークポイント)により、会話かいわ履歴りれき連絡先れんらくさき正常せいじょうれます。
  • 送信そうしんはまだえられていない——うえの「本当ほんとうのルーティング地点ちてんがまだつかっていない」段階だんかいまっています。

なかはたて、チェックがいているやま中腹ちゅうふく現状げんじょうです。山頂さんちょうあかいバツは、まだのぼっている部分ぶぶんです。「全部ぜんぶ完了かんりょう」とはよそおいません。こういう、他人たにんのアプリ内部ないぶ構造こうぞう適応てきおうでは、永遠えいえんつぎのバージョン、つぎやまがあります。

最後さいご

位置いちづけはずっとわっていません。ローカル優先ゆうせん、クラウドにげない、データは完全かんぜんにあなた自身じしん手元てもとにある。これは *-use シリーズの一員いちいんです(ほかにprofile-use、iphone-useがあります)。どれも、agentがあなたのローカルにある本物ほんもののツールを直接ちょくせつ操作そうさできるようにするもので、データを他人たにんのサーバーへうつすものではありません。

コード、インストール方法ほうほう、できることの範囲はんいはすべてリポジトリにあります:github.com/leeguooooo/wechat-use個人こじん / 研究けんきゅう用途ようとかぎります——商用しょうよう一斉送信いっせいそうしん他人たにんのアカウントの自動化じどうかは、いずれもサポート範囲はんいがいです。

バージョンをうことはまだつづきます。つぎやまいましょう。

次の記事 →
ステータスバーのあの cache 4m23s は、結局正確なのか?

コメント

コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。

最大 1000 文字。

    ⎇ main ● 0 errors · 0 warnings UTF-8 Markdown /ja/posts/chasing-wechat-versions/ © 2026 leeguoo