首页
社区
课程
招聘
[求助]安卓 QQ 聊天内容 解密
发表于: 2014-1-16 09:37 15294

[求助]安卓 QQ 聊天内容 解密

2014-1-16 09:37
15294
最近在解析安卓QQ聊天内容数据

根据apk反编译的jar文件和jdGUI查看

帐号昵称等字段使用xor异或IMEI运算都可以解出来

唯独聊天内容有点问题:中文解出来乱码 英文字符数字等能正常解析

请教大神们有无解决办法

(已使用sqlite getblob utf8方式读取二进制流)

========================================

以下为第一部解法和测试数据

//解密QQ加密字符串  key为15位手机串号字符串
char* DecryptMobileQQBuffer(LPCSTR lpIn, int nLen, LPSTR lpKey)

{

        char *pszTmp;

        if (nLen > 0)

        {

                pszTmp = new char[nLen + 2];

                ZeroMemory(pszTmp, nLen + 2);

                int nDecode = 0;

                for (int i = 0; i < nLen; i++)

                {

                        if ((BYTE)lpIn[i] >= 128)

                        {

                                pszTmp[i] = lpIn[i];

                                pszTmp[i + 1] = lpIn[i + 1];

                                i += 2;

                        }

                        char s = lpIn[i];
                        pszTmp[i] = s ^ lpKey[nDecode % 15];

                        nDecode++;

                }

        }

        return pszTmp;

}

二进制字节测试数据为:222,131,184,208,159,167,1,3,7  (明文为 测试123 一个汉字3字节)

                                  95,89,92,92    (明文为 good)  9,4,0(明文为123)

第二行为非中文测试数据  测试设备IMEI为 LPSTR lpKey = "863802014697382";

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我知道有人已经做出来了,什么QQ, 微信, 陌陌等安卓,如果只是编程揭秘,那没什么。如果是Hack,那有意思吗?
2014-1-16 10:11
0
雪    币: 98
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我贴的那段代码是老版本的了,新版本的手机QQ数据库的表名为:
mr_friend_MD5(QQ)_New ,比原来的多了一个_New。

这里先讲解一下utf8编码,utf8的中文是3字节,之前的算法根据代码可以看出来,前两字节原封不对,只对最后一个字节进行疑惑。新版本的不在区分中文和英文,直接对每个字节进行疑惑加密。

注意:仅限于新版本的聊天内容记录字段解密,字段名为msgData。

最后贴出来我修改后的代码段:

//解密QQ加密字符串
//lpIn - 输入加密的数据缓冲区 从sqlite中getblob得到
//nLen - 输入缓冲区的长度
//key - 为手机串号字符串
//IsNew - 是否为新版本 默认不是 字段名末尾是否有_New ,有则传入TRUE, 没有空着即可
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;
}
2014-1-16 10:28
0
雪    币: 208
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
思路是完美的,不过老版本的解密没考虑变长的问题,细节而已。
2014-3-3 09:10
0
雪    币: 20
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个好像在最新版的QQ4.6.1这个版本解密出来的还是乱码。
2014-3-3 18:58
0
雪    币: 208
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
4.6.1解密出来没有问题,看到的乱码应该是utf8和utf16的显示问题
2014-3-3 22:51
0
雪    币: 20
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
CString strRet;
        int nKeyLen = strlen(m_strIMEI);
        if (nLength > 0 && nKeyLen > 0)
        {
                char *pszTmp = new char[nLength + 2];
                ZeroMemory(pszTmp, nLength + 2);
                int nDecode = 0;
                for (int i = 0; i < nLength; i++)
                {
                        if ((BYTE)ch[i] >= 128)
                        {
                                chNew[i]=ch[i];
                                chNew[i+1]=ch[i+1];
                                i=i+2;
                        }
                        chNew[i] = ch[i] ^ m_strIMEI[nDecode++ % nKeyLen];

                        UTF8ToUTF16(chNew, chNew + sizeof(chNew), chNew16, chNew16+256);
                }
                strRet = chNew16;
                delete chNew16;
        }
       
  return strRet;

void UTF8ToUTF16(UTF8* pUTF8Start, UTF8* pUTF8End, UTF16* pUTF16Start, UTF16* pUTF16End)
{
    UTF16* pTempUTF16 = pUTF16Start;
    UTF8* pTempUTF8 = pUTF8Start;
    while (pTempUTF8 < pUTF8End && pTempUTF16+1 < pUTF16End)
    {
        if (*pTempUTF8 >= 0xE0 && *pTempUTF8 <= 0xEF)//是3个字节的格式
        {
            //0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
            *pTempUTF16 |= ((*pTempUTF8++ & 0xEF) << 12);
            *pTempUTF16 |= ((*pTempUTF8++ & 0x3F) << 6);
            *pTempUTF16 |= (*pTempUTF8++ & 0x3F);
        }
        else if (*pTempUTF8 >= 0xC0 && *pTempUTF8 <= 0xDF)//是2个字节的格式
        {
            //0080 - 07FF 110xxxxx 10xxxxxx
            *pTempUTF16 |= ((*pTempUTF8++ & 0x1F) << 6);
            *pTempUTF16 |= (*pTempUTF8++ & 0x3F);
        }
        else if(*pTempUTF8 >= 0 && *pTempUTF8 <= 0x7F)//是1个字节的格式
        {
            //0000 - 007F  0xxxxxxx
            *pTempUTF16 = *pTempUTF8++;
        }
        else
        {
            break;
        }
        pTempUTF16++;
    }
    *pTempUTF16 = 0;
}

解密出来还同样是乱码。
2014-3-4 14:02
0
雪    币: 20
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主有解密出来吗?解密出来了请分享一下。
2014-3-5 10:32
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
普通的文字内容好解,对于图片,或者图文混排这种的,解码规则是什么?
2017-12-12 14:14
0
雪    币: 5165
活跃值: (6785)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
可以看一下UTF-8编码规则,如果只考虑中文,有些特殊字符会出现程序异常,可以看一下我对UTF-8的帖子。
2017-12-12 14:31
0
游客
登录 | 注册 方可回帖
返回