2021年7月29日 星期四

解鎖舊版 Line 聊天室備份

 

前幾天有人開記者會,宣稱一缸子達官顯要的 Line 遭駭客入侵,一定是老共陰謀云云。此事無關緊要,卻讓我想起一樁天寶遺事。若干年前頭一次從 Android 換機到 iPhone, Line當然也要跟著搬家。不料一步踏差,竟然杯具。

「真的很差勁,備份半天,android 的聊天室被它刪光,才說沒辦法搬到 iPhone 。備份還鎖碼看不到。氣死。」

當時留下這句話,熟悉舊日 Line 換機程序的,大概知道發生什麼事。其實我原本有備份習慣,大約每兩個月一次吧!真正損失的對話不到一個月。一般來說雞毛蒜皮廢話居多,沒什麼保存價值,然而那當口正有要事發生,不留記錄難以安心。找了一兩個解鎖軟體不管用,只好暫時把鎖碼的備份封存,留待日後。

這會兒勾起陳年往事,從保險櫃把舊檔案挖出來,再上網搜尋工具。很開心地,發現有位駭客女孩 Emma 在 GitHub 上的原始碼,以暴力法敲開 Line備份的鎖,一試就靈。後續當然還有些收尾工作,為免將來居然還得再玩一次,在此做個筆記。

Line 備份解鎖

第一步,先下載 bovarysme / memories 的原始碼,語言是我不熟悉的 GO ,因此還要下載安裝 GO 的工具環境

接下來打開終端機(命令提示字元),再參看原始碼中 README.md 的說明,一步步照做即可。只是對於不熟悉 GO 語言的人,說明中漏了一項預備動作:

Run 'go mod init github.com/bovarysme/memories' to create a go.mod

有了 go.mod, 後續編譯才能進行。我是執行:go build main.go,然後得到 main.exe。假如開心的話,將之改名為 memories.exe 以符合文件說明,不然直接執行也是可以:

main -bruteforce -source <path to the encrypted chat db>

README.md 有提到,Line備份是個 ZIP 檔,本身沒有加密,可直接解開。鎖上的是展開後的

linebackup/chat/chat<id>, 也就是解鎖標的。

其中 <id>是一串數字,代表聊天室。文中簡單介紹解鎖原理,其中關鍵是:對話雙方各由一個32-bit 的內部 ID 代表,這兩個 ID 合起來,做為加密演算法的金鑰。問題在於內部 ID 純供程式運作,使用者介面上任何地方都不會看見,也就無從得知,因此只能運用暴力法把它找出來。

過程便省略了。視機器等級,運算時間可能從幾分鐘到幾十分鐘不等,耐心就是。產出結果是個 SqLite 格式的資料庫檔,估計以之取代原先上鎖的檔案,應該可以在舊版 Line 匯入。駭客女孩 Emma 的工作到此為止。

註: linebackup/image 裡面存有圖片,副檔名 .thumb 是縮圖,沒有副檔名的是原圖,直接加上 .jpg / .png / .gif 就可以看,沒有上鎖,只是格式得猜一猜。

SqLite 轉 CSV

可是版本的確舊了點,這麼多年過去,新版 Line 已經取消匯入功能,擔心硬搞可能發生意外。另一方面,我只要還原文字對話即可,貼圖之類東西,丟掉就算了。因此多花了點功夫,把它轉成 text 檔。這又分成兩個步驟。

首先將 SqLite 檔中的資料匯出,成為 CSV 格式,以便後續處理。所需工具由 SqLite 網站下載,尋找存有 'command-line shell' 的那一包,解開即可在終端機操作。

為了匯出所需資料,必須瞭解資料庫檔(chat<id>.sqlite)中有那些表格(table),分別有什麼欄位(field)。具體操作請看線上說明,不詳細介紹。為了方便,我將轉檔用的必要指令寫成 script(toCsv.sql),免得重複敲鍵盤。

以下是toCsv.sql的內容:

