WeChat使ってますか?WeChatは主に中国の方々が使っているSNSアプリです。日本でいうところのLINEにあたるようなアプリですね。
このWeChat、LINEと同様にAndroid版、iOS版、Windows版とあります。
Windows版は便利なのですが、ログインの際にはスマートフォン版のアプリと連携し、スマホ版のアプリからPC画面上のQRコードを読み取ることで、PC版にてログインが許可される仕様です。
しかし、この仕様のため、もしスマホを落として無くしたりすると、新しいスマホを買ってWeChatを再インストールするまでPC版のWeChatにログインできなくなってしまいます。しかも、PC版のWeChatのデータベースファイルは暗号化されており、「あの時のチャットのメッセージだけでも確認したい」と思っても直接データベースファイルを開いてみることはできません。
そこで、そんな不測の事態に備えて、
WeChatPC版のデータベースファイルの復号化キーを探索して保存する
発見した復号化キーを使用してデータベースファイルを復号化する
という機能を備えたソフトウェアを作成することにしました。
ダウンロードは以下のGoogleドライブのリンク(マウスを乗せると表示される右上の矢印から進んでください)からお願いします。
※ファイルサイズが異様に大きいのはなぜ?
⇒.NETをはじめとする、アプリの実行に必要なランタイムをすべてバイナリに含んでビルドしているため、一見すると異様にファイルサイズが大きく見えています。
※なぜすべてバイナリに含む形式をとっているの?
⇒私自身、昔からフリーソフトをダウンロードしてウキウキ気分でソフトを起動しようとしたら、特定のDLL(ランタイム)が見つからなくて起動できません、というエラーを何度も見てきました。そのたびにランタイムを探してきてインストールする作業が発生していました。ダウンロードしたらすぐ使いたい!というユーザー目線を考えた結果、どんな環境でも起動できるよう、すべての必要ファイルをバイナリに含ませる形式をとることにしました。
2023/08/12
諸事情によりいったん公開停止
2023/03/07
WeChat PC Decrypterを一般公開開始しました!
2023/02/24
WeChat PC Decrypterの紹介ページを作成
※以下の内容は私の憶測を多分に含んでいます。正確な仕様を把握しているわけではありませんのでご了承ください。
上記でも書いてますが、そもそもの大前提として、WeChat PC版のデータベースファイルは暗号化されており、そのまま開いても閲覧することはできません。
では、復号化のカギはどこにあるかというと、スマホからPC画面上のQRコードを読み取ってログイン処理が行われる際に、WeChatのサーバーと通信が走った上で、32バイトの鍵が飛んできて(生成され?詳しい処理詳細はわかりません。)WeChat.exeのプロセスメモリ上に展開されることになります。(注意:この段落の文章については特に私の憶測を多分に含んでいます。)
つまり、ログイン状態のWeChat.exeのプロセスメモリからどうにかして32バイトのカギを発見すれば、データベースを復号化して中身を閲覧できるようになるわけです。
とはいっても、実際問題、プロセスメモリの中からわずか32バイトの正解を見つけ出すのは決して楽なことではありません。なんの前情報もない状態では、現実問題、発見するのは難しいでしょう。
じゃあ、前情報、何もないのかといえば、実は以下のブログにて、とても有意義な情報が公開されています。
Decrypting WeChat Messages Without Physical Possession of a Mobile Device - Nisos
要約すると、
WeChatPC版の鍵は、WeChat.exeのプロセスメモリ上に展開されている。
プロセスメモリの中でも、権限RWでかつサイズが1023のVAD内に存在している。
上記サイズ1023のVAD内において、8バイト単位でずらしながら検索していけば発見できる
ということです。この情報は極めて重要であり、この情報があったからこそ、現実的に鍵を探すことができるようになったといえます。
※なお、いろいろとネットを探索すると、OllyDbgを使用してプロセスを逆アセして鍵探索する方法が紹介されています。私も昔(1~2年ほど前)試してみたときは成功したのですが、数か月前に試したときはうまくいきませんでした。もしかしたら、最近のWeChatのバージョンではOllyDbgによる逆アセ探索はうまくいかないかもしれません。今回紹介する8バイトずらしながらサイズ1023のVAD領域のメモリを総なめ探索する方式は、今のところうまくいっています。
上記の仕様を踏まえ、以下の手順でデータベースを復号化して情報を閲覧することができるようになります。
まずは、スマホと連携してWeChatPC版でログイン状態にする
FTKImagerやその他のメモリ保全ソフトを使用して、ログイン状態のPCメモリを保全する
Volatility3を使用して、サイズ1023のVADを切り出す
本ソフト(KUMAA's WeChat PC Decrypter)を使用して、暗号化状態のデータベースファイルに対して、上記切り出したサイズ1023のVADファイルを8バイトずつずらしながら鍵を検索し、発見する
発見した鍵を使用して、暗号化されたデータベースファイルを復号化する
復号化されたデータベースファイルを任意のSQLiteデータベース閲覧ソフトで閲覧する
という流れになります。なお、1~3まではあくまでもユーザーの皆様で事前に準備しておいていただく必要があります。本ソフトはあくまでもWeChat.exeがログイン状態の際のメモリが保全されていることが前提となっているソフトです。
鍵を探索する機能です。
暗号化状態のデータベースファイルに対し、プロセスメモリから切り出したVADファイルを設定したバイト数(デフォルト8バイト)ずつずらしながら復号化処理を試行し、32バイトの鍵を探索します。
なぜわざわざプロセスメモリ全体ではなく、1023のVAD領域を切り出すかといいますと、この処理は実際のところはかなり負荷が高く、探索に時間を要するからです。高性能なCPUを搭載している場合は、設定画面で探索時並列コア数を増やすことで、少しは時間短縮が見込めるかもしれません。
なお、私の環境では、サイズ1023のVAD領域を切り出して検索したところ、そのファイルサイズは2048KBであり、2048KBの中から鍵を発見するのにかかった処理時間は概ね1時間前後でした。
RyzenスリッパCPUのような、地平線の彼方を目指すCPUを積んでいる人は、プロセスメモリ(を1バイト単位ずらしで)全検索でも現実的な時間で検索完了するかもしれません。
鍵を発見した場合、この機能を用いてデータベースファイルを復号化できます。
データベースファイルが格納されているフォルダー(%USERPROFILE%\Documents\Wechat Files\<wxid_xxxxxxxxxxxxxx>\Msg)を選択すると、自動的に選択フォルダ以下の.dbファイルを候補として列挙します。(言い換えると、フォルダ内の「.db」という拡張子を持つファイルしか対象としません。)
ただ、これだとあまりにもアレな感じの仕様なので、対象ファイルのテキストボックス領域に、ファイルを直接D&Dすることでも復号化対象のファイルを追加できるようにしています。
アプリケーション設定画面です。
基本的に、言語設定と探索時並列コア数以外は変える必要がありません。
今後、PC版WeChatの仕様が変わった場合にも対処できるように、各種変数を手動で設定可能なようにはしてあります。