從WhatsApp的備份數據庫中提取消息

本文我將為大家介紹如何使用Python從WhatsApp恢復消息。並且我會著重解釋如何從WhatsApp的sqlite數據庫中查找和提取對話,並解析那裡的字段和數據。這絕不是一項全面的逆向/取證分析的工作 – 我寫這篇文章的唯一原因是,目前我並沒有找到一個你可以信任的可用於此目的免費信息和/或開源工具。所以我想如果我能分享我所做的工作,那麼將可以為他人節省一些時間。你可以使用與之相似的過程來分析其他的(messaging)應用程序。

本文我將使用Jupyter Notebooks和Pandas,但幾乎所有代碼都可以獨立於Jupyter使用。用於從WhatsApp sqlite DB中提取消息的代碼(專為Jupyter notebook編寫),你可以在github獲取到。

背景

由於房地產開發商的一些法律問題(有誠實的開發商嗎?)我需要從一個放在壁櫥裡兩年的舊iPhone設備中恢復whatsApp信息。

我不是正常的iPhone用戶,所以我開始想辦法來做到這一點,我發現iCloud並沒有賦予訪問實際備份內容的權限。不過這裡有一些工具可以幫助你獲取登錄憑證,並允許你瀏覽完整的備份內容,但是我不想將我(妻子)的登錄憑證透露給這些未知工具。所以,我開始研究如何在不損害帳戶安全的前提下做到這一點。

為iPhone充電開機後我發現WhatsApp無法正常工作,並出現了一個奇怪的消息提示Your phone date is inaccurate! Adjust your clock and try again(你的電話日期不準確!請調整你的時鐘並再次嘗試)。我不知道日期問題與啟動WhatsApp有什麼關係,但修復日期和時間並沒有解決這個問題,我閱讀了許多網上的解決方案似乎都是建議卸載重裝。但我不想冒這個險,因為在法庭上我需要這些信息作為證據。

第1步 – 從iPhone備份和解壓縮文件

此步驟更適用於Mac OS,儘管它在其他操作系統的工作方式類似。

1.創建虛擬機並在上面安裝iTunes。確保VM未連接到網絡。(如果你不知道如何創建VM,請參閱本文)。

2.將iPhone連接到VM。按照通常的步驟在VM上本地備份iPhone。對於那些對Mac感興趣的人,可以在該位置找到備份:~/Library/Application Support/MobileSync/Backup

備份格式描述請參閱此處。

3.在虛擬機中安裝iPhone備份提取工具(如iExplorer by Macroplant)。哪種工具不重要,因為它無法訪問互聯網,因此你的數據是安全的。

4.最後使用備份提取工具提取chatstorage.sqlite,這是主要的whatsapp會話數據庫。要訪問它你需要瀏覽到“App Group”→“group.net.whatsapp.WhatsApp.shared”

5.另外,你還可以通過提取文件夾來提取media:“App” → “net.whatsapp.WhatsApp” → “Library” → “Media”

從WhatsApp的備份數據庫中提取消息

第2步 – 連接到數據庫並閱讀消息表

WhatsApp似乎將所有對話存儲在了Sqlite DB中。作為第一步,讓我們嘗試使用sqlite3內置的python庫+Pandas來查看我們是否可以連接到數據庫並獲取表的列:

從WhatsApp的備份數據庫中提取消息

如你所見,有18張表。通過仔細觀察其中一個表引起了我的注意(即帶有你的消息的那個)似乎是ZWAMESSAGE。讓我們打開它:

從WhatsApp的備份數據庫中提取消息

可以看到該表中有34列:

從WhatsApp的備份數據庫中提取消息

讓我們看看我們有什麼。以下是我根據我在自己數據庫中的表中找到的數據和我的推論進行的分析:

1. Z_PK — seems like a serial number
2. Z_ENT to ZFILTEREDRECIPIENTCOUNT — seem less important
3. ZFLAGS — seems to indicate message state
4. ZGROUPEVENTTYPE — seems to be related to group chats
5. ZISFROMME — message is from me… it is 1 for messages sent by this user and 0 for messages received
6. ZMESSAGEERRORSTATUS to ZSPOTLIGHTSTATUS — seems like general statuses
7. ZSTARRED — did we star the message
8. ZCHATSESSION — unique identifier denoting a chat session
9. ZGROUPMEMBER — haven’t gotten to look at this one yet
10. ZLASTSESSION — last chat session? didn’t dig into it
11. ZMEDIAITEM — seems related to media item indexing, might be an identifier to one of the other tables
12. ZMESSAGEINFO and ZPARENTMESSAGE — seem simple enough to figure out from the names
13. ZMESSAGEDATE — message creation date probably (see date format discussion below)
14. ZSENTDATE — message sent date probably (see date format discussion below)
15. ZFROMJID — from who did we get it (if it is an incoming message)
16. ZMEDIASECTIONID — seems related to media storage for media messages, doesn’t show in messages without media
17. ZPHASH - hmmm... not sure
18. ZPUSHNAME — seems like the contact name on your phone
19. ZSTANZAID — some conversation / media id indicator. Format seems different in media messages and text messages
20. ZTEXT — message text
21. ZTOJID — to whom did we send it (if it is an outgoing message)

第3步 – 提取特定的對話

我們的基本目標是提取特定的對話或通信。因此,如果我們記住部分文本,我們可以按姓名或電話號碼搜索聯繫人,或者按消息搜索特定的對話,最終根據會話ID提取完整的對話。

但是,在我們做這些之前,我們應該先弄清楚如何將日期和時間轉換成人類可讀的格式。直覺上我假設zmessagedate是一個unix時間戳。所以我把它轉換成一個日期,這就是我得到的結果:

從WhatsApp的備份數據庫中提取消息

蘋果似乎以其無限獨特的智慧決定在iPhone上使用從1.1.2001開始的日期,所以讓我們看看如果我們將unix-time time0的偏移量添加到1.1.2001,會發生什麼情況:

從WhatsApp的備份數據庫中提取消息

這似乎解決了這個問題。在此過程中,我還向data-frame添加了一個日期索引,使其更易於使用。請注意,如果你從Android或其他操作系統導入,則可能不需要使用此日期轉換。

日期有了,現在我們可以開始提取對話了。首先,讓我們提取一個我們關心的對話,比如一個特定的號碼:

從WhatsApp的備份數據庫中提取消息

你應該注意到我創建的lambda用於搜索列。這裡有一個讓人失望的Python “Wat” moment ,因為False | None != None | False這是不合理的。無論如何,繼續看ZCHATSESSION列,我們會注意到在我的例子中,這個號碼的會話ID將是“104.0”(如果還有群組聊天,你可能會看到多個聊天會話ID)。所以下一步將是提取聊天會話中的所有消息。為此,讓我們為它和上面提到的其他搜索方法添加適當的訪問器(accessors):

從WhatsApp的備份數據庫中提取消息

現在,讓我們從聊天會話中獲取所有消息並顯示它們(啟用多行格式以查看所有文本):

第4部分 – 結束語及media提取的注意事項

媒體文件被存儲在步驟1中提到的文件夾中,子文件夾基於共享文件的聯繫人的電話號碼(以及表示組聊天的後綴?- 這是一個猜測)。每個電話號碼下的子文件夾似乎遵循與iTunes備份格式類似的邏輯,我懷疑消息表引用了媒體表中的鏈接,但我沒有花時間去實際驗證。最後一點要注意的是,一些文件夾還將包含一些thumb文件,這些文件實際上只是JPG文件(重命名即可正常打開)。

Jupyter notebook的代碼可以在Github上找到

我已從中刪除了個人信息,但代碼和示例完全相同。此外,notebook可能還包含了一些額外的信息。

最後,如果你有耐心並且找出了更多的信息或者對代碼有任何的改進建議,那麼歡迎你隨時在github上發送pull request!感謝閱讀!

*參考來源:medium,FB小編secist編譯,轉載自FreeBuf.COM

相關推薦

推薦中...