QQ2012本地聊天记录查看Msg2.0.db之算法 msg3.0.db文件查看器

(1)前面格式,以及逆向分析花的时间并不多,开始费神的第一个地方就是算法,核心算法,IDAF5神器如下,其实在OD内看到那个常量就知道是Tea算法了,与标准Tea算法的区别就在于循环由32轮,改为16轮。

(2)算法实现如下unsigned int QQ_Tea_Decrypt(unsigned int *datain, unsigned int*key, unsigned int *dataout){ unsigned int y =_byteswap_ulong(*datain); unsigned int z =_byteswap_ulong(*(datain +1)); unsigned int k[4] ={}; unsigned int key_tmp =0; int index = 0; unsigned int nRounds =0; do { key_tmp = _byteswap_ulong(*(key +nRounds)); index = nRounds++; k[index] = key_tmp; } while( nRounds <4);
unsigned int delta =0x61c88647; unsigned int sum =0xe3779b90; nRounds = 16; while( nRounds-- >0) { z -= ((y << 4) + k[2]) ^ (y + sum) ^ ((y>> 5) + k[3]); y -= ((z << 4) + k[0]) ^ (z + sum) ^ ((z>> 5) + k[1]); sum += delta; }
*dataout =_byteswap_ulong(y); *(dataout + 1) =_byteswap_ulong(z);
return z;}
(3)如果只是一个Tea循环循环就直接把数据解开了,腾讯工资也就不会那么高了,这里分析下发现,个人感觉可以理解为一个加强版的CBC模式(一开始会有一个偏移的处理需要注意下)算法主体流程图如下,数据以8字节为一组


