欢迎使用Bo-Blog。
提取TM2008接收到的表情(原创)

TM2008把接收到的自定义表情不是存放在一个文件夹中,而是放在一个文件里面。这个文件的位置在:我的文档\QQ Files\你的QQ号码\CustomFaceRecv.db,当然你自己的自定义表情就存在CustomFace.db里面。

我们的目的,就是把别人的变成我的,这个.db文件其实是一个复合文档。因此我写了个程序把里面的文件全部提取出来了。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <Unknwn.h>

int wmain(int argc, wchar_t** argv)
{
  HRESULT hr;
  IStorage* piStorage = NULL;
  IEnumSTATSTG* piEnumSTATSTG = NULL;
  STATSTG statstg;
  IStream* piStream = NULL;
  BYTE bBuffer[512];
  ULONG dwReaded;
  WCHAR wszExtractDir[MAX_PATH];
  WCHAR wszExtractPath[MAX_PATH];
  FILE* pFile = NULL;

  if (argc != 2)
      return 1;

  wcscpy(wszExtractDir, argv[1]);
  *(wcsrchr(wszExtractDir, L'\\')) = 0L;
  wcscat(wszExtractDir, L"\\Extracted");
  CreateDirectoryW(wszExtractDir, NULL);

  wcscat(wszExtractDir, L"\\");

  CoInitialize(NULL);

  hr = StgOpenStorageEx( argv[1],
                         STGM_READ | STGM_SHARE_DENY_WRITE,
                         STGFMT_ANY,
                         0,
                         NULL,
                         NULL,
                         IID_IStorage,
                         reinterpret_cast<void**>(&piStorage) );
  if (FAILED(hr))
      goto clean0;

  hr = piStorage->EnumElements(0, NULL, 0, &piEnumSTATSTG);
  if (FAILED(hr))
      goto clean0;

  hr = piEnumSTATSTG->Next(1, &statstg, NULL);
  while (S_OK == hr)
  {
      wprintf(L"%s\n", statstg.pwcsName);
      hr = piStorage->OpenStream( statstg.pwcsName,
                                  NULL,
                                  STGM_SHARE_EXCLUSIVE,
                                  0,
                                  &piStream );
      if (FAILED(hr))
          continue;

      wcscpy(wszExtractPath, wszExtractDir);
      wcscat(wszExtractPath, statstg.pwcsName);
      pFile = _wfopen(wszExtractPath, L"wb");
      if (pFile)
      {
          hr = piStream->Read(bBuffer, 512, &dwReaded);
          while (S_OK == hr && dwReaded)
          {
              fwrite(bBuffer, 1, dwReaded, pFile);

              hr = piStream->Read(bBuffer, 512, &dwReaded);
          }

          fclose(pFile);
          pFile = NULL;
      }

      piStream->Release();
      piStream = NULL;

      hr = piEnumSTATSTG->Next(1, &statstg, NULL);
  }

clean0:
  if (piEnumSTATSTG)
  {
      piEnumSTATSTG->Release();
      piEnumSTATSTG = NULL;
  }

  if (piStorage)
  {
      piStorage->Release();
      piStorage = NULL;
  }

  CoUninitialize();
}


编译后的文件下载
下载文件
点击这里下载文件

使用方法qq_db2dir.exe "D:\MyDoc\QQ Files\116454607\CustomFaceRecv.db"
解压出来的位置:D:\MyDoc\QQ Files\116454607\Extracted\

原文地址:http://www.shamuma.net/read.php?18
QQ聊天记录文件存储方式解密

最近花了几天时间跟踪了一下“QQ聊天记录查看器 5.3 华军版”,总算把聊天记录的存储方法弄清了。大家不要笑我,只是好奇而已,呵呵。

1.聊天记录存储方式

QQ聊天记录保存在MsgEx.db文件中。以前很早的版本是保存在Msg.db中,文件结构也与现在不同,我们就不分析了。

MsgEx.db采用Storage结构化存储。关于Storage复合文档的知识请查阅Microsoft相关文档,我们不做赘述。

大家可以用VC自带的DocFile View工具查看该文件的内容,可以看到文件结构大致如下:


|----MsgEx.db
|  |----C2CMsg
|    |----QQ号码
|      |----Data.msj
|      |----Index.msj
|  |----IMInfo
|    |----info.dat
|  |----Matrix
|    |----Matrix.db
|  |----SysMsg
|    |----10000
|      |----Data.msj
|      |----Index.msj
|  |----DiscMsg
|  |----GroupMsg
|  |----MobileMsg
|---------TempSessionMsg
 

消息内容都存储在每个号码下面的Data.msj中,通过Index.msj索引。消息内容是经过加密处理的,必须经过解密才能看到。

2.解密方法

消息内容采用BlowFish分组加密。每8个字节为一个分组。密钥Key通过QQ号码生成,具体算法稍后讨论。

解密方法:

a.取前8个字节,通过BlowFish解密, 得到decryptKey;

b.decryptKey与后面8个字节XOR,对结果再进行一次BlowFish解密;

c.将decryptKey与前8个字节XOR,得到第一组结果;

