首页
社区
课程
招聘
[原创][原创]微信系列研究之--------管库房的小丫鬟
发表于: 2015-5-22 08:06 25185

[原创][原创]微信系列研究之--------管库房的小丫鬟

2015-5-22 08:06
25185
 0x01 前言 
 
感谢大家的支持,我也没想到大家的热情这么高,兄弟我只好舍弃娇妻,早上五点爬起来给大家写文章了,还是基友有真爱!!!!:p论坛的人气还得靠大家踊跃回贴和发贴。 
前面发的关于微信的协议和加密算法的文章,后来我看到抽抽兄弟在《微电脑世界》2015年第2期发表了相应的文章,大家也可以看看,这样结合起来理解更好。

  0x02 研究思路 
 
1.  从互联网找以前关于微信的数据库加密的文章 
2.  从LOG中找到数据库的操作记录 从LIB中找到libkkdb.so,根据名字进行推测。 SqliteConnection.java -> NativeSetkey(libkkdb.so)
3.  分析SQLITE文件结构 。
4.   分析SQLCIPHER的源码,编写相应的解密复原程序。 

 0x03 加密及数据安全

 聊天记录保持在EnMicroMsg.db文件中  
 数据库加密机制
 
采用开源的SQLCIPHER   
加密子密钥生成 用户密钥+16位随机数 利用openssl kdf函数进行64000轮PBKDF分散 这样的好处是可以防止防止被字典攻击和已知明文攻击。
  
 加密算法 

  aes-256-cbc   
 主密钥 
 
hash(imei&uin).substring(0,7) 
这个研究来自一个老外在2013年对微信的一次安全分析 http://www.jinglingshu.org/?p=3035  
   
hmac密钥

16字节和0x3a异或 做和第一页的前十六字节的分散因子做 两轮分散   加密内容 第一页的前16字节为随机的16字节的SALT。 

HAMC的密钥由加密密钥及两轮PBKDF算法分散生成。

加密文件结构

每页1024字节,加密的密文内容为960字节。
每页最后的32字节为20字节的HMAC值和12字节的初始向量及补位。
第一页前16字节随机salt内容。  

密文解密举例:
sqlite3Codec: entered pgno=1, mode=3, page_sz=1024
cipher_ctx_key_derive: entered c_ctx->pass=xxxxxxx, c_ctx->pass_sz=7                 
ctx->kdf_salt=00A17CF8 ctx->kdf_salt_sz=16 c_ctx->kdf_iter=64000                 
ctx->hmac_kdf_salt=00A17D40, c_ctx->fast_kdf_iter=2 c_ctx->key_sz=32
cipher_ctx_key_derive: deriving key using full PBKDF2 with 64000 iterations
cipher_ctx_key_derive: deriving hmac key from encryption key using PBKDF2 with 2 iterations
sqlcipher_cipher_ctx_cmp: entered c1=00A17E00 c2=00A40E78
sqlcipher_cipher_ctx_copy: entered target=00A17E00, source=00A40E78
sqlite3Codec: switch mode=3 offset=16
codec_cipher:entered pgno=1, mode=0, size=960

codec_cipher: input page data(第一页的16字节以后内容)

