line 某種程度也是蠻厲害的, chrome app 版的聊天記錄全存在 indexed db 裡,然後 dump 出來都是加密的,大部份 value 和一些 key 都是加密過的 binary string 。
不知道是在防賊還是防使用者……。
解出來了……,這東西傳輸中是 e2ee ,存進 indexeddb 前則是用單純的對稱式加密,所有資料用同一個 key ,解起來其實蠻簡單。
還好不是一個 chat 一個金鑰,那要逆向就累人了。
有空再來分享怎麼做。
順便分享好物,簡單匯出整個 indexeddb 資料的 snippet 。我用這東西把 line 的整個 indexeddb dump 出來再解密的。
https://gist.github.com/loilo/ed43739361ec718129a15ae5d531095b
簡略的筆記:
偵錯 src/QpKtH.js 這個檔案,prettyfy前約3.1MB, 後約4MB的。
先把妨礙 debugger 正常運作的反偵錯關掉,
在 49715行附近找到如下程式:
!j['test'](l + 'chain') || !k['test'](l + 'input') ? l('0') : a();
在他之前下中斷點,把a的返回值換成無意義函數:
`a = () => a`
這樣反偵錯就關掉了。
寫不下了,見下一篇
把indexeddb倒出來,用上面說的那段腳本,
可以先dump成object就好,不用轉json。
假設存在 idbDump 。
約86778行,找到 `'decryptByDBResult': function(d) {` 這段,
下中斷點在函數定義裡,
可以直接用這裡的 c.decrypt 和 this.key。
```js
var idbDumpPlain = {}
for (const k in idbDump) {
idbDumpPlain[k] = c.decrypt(this.key, idbDump[k])
}
```
結果轉json再轉blob再生object url再用 `<a download>` 載下來,
如果要依聊天室分類訊息的話要再做一些加工。
@gholk@g0v.social 看起来是很好的设计,不然天朝政权直接突袭扣押你还在使用的笔记本电脑,查看离线保存的聊天记录,什么通信中端到端加密都防不住。电脑上的数据就是在运行中、解密的状态下才是最危险的。
@neoatlantis 我用 debugger 解的,沒看資料怎麼存的。理想的話金鑰應該是要用使用者的密碼加密再存進硬碟,或是直接拿使用者密碼當金鑰。
line 在隱私保護上有 e2ee 是不錯,就是整體做的太糟了,慢又肥大,把一堆功能都捆綁進去,轉移資料也很麻煩。
台灣的比較懂技術的使用者多有抱怨,以下歡迎幹譙:
https://g0v.social/@HybridGlucose/109911673738939994