d.decryptKey与后面8个字节XOR,重复b,c两步;

e.最终全部数据解密完毕。

最后会剩下一组8字节无法解密,这个实际上是冗余数据,似乎是用来作为校验。

3.具体步骤

以上解密时,BlowFish的密钥是一个全局公用密钥Key。Key要通过QQ号码生成,具体步骤是:

a.将QQ号码进行MD5变换,得到Md5Key

b.取Matrix.db的数据,对其进行解码。简单说一下Matrix.db文件的结构:

Matrix.db采用分块存储,每个Record包含类型、名字长度、名字、内容长度、内容几个字段组成。用数据结构表示就是:


struct Record{
 char rType;
 short nLen;
 char Name[nLen];
 int rLen;
 char Content[rLen];
};
 

初始内容也是通过加密存储的。解密方法很简单:将长度的低位字节和高位字节XOR,得到key;将内容逐个与key进行XOR,就得到结果。对名字和内容分别进行解密即可。解密后会看到STL, TIP, CRK, CPH, CAH等字段,不清楚具体的啥含义,感兴趣的同学可以自己去研究研究。我们要用到的是CRK字段,长度为32字节(如果本地聊天记录加密,可能会有变化,没试过)。将得到的CRK字段作为pData。

c.用Md5Key对pData进行BlowFish解密,得到全局密钥Key

4.结论

以上讨论的都是本地聊天记录没有加密的情况。如果选择了加密,没有密码是肯定解不出来滴,大伙就不用费心了。

職人評價

[不指定 2007/12/18 20:11 | by MeteorRain ]
職人評價
來源2ch