00000: e7 ec 9e ee 54 81 c7 50 a4 bf 87 cb ac cc 2d 72
00010: b3 77 e2 7c ec 08 39 dc bd 32 7b 9c 43 21 24 d2
00020: f7 8a 7f d0 c2 17 67 0b c5 7a 06 fd b7 a4 d7 c0
00030: 8e bf a9 a5 bb b1 fc ec 29 2d dc 2a d2 4f 87 29
00040: d7 f0 62 c8 1c 14 94 aa 02 77 a5 2e 1c 84 db ee
00050: f1 58 5e d0 01 5b aa 21 86 59 ca 4b 8b b7 32 f8
00060: e9 4f 64 6b e1 ae ed 10 f8 87 7a cd 85 fc e6 b1
00070: d6 62 8b 96 a5 8c 52 ad bf 74 8b 98 42 21 1d 01
00080: fa 55 09 41 0f 8e 0d f9 20 0c 21 50 69 7a 2e 66
00090: 9a c1 2e ca 86 0e 0f bc a4 b2 49 de fc ff 33 fe
000a0: 2b 28 6f bb 3f 0f e6 1c ec c1 be aa c3 f9 af c7
000b0: 20 d2 d7 cb 72 98 bb 4c 65 51 d9 16 1f 77 37 41
000c0: 0e c7 97 28 82 ce 82 4b f1 5c 21 a7 f5 37 09 7a
000d0: 35 cf e7 f2 f0 40 26 6c 1e 62 83 44 10 b0 d2 be
000e0: e0 cd 0b 6d a7 eb 4e aa 60 c7 af a2 5f 16 43 65
000f0: 93 bb 9d 8e b2 3d fa 24 d7 91 24 07 71 0a aa 00
00100: bf f6 a7 77 91 1f 5d 56 c5 1e f6 52 ff ff 74 34
00110: c3 b1 96 79 cd 33 b2 40 44 7a 9d 10 59 1d 23 13
00120: 82 41 da 6f 6d 68 f4 76 a7 7d d7 ee e3 03 f3 d1
00130: 88 37 d6 ea 2f f6 1b 14 e2 68 7a 38 2a 28 09 f9
00140: 04 f0 bc 90 8f fa 17 59 d7 eb cd 82 a5 26 9a 0b
00150: 1d 93 68 94 83 1a a4 68 43 c6 08 af 7e 9f 66 be
00160: 79 8a 84 5f fb fe 43 2e 11 81 49 e4 48 76 30 c7
00170: 10 4e 27 e4 cc c0 ac 16 2c 91 66 af 20 63 22 bf
00180: ca 93 f8 1b eb 17 17 83 2f 47 21 f8 24 36 81 3d
00190: e2 95 8e ea 87 a9 83 38 ec 2e a1 e2 56 24 2e 31
001a0: 68 52 e3 f5 99 13 74 5a d7 e9 c7 8b 56 21 43 a7
001b0: 91 a8 4d a6 2b 25 36 12 d5 c4 68 44 a1 dc 21 d1
001c0: 12 1e b5 40 a7 68 64 86 73 26 e2 ba 16 38 c0 a5
001d0: 19 86 ce e7 76 34 65 16 26 7c 3f ee 91 ba cb 4f
001e0: e1 c1 c1 64 fc d2 c9 c5 3d cb 69 de bc 8b 10 8d
001f0: a9 ea 52 08 d7 b0 35 ec ca 52 13 0c e1 38 1f 77
00200: 17 af d6 e3 c1 eb 9d 9f c1 48 21 fb c5 4d c9 36
00210: 91 dd 78 bb 7c 21 99 22 a9 0c e5 c4 75 c3 96 61
00220: 3a b6 32 1d d0 b0 50 b4 2e 2c 13 47 66 1f 34 3d
00230: 0d be f3 63 9f 51 79 38 d7 dd 3e e3 90 f8 ed cb
00240: 37 43 ec 6c ca af 79 74 f2 06 6b 96 3f a0 7e 55
00250: 9b b9 e3 6f 90 6e ec 99 5c c2 ca 58 a7 60 74 8b
00260: 47 2b fd 4a 56 76 9c b6 64 e6 92 64 b8 54 d2 27
00270: 39 58 f7 9b 8b 81 a2 96 7e ca 2a dc 77 93 c7 47
00280: 5d c5 49 c7 a9 60 45 8e dd 1d 48 0a 47 fc ba 64
00290: 16 52 b0 b7 7c 4c f1 95 89 32 c5 03 47 25 9d ff
002a0: 81 c1 f3 2b aa 0b e7 5a 38 27 0f f2 32 cf 95 63
002b0: ae df 89 5b bc 1f 68 58 57 ae 37 92 a7 64 0b 7f
002c0: b1 46 b9 14 eb 31 d8 9a 20 b1 82 d3 d9 c6 88 24
002d0: 65 08 1d d2 54 94 60 98 a0 26 dc 6c da 71 d4 a6
002e0: bc 5e d5 57 a9 11 8f 9b 17 0e ac c7 77 a9 90 f4
002f0: e7 bd 02 6e df 6e 0e 98 7b 62 74 dc 5c b9 06 93
00300: 2d 93 8c b6 86 30 7e 12 ab a7 70 48 66 4d ff 2d
00310: a9 7c 56 ad 85 49 14 09 77 44 79 43 66 cc 2c fb
00320: 60 85 36 e1 7c de 58 e2 55 f4 7c e9 4b 4c 10 34
00330: 0a 51 a5 6d 2a 9a 85 fb fe e8 dc d6 90 48 16 de
00340: 0c 92 3c 68 18 ae 09 78 ec 42 6f 67 fc 09 53 62
00350: 18 72 6e 4f aa 67 17 52 9a 23 a5 c6 7f f4 be 35
00360: 7b be 4a 47 5e 38 a9 f2 b4 15 56 24 40 a1 2f f1
00370: 1b dc e2 bd ec f0 68 32 70 f8 6b 10 bf a6 c0 1d
00380: 00 92 fd f0 77 1a 5c f6 38 23 9b 86 61 10 33 e7
00390: f1 92 c5 27 1d 09 8f 5d f4 f4 83 f1 95 43 7f 49
003a0: 97 71 85 db 7a 13 9c 44 92 d0 a2 c6 b1 39 42 6d
003b0: ac 8b 61 64 49 10 a8 82 6f 3b 55 2e bb 13 1b 08
003c0: 00 46 f6 43 8d 84 10 67 e0 2a e4 c9 8f a2 89 2b
003d0: 81 9d c7 5a f3 2e 64 e2 69 97 e7 cb 94 1b fe 82
003e0: a3 4a ed c2 94 5c fe 39 1d 0c fc d8 fb 13 02 76
codec_cipher: comparing hmac on in=00A193C8 out=00A40E20 hmac_sz=20

