A-A+

用Python解密手机QQ聊天记录

2015年05月26日 安全百科 暂无评论 阅读 949 次

文中提到的部分技术也许带有一定攻击性,请合法使用。

据说手机QQ 2012之后使用记录保存的sqliteDB内容加密,库没有设置密码,直接用sqliteadmin之类的软件打开之后可以看到一堆歪七扭八的字符。那么如何恢复和解密QQ聊天记录呢?

数据库在哪?

安卓在/data/data/com.tencent.qq/databases/你的QQ号.db,

IOS好像在/var/mobile/Applications/QQ/Documents/contents/你的QQ号/QQ.db未测试。所以说苹果需要越狱、安卓需要root。

怎么加密了?

sqlite数据库本身没有被加密可以直接用,但是一些敏感的数据部分被伟大的。。。异或加密了。比如分组名称(聊天记录更不用说了)。

然后就是:key哪里来的?

显然对于异或这种东东。。。可以很简单的直接用明文和密文推密码。比如:我把一个分组命名成aaaaaaaaaaaaaaaaaaaa。然后:

  1. import sqlite3
  2. conn = sqlite3.connect(;******.db;)
  3. cursor = conn.execute("SELECT *  from Groups ")
  4. print "select database successfully";
  5. for row in cursor:
  6.     a= row[4]
  7.     sbstr=;;
  8.     for i in range(0,len(a)):
  9.         sbstr+=unichrord(a[i])^ord(;a;))
  10.     print sbstr

果断发现和网上说的一样(别抽我)key是手机的IMEI(别问我如果是不支持移动数据的安卓pad key是啥)。

IMEI怎么获取?拨号键盘输入*#06#

聊天记录都在哪里?

每个聊天记录都存入了单独的数据表mr_friend_+MD5(好友QQ)+_New
其中msgData是聊天内容,senderuin是加密的发信者qq号。

解密聊天记录:

  1. # -*- coding: utf-8 -*-
  2. import struct
  3. import sqlite3
  4. IMEI=;***************;
  5. def check(thestr):
  6.     #print ;checking;
  7.     if  (len(thestr)==0):
  8.         return 0
  9.     i=0
  10.     while i<len(thestr):
  11.         if ord(thestr[i])^ord(IMEI[i%15])<=0x7f:
  12.             i=i+1
  13.             #print ;1;
  14.         elif (ord(thestr[i])^ord(IMEI[i%15])<=0xef) and (ord(thestr[i])^ord(IMEI[i%15])>=0xe0) :
  15.             i=i+3
  16.             #print ;3;
  17.         else :
  18.             return 0
  19.     return 1
  20. f2 = open(;rec1.tmp;,;wb;)
  21. conn = sqlite3.connect(;*********.db;)
  22. cursor = conn.execute("SELECT msgdata  from mr_friend_******************************_New ")
  23. print "select database successfully";
  24. for row in cursor:
  25.     a= row[0]
  26.     sbstr=;;
  27.     if check(a)or 1:
  28.         #if (ord(a[0])^ord(IMEI[0])<0xef)and(ord(a[0])^ord(IMEI[0])>0xe0):
  29.             for i in range(0,len(a)):
  30.                 sbstr+=unichr(ord(a[i])^ord(IMEI[i%15]))
  31.                 #f2.write(struct.pack(;B;,ord(a[i])^ord(IMEI[i%15])))
  32.                 f2.write(struct.pack(;B;,ord(a[i])^ord(IMEI[i%15])))
  33.             try:
  34.                  print sbstr
  35.             except UnicodeEncodeError:
  36.                  pass
  37.             f2.write(struct.pack(;B;,ord(;x0A;)))

然后发现utf8的3字节编码中文不能直接print出来求大神大腿。

但是winword还好很优秀的:

所以总算是可以看了,聊天记录的解密到此结束。

但是还有一些遗憾:

发送时间好像把12个数字压缩到10个数字了,我不知道怎么做的也解不开。

怎么处理3字节的中文啊print不出来伤不起。

不知那位大神有想法?

参考:http://www.fenlog.com/post/75.html

标签:
Copyright © 互联网世界 保留所有权利.   Powered by www.zhangjinpeng.com.cn 网站地图   粤ICP备13066957号-2  
内容说明:本站内容及数据部分来自互联网及公开渠道,如有侵权请及时联系我们,本站将在第一时间删除相关资源。

用户登录

分享到: