1.手机QQ
据说手机QQ2012之前都是明文的,这个没测试,不细说了,有兴趣的朋友自己搜索下。2012之后使用记录保存的sqliteDB内容加密,库没有设置密码,直接用sqliteadmin之类的软件打开之后可以看到一堆歪七扭八的字符。直接上关键,解密函数如下:
2013的最新版本的手机QQ数据库的表名调整为:mr_friend_MD5(QQ)_New ,比原来的多了一个_New。这里先讲解一下utf8编码,utf8的中文是3字节,之前的算法根据代码可以看出来,前两字节原封不对,只对最后一个字节进行疑惑。新版本的不在区分中文和英文,直接对每个字节进行疑惑加密。
//解密QQ加密字符串 //lpIn - 输入加密的数据缓冲区 从sqlite中getblob得到 //nLen - 输入缓冲区的长度 //key - 为手机串号字符串 //IsNew - 是否为新版本 默认不是 字段名末尾是否有_New ,有则传入TRUE, 没有空着即可。注意:仅限于新版本的聊天内容记录字段解密,字段名为msgData。 CString DecryptMobileQQBuffer(LPCSTR lpIn, int nLen, LPSTR lpKey, BOOL IsNew = FALSE) { CString strRet; int nKeyLen = strlen(lpKey); if (nLen > 0 && nKeyLen > 0) { char *pszTmp = new char[nLen + 2]; ZeroMemory(pszTmp, nLen + 2); int nDecode = 0; for (int i = 0; i < nLen; i++) { if (!IsNew && (BYTE)lpIn[i] >= 128) { pszTmp[i] = lpIn[i]; pszTmp[i + 1] = lpIn[i + 1]; i += 2; } pszTmp[i] = lpIn[i] ^ lpKey[nDecode++ % nKeyLen]; } strRet = pszTmp; delete pszTmp; }
return strRet; }
使用了15位的手机串号作为key,依次做异或运算。。。这个尿性,就算没有手机串号也能碰撞出来的。。。这个加密算是形式吧。。。。
注意:从字段里读取内容的时候要使用sqlite3_column_blob函数获取内容缓冲区,使用sqlite3_column_bytes获取出来缓冲区长度,因为使用sqlite3_column_text会有\0字符干扰导致数据不全;所有的中文使用utf8编码,需要转下。 |