解密后的页数据明文
codec_cipher: output page data
00000: 04 00 01 01 30 40 20 20 c9 15 cb e4 00 00 01 57
00010: 00 00 00 00 00 00 00 00 00 00 00 9c 00 00 00 04
00020: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00
00030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00040: 00 00 00 00 00 00 00 00 00 00 00 00 c9 15 cb e4
00050: 00 2d e6 00 05 00 00 00 31 02 ce 00 00 00 01 03
00060: 03 cb 03 c6 03 c1 03 bc 03 b7 03 b2 03 ad 03 a8
00070: 03 a3 03 9e 03 99 03 94 03 8f 03 8a 03 85 03 80
00080: 03 7b 03 76 03 71 03 6c 03 67 03 62 03 5d 03 58
00090: 03 53 03 4e 03 49 03 44 03 3f 03 3a 03 35 03 30
000a0: 03 2b 03 26 03 21 03 1c 03 16 03 10 03 0a 03 04
000b0: 02 fe 02 f8 02 f2 02 ec 02 e6 02 e0 02 da 02 d4
000c0: 02 ce 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00290: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002c0: 00 fb 81 4c 00 00 00 f4 81 47 00 00 00 ec 81 42
002d0: 00 00 00 e3 81 3b 00 00 00 d9 81 33 00 00 00 d0
002e0: 81 2a 00 00 00 c8 81 22 00 00 00 bf 81 1b 00 00
002f0: 00 b6 81 13 00 00 00 b3 81 0b 00 00 00 b1 81 09
00300: 00 00 00 ac 81 07 00 00 00 a5 81 03 00 00 00 9e
00310: 7d 00 00 00 99 77 00 00 00 94 73 00 00 00 8e 6f
00320: 00 00 00 8a 6a 00 00 00 86 68 00 00 00 83 64 00
00330: 00 00 7e 61 00 00 00 79 5d 00 00 00 75 5b 00 00
00340: 00 72 58 00 00 00 70 56 00 00 00 6b 53 00 00 00
00350: 66 50 00 00 00 5f 4c 00 00 00 5c 47 00 00 00 59
00360: 44 00 00 00 56 42 00 00 00 52 40 00 00 00 4d 3d
00370: 00 00 00 4a 39 00 00 00 46 37 00 00 00 41 35 00
00380: 00 00 3c 31 00 00 00 37 2c 00 00 00 30 27 00 00
00390: 00 2b 22 00 00 00 25 1f 00 00 00 20 1a 00 00 00
003a0: 18 15 00 00 00 15 0f 00 00 00 10 0c 00 00 00 0d
003b0: 07 00 00 00 0a 06 00 00 00 07 03 00 00 00 06 02
003c0: 00 46 f6 43 8d 84 10 67 e0 2a e4 c9 8f a2 89 2b
003d0: 81 9d c7 5a f3 2e 64 e2 69 97 e7 cb 94 1b fe 82
003e0: a3 4a ed c2 00 00 00 00 00 00 00 00 00 00 00 00

 
数据安全删除

