iPhone LINE SQLite
資料庫分析與語法操作

專案探討

2020-5-6 by 高田鑑識

若各位鑑識同仁還有印象,上一篇有關 SQLite 介紹是針對 WAL 檔案的分析說明。而本篇內容會回歸到資料庫的基本架構與語法介紹,採用的資料庫範本為資料量最大的 LINE 資料庫。藉由逐步拆解 LINE 資料庫的資料表與紀錄等資訊,並透過 SQL 語法將資料庫的內容依聊天群組,訊息留言數量等條件彙整並輸出報表,可讓鑑識同仁對於資料庫的架構與資料儲存模式有基礎了解。未來若有其他 APP 尚未被 Physical Analyzer 支援,可藉由本篇介紹方式先進行初步分析,可能會取得重要證據。

LINE 資料庫內容說明

資料庫中最重要的物件就是資料表 (table),資料庫由一個或一個上的資料表所構成,每個資料表名稱在資料庫中都是唯一的,資料表中每一直行 (column) 稱之為欄位,每個欄位都有其資料型態 (data type),由不同欄位所組成的橫列 (row),稱之為記錄 (record)。

以下為資料範例,內由 5 個欄位組成,內共包含 2 筆記錄。

圖一、ZMESSAGE 資料表範本

LINE的資料庫檔案名稱為 Line.sqlite,可透過 4PC 或 PA 將該檔案匯出至電腦進行分析。對於想要進一步研究的鑑識同仁,若有一台測試的 iPhone 裝置,可藉由 checkm8 越獄,加快 LINE 資料庫的檔案提取,以下為小編測試時所用的指令,也給各位參考。

複製

以上指令是藉由 Dropbear SSH 服務從電腦透過 USB 連線到越獄的 iPhone 裝置,詳細細節可以參考「如何使用checkra1n提取iOS檔案系統」說明。另需注意的是,當 APP 安裝後,在 /AppGroup 下的資料夾名稱皆不一樣,可透過 PA 或從 Cydia 上安裝 Filza 確認正確的資料夾名稱。

而以下指令解壓縮 TAR 檔案時可以將前置資料夾名稱忽略,精簡檔案開啟流程。

複製

取得 LINE 資料庫檔案後,需透過資料庫瀏覽程式方可分析資料庫內的資訊,本篇文章使用「DB Browser for SQLite」。

程式為免費軟體,下載路徑:https://sqlitebrowser.org/dl/

打開 LINE 資料庫後可以看到共 19 個資料表 (Table),其中 5 個資料表對於數位鑑識有直接的幫助,其餘的資料表因紀載的資訊對於聊天訊息無關,多為屬性資料,可先忽略。

# 資料表 內容
1 Z_PRIMARYKEY 各資料定義與總數一覽表
2 ZUSER LINE 朋友清單
3 ZCHAT 聊天室與各聊天室最後一則訊息清單
4 ZMESSAGE 所有聊天訊息內容,通常也是最大的資料表
5 ZGROUP 聊天群組清單

表一、LINE 重要資料表

以下資料表,Z_PrimaryKey、ZMESSAGE、ZCHAT、ZGROUP、ZUSER 透過「DB Browser for SQLite」開啟,本篇的分析重點會以這些資料表為主。需注意因畫面寬度限制,有部分較不重要的欄位有隱藏,以利閱覽。

圖二、各資料表截圖

LINE 資料類別定義 – Z_Primarykey

以下為 Z_PrimaryKey 資料表的內容,從這個資料表可以反推出 LINE 的使用全貌。Z_ENT 與 Z_NAME 欄位可得知其他資料表內的每一筆紀錄所屬的類別。例如 Z_ENT = 5 的紀錄為聊天訊息,Z_ENT = 1 為聊天室。而從 Z_MAX 可知道一共有 196,850 則聊天訊息, 1,000 個聊天室,65 個聊天群組,並有 2,568 位 LINE 好友。

Z_ENT Z_NAME Z_SUPER Z_MAX
1 Chat 0 1000
2 ChatMetadata 0 955
3 Contact 0 0
4 Group 0 65
5 Message 0 196850
6 MessageMetadata 0 0
7 Metadata 0 0
8 MyHomeGroup 0 0
9 Notification 0 75
10 SNS 0 0
11 StickerPackage 0 8533
12 User 0 2568

表二、Z_Primarykey 資料表內容

LINE 好友資訊 – ZUSER

ZUSER 資料表內有超過 30 個欄位,如在 Z_Primarykey 資料表內所定義,ZUSER 內的紀錄皆為 USER 類別,故 Z_ENT 欄位數值皆為 12。以下為包含較重要資訊的欄位說明。

欄位名稱 欄位說明
ZADDRESSBOOKNAME LINE 好友在手機聯絡人內的名稱
ZNAME LINE 好友名稱
ZMID LINE Server 給予每個用戶的唯一 ID
ZBLOCKING 此欄位若為 1 ,代表該好友被使用者封鎖
ZISFRIEND 此欄位若為 0,代表尚未是好友

表三、ZUSER 資料表欄位摘要

LINE 聊天訊息內容 – ZMessage、ZCHAT 、ZGROUP

從數位鑑識的角度來看,若有辦法重建與 LINE 好友的完整聊天訊息內容,對於案情脈絡可有較高的掌握。當取得到 LINE 資料庫後,可以從 3 個資料表內提取並重建所有聊天訊息,對象,時間等內容。

