1.手機QQ
據(jù)說手機QQ2012之前都是明文的,這個沒測試,不細說了,有興趣的朋友自己搜索下。2012之后使用記錄保存的sqliteDB內(nèi)容加密,庫沒有設(shè)置密碼,直接用sqliteadmin之類的軟件打開之后可以看到一堆歪七扭八的字符。直接上關(guān)鍵,解密函數(shù)如下:
2013的最新版本的手機QQ數(shù)據(jù)庫的表名調(diào)整為:mr_friend_MD5(QQ)_New ,比原來的多了一個_New。這里先講解一下utf8編碼,utf8的中文是3字節(jié),之前的算法根據(jù)代碼可以看出來,前兩字節(jié)原封不對,只對最后一個字節(jié)進行疑惑。新版本的不在區(qū)分中文和英文,直接對每個字節(jié)進行疑惑加密。
//解密QQ加密字符串 //lpIn - 輸入加密的數(shù)據(jù)緩沖區(qū) 從sqlite中g(shù)etblob得到 //nLen - 輸入緩沖區(qū)的長度 //key - 為手機串號字符串 //IsNew - 是否為新版本 默認不是 字段名末尾是否有_New ,有則傳入TRUE, 沒有空著即可。注意:僅限于新版本的聊天內(nèi)容記錄字段解密,字段名為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,依次做異或運算。。。這個尿性,就算沒有手機串號也能碰撞出來的。。。這個加密算是形式吧。。。。
注意:從字段里讀取內(nèi)容的時候要使用sqlite3_column_blob函數(shù)獲取內(nèi)容緩沖區(qū),使用sqlite3_column_bytes獲取出來緩沖區(qū)長度,因為使用sqlite3_column_text會有\(zhòng)0字符干擾導(dǎo)致數(shù)據(jù)不全;所有的中文使用utf8編碼,需要轉(zhuǎn)下。 |