.headers on
.mode csv
.output chat<id>.csv
.open chat<id>.sqlite
SELECT created_time,from_mid,content,type from chat_history;
.quit

其中 chat<id>.sqlite 是上面解鎖後的成果,chat<id>.csv 則是這次匯出的檔名。chat<id> 只是範例,必須改成實際的檔名。

chat_history 是表格名稱,created_time(發訊時間),from_mid(發言人的 ID),content(文字內容), type (這筆記錄的屬性) 都是欄位名稱。表格和欄位不只這些,但若只需要文字對話,這樣就夠了。

所有檔案最好都放在同一目錄,然後在終端機執行:

sqlite3 < toCsv.sql

產出結果便是 chat<id>.csv。

註: '.tables'  指令列出所有表格名稱;把  toCsv.sql 當中SELECT那行,改成  'SELECT * from chat_history;' ,執行後在CSV檔第一列,可以看到所有欄位名稱;若有興趣分析內容,把CSV檔送進試算表軟體,會易讀得多。

CSV 轉 Text

其次寫一段小程式,將 CSV 轉成 text 格式再存檔。原始檔放這裡,是 C# 語言,簡單直觀,有興趣請自行下載,以下重點說明。

生成的執行檔可以接受一個參數,即 CSV 檔所在路徑;若無參數,則採用現行目錄。然後掃瞄目標區所有 CSV 檔,逐一讀取,並輸出 text檔。

為求簡便,並沒有處理CSV檔第一列的欄位名稱,而是武斷地依照 toCsv.sql 所列欄位順序,處理所有資料。有意修改的話,請自行留意。

第一欄 created_time 是個數字,代表自 1970/1/1 零時整起算的 millisecond 數,是 GMT 時間,所以要加計時區差。以台灣來說,是 GMT+8。

第二欄 from_mid 是發話者代碼,可自行置換成適當的稱呼,由文字內容應該不難分辨是誰(幫不了你)。空字串表示是自己。

第三欄 content 即文字內容,照抄即可。空字串表示是圖片,須參考被我忽略的其他欄位(猜想是 'id'),應該與前面說的 linebackup/image 相關,有興趣請自行研究。

第四欄 type即屬性代號,目前只看到 1, 4, 5 三種。1代表文字內容,看第三欄 content;5代表貼圖,應該不容易恢復,直接輸出 "[貼圖]" 拉倒;4比較囉唆,代表通話狀態,變化很多,後來覺得反正語音不可能恢復,懶得研究,一律顯示 "通話時間 nn:nn" 算了。

如此產生的 text檔,相當接近 Line 的匯出格式,就可以合併存檔了。

最後,倘若你有同樣困擾,工具都在上面,請自行下載運用。若無法自己處理,請找一位信得過又有程式設計經驗的人幫忙。因為這種事涉及隱私,我一點都不想沾惹,絕對不要找我





 



《以下留言與回覆,來自 聯網

01.  Olivia 隨心所欲  2021/08/02 10:00

好笑絕對不要找我!!經典!!

我們這種電腦白痴,最怕電腦或手機出問題了,所以當初換手機一直在考慮封閉的蘋果或開放的安卓,最後考慮不求人,還是用習慣的就好烏雲飄過


格主於 2021/08/02 12:51回覆

寫這種東西,肯定有不認識的,經由估狗找上門來。若是無聊廢話,丟掉就算了,需要解鎖的通常私密。要人解鎖又怕偷看,這種葷腥我才不沾。奸笑


02.  感動的人  2022/01/12 15:01

你真是太棒了!

終於可以看以前備份的聊天紀錄了,

都是一些珍貴的回憶,

感謝您!!!


格主於 2022/01/12 16:08回覆

很高興能幫到你大笑


03.  D4C  2022/02/01 13:58

第一個步驟就完全看不懂Q(sundiq@hotmail.com) 

格主於 2022/02/07 16:53回覆

請參考末段:「倘若你有同樣困擾,工具都在上面,請自行下載運用。若無法自己處理,請找一位信得過又有程式設計經驗的人幫忙。

沒有留言:

張貼留言