ZMessage 資料表

該資料表內包含所有發出與收到的聊天紀錄,也是資料量最多的表。以下為幾個重要欄位的說明,除了最重要的訊息內容 ZTEXT,其中 ZCHAT 與 ZSENDER 欄位內的資訊可關聯到另兩個資料表,可對應出該則聊天訊息的群組與好友對象。

欄位名稱 欄位說明
Z_PK 資料表的主Key,隨著紀錄的增加自動 +1
Z_ENT 依 Z_PrimaryKey 內的定義,類別 5 為 Message (訊息)
ZTIMESTAMP 該則訊息發出或收到的時間戳
ZCHAT 該值可對應出這則訊息所屬的聊天室,可以是一個好友或一個群組
ZSENDER 該值可對應出這則訊息所發的好友,若為 Null 則是使用者發出
ZLATITUDE 緯度資訊
ZLONGITUDE 經度資訊
ZID 聊天紀錄的唯一 ID
ZTEXT 聊天訊息內容

表四、ZMESSAGE 資料表欄位摘要

ZCHAT 資料表

ZCHAT 內記載著所有聊天室的最後一則訊息,從這個資料表可得知使用者聊天的對象。

欄位名稱 欄位說明
Z_PK 資料表的主Key,可對應 ZMessage.ZCHAT
Z_ENT 依 Z_PrimaryKey 內的定義,類別 1 為 CHAT (聊天室)
ZLASTUPDATED 該聊天室收到最後一則訊息的時間戳
ZLASTMESSAGE 該聊天室最後一則訊息內容
ZMID LINE 好友或聊天族群唯一 ID

表五、ZCHAT 資料表欄位摘要

ZGROUP 資料表

ZGROUP 內記載著所有聊天室群組的資訊。

欄位名稱 欄位說明
ZID 聊天室群組的唯一 ID,由 LINE Server 產生,可對應 ZCHAT.ZMID
ZNAME 聊天室群組名稱

表六、ZGROUP 資料表欄位摘要

ZMessage 與 ZUSER 資料表對應好友名稱

若各位鑑識人員開啟 ZMESSAGE 資料表,可從表內的 ZTEXT 欄位看到所有的訊息內容,但無法直接從該表得知訊息是由哪一位好友發出。因為紀錄著好友資訊的 ZSENDER 欄位只有數值,該數值需與 ZUSER 資料表內的 Z_PK 欄位進行關聯性對應才可得知好友名稱。

圖三、訊息與好友對應關聯性

以上為精簡後的資料表關聯圖。而透過這樣的方式進行關聯,也是資料庫格式的特性。以該範例,LINE 資料庫內有超過 10 萬筆的聊天訊息,而可能圖中的 「AYi」 佔了一萬筆。假設好友名稱紀錄是設計在 ZMESSAGE 表內,而有一天 AYi 更改了名稱,代表著 ZMESSAGE 內的一萬筆紀錄的名稱全部都要更改,這會導致不必要的資料存取,也會降低使用者體驗。而好的設計是有另一個資料表,如 ZUSER,好友名稱更改後只會更新一筆在 ZUSER.ZNAME 的紀錄,與其更新一萬筆紀錄,這樣的資料庫結構設計可大幅降低不必要的資源浪費。

ZMessage、ZCHAT、ZGROUP資料表對應聊天群組

當我們要分析訊息是屬於哪一個聊天群組時,同樣也需要進行資料表關聯性連結。從 ZMessage 下的 ZCHAT,需對應另外兩個表才會得知訊息是一對一的聊天,還是屬於聊天群組。

圖四、訊息與聊天群組關聯性

而透過以上的關聯性,可將任一訊息進行歸納。

SQLite 語法

當了解 LINE 資料庫結構後,可透過 SQL 語法依需求篩選出內容。以下為影片的基本操作介紹與幾個常用語法。若有更進一步的需求,可透過紛絲專頁與我們互動喔~

DB Browser for SQLite 示範影片

列出聊天室 ID 與好友的每則留言

執行語法後會列出四個欄位內容, ZMESSAGE 資料表下的 ZCHAT 聊天室 ID,ZUSER 資料表下的 ZNAME 好友名稱,ZMESSAGE 下的聊天內容與時間戳。而透過 LEFT JOIN 連接語法,可連接 ZUSER 表檢索好友名稱。

需注意好友名稱若為「Null」,代表該則訊息為本人發出。

複製

語法一

輸出結果

列出與各好友聊天訊息總數量

執行語法後會列出四個欄位內容, 因採用 Group 語法將依聊天室與好友彙整,結果會出現聊天室 ID、好友名稱與總訊息數。

複製

語法二

輸出結果

各聊天群組總留言數量

執行語法後會列出五個欄位內容, 因採用 Group 語法與連接了 ZGROUP 資料表,結果僅會出現聊天群組的名稱、UID、成員數與總訊息數。

複製

語法三

輸出結果

列出單一聊天室的所有留言

在語法內, 倒數第二行的 where ZCHAT = ID,變更 ID 數值即可列出不同的聊天室內容。該值來至於 ZMESSAGE.ZCHAT 並與 ZCHAT.Z_PK 連動,每一個數值代表一個聊天室或聊天群組。LINE 系統預設聊天室的值為 1 。

複製

語法四

輸出結果