解密聊天記錄數據庫

解密聊天記錄數據庫


微信6.2.5使用sqlcipher進行AES加密,所以咱們要獲得密鑰,根據編譯的信息,能夠得知微信使用 key=md5(IMEI+uin) | cut -c -7 , 即取md5的前7位作爲密鑰。解密微信聊天數據庫就是簡單的一行代碼,(注意sqlcipher新版本(3.x)默認不向下兼容,須要使用,cipher_use_hmac 是兼容1.1.x,kdf_iter 是兼容2.1.x的)。html

1java

2android

3git

4github

5web

sqlcipher EnMicroMsg.db 'PRAGMA key = "key"; PRAGMA cipher_use_hmac = off; PRAGMA kdf_iter = 4000; ATTACH DATABASE "decrypted_database.db" AS decrypted_database KEY "";SELECT sqlcipher_export("decrypted_database");DETACH DATABASE decrypted_database;'sql

 

或者數據庫

 

sqlcipher EnMicroMsg.db 'PRAGMA key = "key"; PRAGMA cipher_migrate; ATTACH DATABASE "decrypted_database.db" AS decrypted_database KEY "";SELECT sqlcipher_export("decrypted_database");DETACH DATABASE decrypted_database;'api

IMEI很容易獲取,uin在shared_prefs/多個文件中存在,如com.tencent.mm_preferences.xml,auth_info_key_prefs.xml, system_config_prefs.xml。理論上是在system_config_prefs.xml文件中的default_uin,注意有多是負的,以前我沒有意識到這個問題,致使一直解碼不成功,直到看了這個博客。ps. 負數是由於溢出int32(2639833126) = -1655134170 。微信

 

這方面已經很人作了,好比github上的wechat-dump,效果仍是能夠的,稍微有點問題,往後再改。

往後改了一些東西,最重要的是微信的頭像文件再也不單一保存,而是用 avatar.index 來索引,保存在一個大文件中avatar.block.0000x。經測試,能夠得知用戶頭像以avatar.index中的數值爲起始位置,找到avatar.block.0000x相應連續的96×96×3×4個連續字節就算用戶頭像的bitmap(png.bm)。具體見代碼

get avatar

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

    def read_bm_block(self, pos):

        hex_pos = hex(pos)

        fname = os.path.join(self.avt_dir,

                'avatar.block.0000' + hex_pos[2])

        f = open(fname, 'rb')

        start_pos = pos - 2 ** 34

        f.seek(start_pos+30)

        while f.read(1) != b"\x00":

            continue

 

        size = (96, 96, 3)

        img = np.zeros(size, dtype='uint8')

        for i in range(96):

            for j in range(96):

                r, g, b, a = map(ord, f.read(4))

                img[i,j] = (r, g, b)

        return img

 

 

 

相關文章
相關標籤/搜索