(4)算法实现这里给出循环部分for(nRound = 0;nRound*8 < len;nRound++){ i = 0; while( i < 8) { dataout[i] = dataout[i] ^ buf[8 + i +nRound*8]; i++; }
result =QQ_Tea_Decrypt((unsigned int *)dataout, (unsigned int *)key,(unsigned int *)dataout);
i = 0; flag = 0; while( i < 8) { buf_out[i + nRound*8 + index] = dataout[i] ^buf[i + nRound*8]; if(buf_out[i + nRound*8 + index] == 0) { sign++; } i++; } if(flag>= 8) break;}
(4)前一步算法解密出的数据分为两种,一种为MSG开头的,包含有聊天内容,字体,大小等信息,如下07DAFE58 4D 53 47 00 00 00 00 00 FF FF FF FFFF FF FF FF MSG............07DAFE68 FF 40 00 00 FF 00 FF FF 08 00 FF FFFF FF FF FF ..............?07DAFE78 FF FF 49 00 00 46 00 54 44 01 01 0200 06 14 00 .......TD......07DAFE88 FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF ...............07DAFE98 FF FF FF FF 04 00 00 00 FF FF FF FF01 16 00 FF ...............07DAFEA8 FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF ...............07DAFEB8 FF FF FF FF FF 04 00 00 00 01 00 0000 01 09 00 ...............07DAFEC8 01 06 00 31 00 32 00 33 00 00 00 0000 00 00 00 .1.2.3........
另外一种是TD开头的,但这里依然是加密状态,还需要进行第二次解密,待解密的内容如下07FA9218 54 44 01 01 08 00 01 10 00 8D EF BCEF 8A EF 83 TD..嶏硷婏?07FA9228 EF 89 EF A2 EF 9C EF 88 EF 04 00 0000 00 00 00 飰铫餃飯?......07FA9238 00 06 16 00 8D E9 9E E9 BA E9 8C E987 E9 8D E9 ..嶉為洪岄囬嶉07FA9248 8C E9 9B E9 BC E9 80 E9 87 E9 04 0000 00 FF FF 岄涢奸€閲?...?07FA9258 FF FF 06 1A 00 81 E5 92 E5 B7 E5 80E5 86 E5 8C ?.佸掑峰€鍐鍖07FA9268 E5 80 E5 93 E5 80 E5 97 E5 B0 E5 8CE5 8B E5 04 鍊鍝鍊鍡灏鍖鍕?07FA9278 00 00 00 FF FF FF FF 08 22 00 AE DDA9 DD AF DD ...?X".┹07FA9288 8E DD B8 DD B3 DD B9 DD B8 DD AF DD8E DD B5 DD 庉篙齿馆篙庉递07FA9298 B2 DD AA DD 93 DD BC DD B0 DD B8 DD04 00 00 00 草撦驾拜篙...07FA92A8 FF FF FF FF 08 26 00 AA D9 AD D9 ABD9 8B D9 BC 厤儁&.嬞?07FA92B8 D9 BA D9 B0 D9 BC D9 AF D9 BC D9 ABD9 8A D9 B1 俸侔偌侬偌佾賷俦07FA92C8 D9 B6 D9 AE D9 97 D9 B8 D9 B4 D9 BCD9 04 00 00 俣佼贄俑俅偌?..07FA92D8 00 FF FF FF FF 08 0E 00 82 F1 85 F183 F1 A5 F1 .;傡k.傫咇凂ヱ07FA92E8 98 F1 9C F1 94 F1 22 00 00 00 FF FFFF FF FF FF 橊滖旕"...镙磔燧07FA92F8 FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF 钶蜉燧蜉钶磔漭07FA9308 FF FF FF FF FF FF FF FF FF FF FF FF06 0C 00 97 巛栎遢巛镙燧..?07FA9318 F3 84 F3 A7 F3 9A F3 9E F3 96 F3 0400 00 00 FF 髣螫髿鬄髺?...=07FA9328 FF FF FF 06 10 00 8B EF 98 EF A2 EF9C EF 88 EF ~Q.嬶橈滐堬07FA9338 BC EF 8A EF 9E EF 04 00 00 00 00 0000 00 00 00 硷婏烇.........
(5)TD开头的数据解密,调试QQ时,解密后的数据如下:07D3AE68 54 44 01 01 08 00 01 10 00 62 00 53 0065 00 6C TD..b.S.e.l07D3AE78 00 66 00 4D 00 73 00 67 0004 00 00 00 00 00 00.f.M.s.g.......07D3AE88 00 0616 00 64 00 77 00 53 00 65 00 6E 00 6400 ..d.w.S.e.n.d.07D3AE98 65 00 72 00 55 00 69 00 6E 0004 00 00 00 FF FFe.r.U.i.n....?07D3AEA8 FF FF 06 1A 00 64 00 77 0052 00 65 00 63 00 69 ?.d.w.R.e.c.i07D3AEB8 00 65 00 76 00 65 00 72 00 55 00 6900 6E 00 04.e.v.e.r.U.i.n.07D3AEC8 00 0000 FF FF FF FF 08 22 00 73 00 74 00 72 00...?X".s.t.r.07D3AED8 53 00 65 00 6E 00 64 00 65 00 72 0053 00 68 00 S.e.n.d.e.r.S.h.07D3AEE8 6F 00 77 00 4E 00 61 00 6D 00 65 0004 00 00 00 o.w.N.a.m.e....07D3AEF8 FF FF FF FF 08 26 00 73 00 74 0072 00 52 00 65 ~vx?&.s.t.r.R.e07D3AF08 00 63 00 69 00 65 00 76 00 65 00 7200 53 00 68 .c.i.e.v.e.r.S.h07D3AF18 00 6F 00 77 00 4E 00 61 00 6D 00 6500 04 00 00.o.w.N.a.m.e...07D3AF28 00 FFFF FF FF FF 08 0E 00 73 00 74 00 72 00 54 00.纘?.s.t.r.T.07D3AF38 69 00 6D 00 65 00 22 00 00 00 32 00 30 00 31 00i.m.e."...2.0.1.07D3AF48 32 00 2F 00 39 00 2F 00 33 00 30 0020 00 00 00 2./.9./.3.0. .9.07D3AF58 3A 00 34 00 38 00 3A 00 34 00 30 0006 0C 0064 :.4.8.:.4.0...d07D3AF68 00 77 00 54 00 69 00 6D 00 65 0004 00 00 00 50.w.T.i.m.e....P07D3AF78 67 a4 F8 06 10 00 64 00 77 004D 00 73 00 67 00 ~Q.d.w.M.s.g.07D3AF88 53 00 65 00 71 00 04 S.e.q.
查看解出来的明文数据,可以看出该数据存储的每一段格式为 数据标记+ 数据说明长度 + 数据说明 + 数据内容长度 + 数据内容
解密方式为 数据说明部位按字节取反 XOR 数据说明长度 ,如果该段数据标记为08(还有09等)则数据内容部位也按字节取反XOR 数据内容长度,数据标记 01,06等不需要再次处理数据内容部分
算法实现如下:
signed int __stdcall sub_300325F7(size_t nLen, char*pTDdata){unsigned __int16 type; // di@7unsigned __int16 nLenOfTitle; // cx@11char* pos = NULL; // esi@7char* pHeadOfTitle = NULL; // esi@11char* pLenOfContent; // ebx@12char* pHeadOfContent; // esi@16_BYTE bytmp; // al@13_BYTE byflag; // [sp+20h] [bp-10h]@10size_t nLena; // [sp+3Ch] [bp+Ch]@11size_t nLenb; // [sp+3Ch] [bp+Ch]@16size_t nLenc; // [sp+3Ch] [bp+Ch]@23size_t nCurLen = 0;size_t nLenOfContent = 0;signed int result; // eax@40
if ( pTDdata && nLen >= 4 ){if ( nLen >= 6 && *(_BYTE *)pTDdata == 0x54&& *(_BYTE *)(pTDdata + 1) == 0x44 && nLen - 4>= 2 ){type = *(_WORD *)(pTDdata + 4);pos = pTDdata + 6;nCurLen = nLen - 6;if ( (signed int)type <= 0 )return nLen - 6 != 0 ? 0xE0630004 : 0;while ( 1 ){if (nCurLen < 7)break;if (nCurLen < 1)break;byflag = *(_BYTE *)pos;pos = pos + 1;nCurLen = nCurLen - 1;if ( nCurLen < 2 )break;nLenOfTitle = *(_WORD *)pos;pHeadOfTitle = (pos + 2);nLena = nCurLen - 2;if (nLena < (unsigned int)nLenOfTitle + 4 )break;pLenOfContent = (pHeadOfTitle + nLenOfTitle);nLenOfContent = *(_DWORD *)pLenOfContent;
QQ2012本地聊天记录查看Msg2.0.db之算法 msg3.0.db文件查看器
if ( nLenOfContent + nLenOfTitle + 6> nCurLen)break;
bytmp = nLenOfTitle ^ HIBYTE(nLenOfTitle);if ( nLenOfTitle ){size_t i = 0;do{*((_BYTE *)pHeadOfTitle + i) = bytmp ^ ~*((_BYTE*)pHeadOfTitle + i);++i;}while ( i < nLenOfTitle );}nLenb =nLena - nLenOfTitle - 4;pHeadOfContent = pLenOfContent + 4;if ( nLenb < nLenOfContent )break;
if (byflag == 9 || byflag == 8 || byflag == 16){if ( nLenOfContent > 0 ){size_t i = 0;do{*(_BYTE *)(i + pHeadOfContent) = nLenOfContent ^ ~*(_BYTE *)(i+ pHeadOfContent);++i;}while ( i < nLenOfContent );}}nLenc = nLenb - nLenOfContent;nCurLen = nLenc;pos = nLenOfContent + pHeadOfContent;}}result = 0xE0630004u;}else{result = 0x80004005u;}return result;}
(6)至此所有的聊天记录数据解密算法都实现了,剩下就是确定QQ聊天记录文件的格式,读取出相关的加密数据解密后格式化输出。聊天记录的索引值,都在index.dat中,由索引值在content.dat可以找到该条聊记录,数据同样分为两部分,每一部分前都有该段数据的长度,按长度读取出来即可

