andriod开发如何获取安卓QQ中的好友信息
下面是恢复QQ好友的记录。本人使用的android手机。
准备部分:
第一步,获取手机 root 权限,并使用adb shell 导出 data/data/com.tencent.monileqq/databases/ 路径下的数据库。
第二步,找到该数据库下你自己QQ号码.db文件,容易知道,该文件是sqlite 数据库。
第三步,使用sqliteman 观察数据库的内容,发现内容为乱码。因sqlite数据库无加密功能,则可推得QQ利用软件将其中的内容加密。
第四步,面向谷歌编程,证实了微信和QQ使用的是sqlite数据库,并使用手机的IMEI码作为密钥,采用XOR加密,即异或加密其中的数据。
第五步,分析数据库的表,易知 friends表为好友关系数据,但并不清楚其中各键值含义,需要解密。
编程部分:
// 代码水平不高,100行左右用了4个小时,太丢人。
第一步,连接数据库,参考msdn [Microsoft.Data.Sqlite 概述]https://docs.microsoft.com/zh-cn/dotnet/standard/data/sqlite/?tabs=visual-studio 。
第二步,原计划解密所有表中的数据,利用的是select name from sqlite_master可以得到该数据库中所有表的表头,但无意义。(注:sqlite 数据库中sqlite_master 表存储了该数据库的所有表的名称)。
第三步,编写异或加密解密代码。参考了此处:https://www.programmingalgorithms.com/algorithm/xor-encryption/
简而言之,异或加密是将要加密的数据分块,并和密钥按位做异或运算运算,之后将其存储至数据库中。因为密钥是已知的,只需要将加密后的密文再和密钥做异或运算,就能够还原数据,该算法不涉及复杂的运算,开销不大,在保证速度的同时能够兼顾安全性,在手机这种移动平台比较适用。
第四步,利用sql语句获取数据库的内容,并解密数据,在解密数据之前,需使用isdbnull 判断所读出这一行的数据是否是空,因为SqlDataReader.getstring()方法无法读取空数据,须特别注意。因手机是双卡手机,有两个IMEI,尝试使用循环,两个IMEI都能够获得数据。
尾声,在读取完qq号,昵称和备注后,发现其有一个groupid的键值,观察表发现存在group表,并在其中存在group friend count,高度怀疑其为分组,尝试使用order by 进行排列,结果证明猜测正确。
本文地址:https://blog.csdn.net/xianyu199901/article/details/107724896