如何從WhatsApp的備份數(shù)據(jù)庫中提取消息,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
按需定制可以根據(jù)自己的需求進行定制,成都網(wǎng)站建設(shè)、網(wǎng)站制作構(gòu)思過程中功能建設(shè)理應(yīng)排到主要部位公司成都網(wǎng)站建設(shè)、網(wǎng)站制作的運用實際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實際意義
我將為大家介紹如何使用Python從WhatsApp恢復(fù)消息。并且我會著重解釋如何從WhatsApp的sqlite數(shù)據(jù)庫中查找和提取對話,并解析那里的字段和數(shù)據(jù)。這絕不是一項全面的逆向/取證分析的工作 - 我寫這篇文章的唯一原因是,目前我并沒有找到一個你可以信任的可用于此目的免費信息和/或開源工具。所以我想如果我能分享我所做的工作,那么將可以為他人節(jié)省一些時間。你可以使用與之相似的過程來分析其他的(messaging)應(yīng)用程序。
我將使用Jupyter Notebooks和Pandas,但幾乎所有代碼都可以獨立于Jupyter使用。用于從WhatsApp sqlite DB中提取消息的代碼(專為Jupyter notebook編寫),你可以在github獲取到。
由于房地產(chǎn)開發(fā)商的一些法律問題(有誠實的開發(fā)商嗎?)我需要從一個放在壁櫥里兩年的舊iPhone設(shè)備中恢復(fù)whatsApp信息。
我不是正常的iPhone用戶,所以我開始想辦法來做到這一點,我發(fā)現(xiàn)iCloud并沒有賦予訪問實際備份內(nèi)容的權(quán)限。不過這里有一些工具可以幫助你獲取登錄憑證,并允許你瀏覽完整的備份內(nèi)容,但是我不想將我(妻子)的登錄憑證透露給這些未知工具。所以,我開始研究如何在不損害帳戶安全的前提下做到這一點。
為iPhone充電開機后我發(fā)現(xiàn)WhatsApp無法正常工作,并出現(xiàn)了一個奇怪的消息提示Your phone date is inaccurate! Adjust your clock and try again(你的電話日期不準確!請調(diào)整你的時鐘并再次嘗試)。我不知道日期問題與啟動WhatsApp有什么關(guān)系,但修復(fù)日期和時間并沒有解決這個問題,我閱讀了許多網(wǎng)上的解決方案似乎都是建議卸載重裝。但我不想冒這個險,因為在法庭上我需要這些信息作為證據(jù)。
此步驟更適用于Mac OS,盡管它在其他操作系統(tǒng)的工作方式類似。
1.創(chuàng)建虛擬機并在上面安裝iTunes。確保VM未連接到網(wǎng)絡(luò)。(如果你不知道如何創(chuàng)建VM,請參閱本文)。
2.將iPhone連接到VM。按照通常的步驟在VM上本地備份iPhone。對于那些對Mac感興趣的人,可以在該位置找到備份:~/Library/Application Support/MobileSync/Backup
備份格式描述請參閱此處。
3.在虛擬機中安裝iPhone備份提取工具(如iExplorer by Macroplant)。哪種工具不重要,因為它無法訪問互聯(lián)網(wǎng),因此你的數(shù)據(jù)是安全的。
4.最后使用備份提取工具提取chatstorage.sqlite,這是主要的whatsapp會話數(shù)據(jù)庫。要訪問它你需要瀏覽到“App Group”→“group.net.whatsapp.WhatsApp.shared”
5.另外,你還可以通過提取文件夾來提取media:“App” → “net.whatsapp.WhatsApp” → “Library” → “Media”
WhatsApp似乎將所有對話存儲在了Sqlite DB中。作為第一步,讓我們嘗試使用sqlite3內(nèi)置的python庫+Pandas來查看我們是否可以連接到數(shù)據(jù)庫并獲取表的列:
如你所見,有18張表。通過仔細觀察其中一個表引起了我的注意(即帶有你的消息的那個)似乎是ZWAMESSAGE。讓我們打開它:
可以看到該表中有34列:
讓我們看看我們有什么。以下是我根據(jù)我在自己數(shù)據(jù)庫中的表中找到的數(shù)據(jù)和我的推論進行的分析:
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)
我們的基本目標是提取特定的對話或通信。因此,如果我們記住部分文本,我們可以按姓名或電話號碼搜索聯(lián)系人,或者按消息搜索特定的對話,最終根據(jù)會話ID提取完整的對話。
但是,在我們做這些之前,我們應(yīng)該先弄清楚如何將日期和時間轉(zhuǎn)換成人類可讀的格式。直覺上我假設(shè)zmessagedate是一個unix時間戳。所以我把它轉(zhuǎn)換成一個日期,這就是我得到的結(jié)果:
蘋果似乎以其無限獨特的智慧決定在iPhone上使用從1.1.2001開始的日期,所以讓我們看看如果我們將unix-time time0的偏移量添加到1.1.2001,會發(fā)生什么情況:
這似乎解決了這個問題。在此過程中,我還向data-frame添加了一個日期索引,使其更易于使用。請注意,如果你從Android或其他操作系統(tǒng)導(dǎo)入,則可能不需要使用此日期轉(zhuǎn)換。
日期有了,現(xiàn)在我們可以開始提取對話了。首先,讓我們提取一個我們關(guān)心的對話,比如一個特定的號碼:
你應(yīng)該注意到我創(chuàng)建的lambda用于搜索列。這里有一個讓人失望的Python “Wat” moment ,因為False | None != None | False這是不合理的。無論如何,繼續(xù)看ZCHATSESSION列,我們會注意到在我的例子中,這個號碼的會話ID將是“104.0”(如果還有群組聊天,你可能會看到多個聊天會話ID)。所以下一步將是提取聊天會話中的所有消息。為此,讓我們?yōu)樗蜕厦嫣岬降钠渌阉鞣椒ㄌ砑舆m當?shù)脑L問器(accessors):
現(xiàn)在,讓我們從聊天會話中獲取所有消息并顯示它們(啟用多行格式以查看所有文本):
媒體文件被存儲在步驟1中提到的文件夾中,子文件夾基于共享文件的聯(lián)系人的電話號碼(以及表示組聊天的后綴?- 這是一個猜測)。每個電話號碼下的子文件夾似乎遵循與iTunes備份格式類似的邏輯,我懷疑消息表引用了媒體表中的鏈接,但我沒有花時間去實際驗證。最后一點要注意的是,一些文件夾還將包含一些thumb文件,這些文件實際上只是JPG文件(重命名即可正常打開)。
Jupyter notebook的代碼可以在Github上找到
我已從中刪除了個人信息,但代碼和示例完全相同。此外,notebook可能還包含了一些額外的信息。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。