00000000h:DE01000000000000E9030000FFFFFF FF ;?......?..=~.Q

00000010h: FF FF FFFF89000000017F6390598C798E;0>晑?...c怸寉?

00000020h:D3E7E2012432AF6D6587D792FC8E0F08;隅?$2痬e囎掽?.

00000030h:FB63830E3CF436E3DB0A06F628990FD5;鹀?

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/210424.html

更多阅读

QQ聊天记录在哪个文件夹里 手机聊天记录文件

QQ聊天记录在哪个文件夹里——简介有时候重装电脑,需要将自己重要的信息拷贝出来,或者是想查看自己保存的聊天记录,但却不知道在哪里,下面经验使用简单的方式 帮你找到聊天记录所在的位置,快速找出来。QQ聊天记录在哪个文件夹里——工具

微信的聊天记录怎么查询 微信聊天记录恢复器

微信的聊天记录怎么查询——简介微信是腾讯公司于2011年1月21日推出的一款通过网络快速发送语音短信、视频、图片和文字,支持多人群聊的手机聊天软件。微信的聊天记录都保存在手机本地存储卡中,查询方法简单方便,下面介绍一下查询方法

怎么保存qq聊天记录 保存qq聊天记录 iphone

怎么保存qq聊天记录——简介有时需要将QQ聊天记录保存下来,以便日后查看。下面就来看一下QQ聊天记录的具体保存方法。 怎么保存qq聊天记录——方法/步骤怎么保存qq聊天记录 1、打开QQ2013,点击“主面板”下方的“打开消息管理器”按

QQ文件里有Msg2.0.db .Msg3.0.db可以删除么 qq msg3.0.db 破解

QQ文件里有Msg2.0.db .Msg3.0.db可以删除么——简介打开电脑QQ的文件资料里见到Msg2.0.db Msg3.0.db,这文件很多是时候可以到2G 。Msg2.0.db.Msg3.0.db(可以删除)(删除文件会丢失QQ聊天记录,需谨慎)主要是记录“聊天内容”等的数据库文

电脑qq聊天记录在哪 qq聊天记录查看器app

电脑qq聊天记录在哪——简介QQ是我们每天都是用的聊天工具,是一种很方便的聊天工具,我们在聊天的时候会有很多的聊天记录,那么这些聊天记录都存放在什么地方呢?电脑qq聊天记录在哪——工具/原料电脑

声明:《QQ2012本地聊天记录查看Msg2.0.db之算法 msg3.0.db文件查看器》为网友纠结的偏执分享!如侵犯到您的合法权益请联系我们删除