2007/10/10(水)
■関東
3ZiwD6szha       画質S 技術A 拡散S 実績D 人気A ツンデレ職人
XP1dIgZwSI         画質A 技術A 拡散S 実績A 人気S 過大評価の超エース
Y3kDe5ew4c       画質A 技術B 拡散B 実績A 人気C PV3の申し子
GuyEAejW0o       画質A 技術B 拡散B 実績B 人気B Gyu氏
7JTMBVq5dh       画質A 技術B 拡散D 実績C 人気D 隠れた名エンコ師
92JeyRfcya         画質B 技術A 拡散S 実績S 人気S 安心と信頼の元エース
CFrgFJ3wPc       .画質B 技術E .拡散B 実績A 人気S 自演オブジイヤー
G1WrcQ3EnH        画質C 技術A 拡散B 実績A 人気B 次代のエース候補生
YS2YSUOe1cLtf    画質C 技術B 拡散S 実績B 人気S 速いという
iRD0v71Eup         画質C 技術D .拡散B 実績C 人気S (#)
BQO37fo3kI         画質C 技術B .拡散A 実績B 人気S 自演王子
mUgi4tyhZD       .画質C 技術B 拡散B 実績A 人気C 不屈の鉄人
ROMn6SXcn0       .画質C 技術C 拡散A 実績B 人気B 爆速エンコの後継者
JOROnpaEIh      .画質C 技術C 拡散B 実績B 人気B 咲き乱れる薔薇と百合
q7GuCmXnLk      .画質E 技術E .拡散D 実績E. 人気E キチガイ病棟48時

■関西
5vEoAyLhCo       画質S 技術S 拡散D 実績S 人気S 七色のコーデック使い
ovBmOjh6P4       画質A 技術B 拡散A 実績A 人気C Warpsharpの鬼
memjUtw8UL      .画質B 技術C 拡散B 実績S 人気C サイズ重視マスター
U2ROMqy24p        .画質C 技術B 拡散B 実績C 人気B 西の仕事人
ao67JiYGHk       画質C 技術C 拡散D 実績B 人気C CFの後継者
ZtLHFWR4KO       画質C 技術C 拡散B 実績C 人気C ?
d558jJoPJW        画質D 技術B 拡散B 実績C 人気C ?

■田舎
1rSPytiuzt          画質C 技術C 拡散B 実績B 人気S 病棟脱出後行方不明
9wlopfRc6n        画質D 技術B 拡散D 実績D 人気S 自称txt職人

==============================================================
2007-10-09
■関東
YS2YSUOe1cLtf    画質A 技術B 拡散S 実績A 人気S 爆速エンコ人
XP1dIgZwSI         画質S 技術A 拡散S 実績A 人気S 過大評価の超エース
3ZiwD6szha       画質S 技術A 拡散S 実績D 人気A ツンデレ職人
Y3kDe5ew4c       画質A 技術B 拡散B 実績A 人気C 
7JTMBVq5dh       画質A 技術B 拡散D 実績C 人気D 隠れた名エンコ師
92JeyRfcya         画質B 技術A 拡散S 実績S 人気S 安心と信頼の元エース
CFrgFJ3wPc       .画質B 技術E .拡散B 実績A 人気S 自演オブジイヤー
G1WrcQ3EnH        画質C 技術B 拡散B 実績A 人気B 次代のエース候補生
mUgi4tyhZD       .画質C 技術B 拡散B 実績A 人気C 不屈の鉄人
ion6NlC8Fx       .画質C 技術B 拡散B 実績C 人気C 期待の成長株
ROMn6SXcn0       .画質C 技術C 拡散A 実績B 人気B (旧)爆速エンコの後継者
JOROnpaEIh      .画質C 技術C 拡散B 実績B 人気B 咲き乱れる薔薇と百合
vni2VwGwwq      .画質C 技術C 拡散B 実績C 人気D レア物ハンター
cs5dxPQfWN      .画質C 技術C 拡散C 実績A 人気S アニメスレのヨン様
Kyo14MC2h7      画質D 技術C 拡散C 実績C 人気D 圧縮マニア
BQO37fo3kI         画質D 技術D .拡散A 実績B 人気S 自演王子
q7GuCmXnLk      .画質E 技術E .拡散D 実績E. 人気E キチガイ病棟48時
しゃなTvg1STVN6A   画質C 技術B 拡散C 実績B 人気S (#)
8e3WXRH1Y3     画質SS 技術SS 拡散SS 実績SS 人気A HDRECSの申し子
GuyEAejW0o      画質S 技術A 拡散A 実績S 人気S Gyu(by ((#) )

■関西
5vEoAyLhCo       画質S 技術S 拡散D 実績S 人気S 七色のコーデック使い
ovBmOjh6P4       画質A 技術B 拡散A 実績A 人気C Warpsharpの鬼
memjUtw8UL      .画質B 技術C 拡散B 実績S 人気C サイズ重視マスター
U2ROMqy24p        .画質C 技術B 拡散B 実績C 人気B 西の仕事人
ao67JiYGHk       画質C 技術C 拡散D 実績B 人気C CFの後継者
ZtLHFWR4KO       画質C 技術C 拡散B 実績C 人気C ?
d558jJoPJW        画質D 技術B 拡散B 実績C 人気C ?

DVD職人
IGASIOWRRO  画質A 拡散B 実績A 人気A 信頼度抜群(共同)
okidokeiTL           画質A 拡散A 実績B 人気B 打ち切りの実績A、完走しない、行方不明
q7GuCmXnLk   .画質B .拡散D 実績B. 人気E 地獄少女、関広明、不人気、イキロ
TALKca6VWU  画質B 拡散B 実績B 人気B TALK!
oppaipoj8r            .画質B .拡散B 実績C. 人気B Toheartj2
pcT6OjjAFE    画質C 拡散B 実績A 人気B 安心と信頼の( OwO )pcT(ピクト)!!
YUKKY1dzxv   画質D 拡散D 実績D 人気D ニート、魂のrev何度でも
ZOMBI08ifI    画質D 拡散A 実績A 人気A 唯一絶対にして不可侵の存在

2007/10/09(火) 01:02:21 ID:SKZSGlgo0
■関西
aaLPbRVQ8B      画質SSS 技術S 拡散S 実績S 人気S 終わらない夏休み
5vEoAyLhCo       画質SSSS 技術S 拡散D 実績S 人気S 七色のコーデック使い
memjUtw8UL      .画質B 技術B 拡散B 実績S 人気C TS抜きの先駆者
rTS5D56UkW        画質B 技術C 拡散C 実績C 人気B 嫉妬深き一匹狼
U2ROMqy24p        .画質C 技術B 拡散B 実績C 人気B 西の仕事人
ao67JiYGHk       画質C 技術C 拡散D 実績C 人気C ソース補完の神
DivX6x1OUM(ov)     画質A 技術B 拡散A 実績A 人気C Warpsharpと受信障害の鬼
HDMX58M0Uu     画質C 技術C 拡散A 実績C 人気B 大学受験勉強中
ZtLHFWR4KO     画質D 技術B 拡散C 実績B 人気A SDキャプの頂点に立った男

■不明
d558jJoPJW      画質S 技術S 拡散S 実績A 人気A 在住地域不明のmkvマニア

■田舎
9wlopfRc6n       画質D 技術C 拡散Z 実績D 人気S うどん
Galopin3BM3EISvpL   画質C 技術B 拡散B 実績B 人気C GV-D1VR使いのXviDマニア

2006/12/31(日)
aaLPbRVQ8B 画質S 技術S 拡散S 実績B DVDモノはお疲れ気味のエトワール
5vEoAyLhCo 画質S 技術S 拡散C 実績A Key原作アニメは俺にまかせろ
unkoaVInQ4 画質B 技術E 拡散B 実績A 自演オブジイヤー
TALKca6VWU 画質B 技術C 拡散B 実績S 唯一神タルク
YUKKY1dzxv 画質B 技術C 拡散C 実績C XviD大好き
WgPZCQtRPj 画質A 技術B 拡散D 実績C 眩惑のワグペ
YAyAoONEVq 画質C 技術C 拡散C 実績C 自貼りの夜々ちゃん
AstTd2C7Bk 画質A 技術A 拡散A 実績D Ast(笑)

StarSub SVN 26 SourceCode

[不指定 2007/02/05 22:47 | by MeteorRain ]
Tags:
点击在新窗口中浏览此图片
分页: 1/5 第一页 [1] [2] [3] [4] [5] 下页 最后页 [ 显示模式: 摘要 | 列表 ]