secure_delete PRAGMA [database.]secure_delete=ON/OFF 设为ON时,删除的内容会用0来覆盖。缺省值由宏SQLITE_SECURE_DELETE 决定。那就是OFF了。 微信在libkkdb.so编译时默认secure_delete=ON 。
5.3以后增加了该安全措施。
 

 操作的原子性 
    
采用WAL机制   
WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;   如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。通过checkpoint,将WAL内容写入到数据库文件中
 
 0x04总结: 
 
1. 介绍了相应的SQLCIPHER的加密机制。
2. 微信的数据库主密钥容易受到攻击。不过前提是需要越过相应的权限后才能访问相应的数据库文件。
3. 是否考虑SQLLOG获取相应的数据库操作日志。

[课程]Android-CTF解题方法汇总!

收藏
免费 3
支持
分享
最新回复 (22)
雪    币: 739
活跃值: (1095)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
先留脚印了再看,呵呵
2015-5-22 08:09
0
雪    币: 225
活跃值: (173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看完留
2015-5-22 09:03
0
雪    币: 76
活跃值: (206)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
支持 30
2015-5-22 10:04
0
雪    币: 170
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
继续支持
2015-5-22 13:53
0
雪    币: 218
活跃值: (291)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
lz关于微信聊天记录解密想跟你交流一下,能否加下我QQ:407953188
2015-5-22 14:41
0
雪    币: 79
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
LZ辛苦了,思路值得学习了!!!
2015-5-22 15:09
0
雪    币: 71
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
支持楼主, 写的很好
2015-5-22 16:09
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可以在网页微信获取UIN也可以直接根据MicroMsg获得7位密匙。
enFavorite.db 收藏数据

EnMicroMsg.db 聊天记录 好友信息 个人资料 等等

聊天记录明文

SnsMicroMsg.db 朋友圈数据

表 snscomment 消息列表
表 snsinfo    朋友圈信息

字段含义

type 3 stype 2 评论加转发链接
type 4 stype 2 评论加转发链接 带来源
type 1 stype 2 文本加图片
type 2 stype 2 文本
type 15 stype 2 文本加视频

朋友圈内容经过编码。目前正在研究如何解码~感谢LZ!
2015-5-22 19:29
0
雪    币: 131
活跃值: (98)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
楼上分析的透彻啊
2015-5-25 11:20
0
雪    币: 1305
活跃值: (252)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
11
增加了sqlcipher 解密的例子和修改文中的错误。
2015-5-25 18:29
0
雪    币: 31
活跃值: (648)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
好东西,期待继续。
2015-5-26 09:04
0
雪    币: 5139
活跃值: (3249)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
13
现在看到密密麻麻的16进制就头疼,哎,看了一天,该下班了。
2015-5-26 18:16
0
雪    币: 2448
活跃值: (1575)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
这么前排?先mark一个。
2015-5-26 18:27
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我是来支持的,越来越深入,越来越看不懂...冏
2015-5-28 15:41
0
雪    币: 15
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
看不懂了……
2015-5-29 10:52
0
雪    币: 141
活跃值: (451)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这才是牛人哦
2015-6-14 17:13
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
思路很重要
2015-6-18 10:30
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
看不懂
但是还是顶一个
2015-6-18 16:29
0
雪    币: 23
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看了半天没看懂,解密数据库不是 md5(imei+uin) 取前面7位吗
2015-11-4 17:45
0
雪    币: 36
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
mark
2016-3-10 11:30
0
雪    币: 237
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
2016.3.10, 今天google放出android N, 然后libkkdb.so获取权限失败
2016-3-10 23:53
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
mark,支持楼主
2016-10-11 14:47
0
游客
登录 | 注册 方可回帖
返回
//